Вращение камеры вокруг точки на плоскости XZ в OpenGL - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь реализовать камеру в OpenGL, которая может двигаться и вращаться. Я бы хотел, чтобы камера вращалась вокруг точки в плоскости XZ (Y вверх), на которую в данный момент смотрит камера (то есть пересечение плоскости XZ и направления камеры). Каков наилучший способ добиться этого?

1 Ответ

0 голосов
/ 17 марта 2020

Допустим, вы хотите повернуть камеру вокруг точки P(x, 0, z) на плоскости XZ

Один из способов сделать это - вызвать glRotatef(theta, px, py, pz), который умножит вашу текущую матрицу на матрицу вращения ( вращение на theta углов вокруг вектора (px, py, pz))

Поскольку вы хотите вращаться вокруг произвольной точки, а не начала координат, вам нужно сначала перевести оси:

glTranslatef(x, 0, z);
glRotatef(thetax, 1, 0, 0);
glRotatef(thetay, 0, 1, 0);
glRotatef(thetaz, 0, 0, 1);
glTranslatef(-x, 0, -z);

В качестве альтернативы, вы можете использовать gluLookAt(cx, cy, cz, px, py, pz, ux, uy, uz), который создает матрицу вида для камеры на (cx, cy, cz), которая смотрит на (px, py, pz), где (ux, uy, uz) - это вектор, указывающий "вверх" (поворот камеры)

Полагаю, вы хотите, чтобы расстояние от вашей камеры до вашей точки оставалось неизменным c, поэтому было бы удобно express координаты вашей камеры в сферической системе координат

x = rsin(θ)cos(φ)

y = rsin(θ)sin(φ)

z = rcos(θ)

...