Как повернуть, а затем двигаться в этом направлении?
Хы, я сейчас пытаюсь сделать игру от первого лица. То, что я смог сделать, это заставить камеру двигаться с помощью функции gluLookAt() и повернуть ее с помощью glRotatef(). Я пытаюсь повернуть камеру камера, а затем двигайтесь вперед в направлении, в котором я вращался, но оси остаются прежними, и, хотя я повернулся, камера движется вбок, а не вперед. Кто-нибудь может мне помочь? это мой код:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(cameraPhi,1,0,0);
glRotatef(cameraTheta,0,1,0);
gluLookAt(move_camera.x,move_camera.y,move_camera.z,move_camera.x,move_camera.y,move_camera.z-10,0,1,0);
drawSkybox2d(treeTexture);
2 ответа
Это требует немного векторной математики...
Учитывая эти функции, операция довольно проста:
vec rotx(vec v, double a)
{
return vec(v.x, v.y*cos(a) - v.z*sin(a), v.y*sin(a) + v.z*cos(a));
}
vec roty(vec v, double a)
{
return vec(v.x*cos(a) + v.z*sin(a), v.y, -v.x*sin(a) + v.z*cos(a));
}
vec rotz(vec v, double a)
{
return vec(v.x*cos(a) - v.y*sin(a), v.x*sin(a) + v.y*cos(a), v.z);
}
Предполагая, что у вас есть вектор ориентации, определенный как {CameraPhi, CameraTheta, 0.0}, затем, если вы хотите переместить камеру в направлении вектора v относительно оси камеры, вы добавляете это к положению камеры p:
p += v.x*roty(rotx(vec(1.0, 0.0, 0.0), CameraPhi), CameraTheta) +
v.y*roty(rotx(vec(0.0, 1.0, 0.0), CameraPhi), CameraTheta) +
v.z*roty(rotx(vec(0.0, 0.0, 1.0), CameraPhi), CameraTheta);
И это должно сделать это. Продолжайте кодировать:)
gluLookAt
определяется следующим образом:
void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ,
GLdouble centerX, GLdouble centerY, GLdouble centerZ,
GLdouble upX, GLdouble upY, GLdouble upZ
);
Камера расположена на eye
положение и глядя в направлении от eye
к center
,
eye
а также center
вместе определяем ось (направление) камеры и третий вектор up
определяет вращение вокруг этой оси.
Вам не нужны отдельные вращения phi и theta, просто введите правильное up
вектор, чтобы получить желаемое вращение. (0,1,0)
означает, что камера в вертикальном положении, (0,-1,0)
означает, что камера перевернута, а другие векторы определяют промежуточные положения.