Как повернуть, а затем двигаться в этом направлении? - PullRequest
4 голосов
/ 26 ноября 2010

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

5 голосов
/ 28 ноября 2010

Это требует немного математики ...

С учетом этих функций операция довольно проста:

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);

И это должно сделать это. Keep Coding:)

1 голос
/ 27 ноября 2010

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) означает, что камера перевернута, а другие векторы определяют промежуточные положения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...