Допустим, вы хотите повернуть камеру вокруг точки 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(θ)