Как повернуть, а затем двигаться в этом направлении?

Хы, я сейчас пытаюсь сделать игру от первого лица. То, что я смог сделать, это заставить камеру двигаться с помощью функции 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) означает, что камера перевернута, а другие векторы определяют промежуточные положения.

Другие вопросы по тегам