2010-11-26 3 views
4

Hy, 저는 현재 일인칭 게임을하려고합니다. 내가 할 수 있었던 것은 카메라가 glLookAt() 함수를 사용하여 이동하고 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); 
+1

이 웹 사이트는보다 유용 할 수 있습니다. http://gamedev.stackexchange.com/ –

답변

5

... 이러한 기능을 감안할 때

작업이 비록 매우 간단하다 :

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

d 그렇게해야합니다. 코딩 유지 :)

1

gluLookAt가 정의 :

void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, 
       GLdouble centerX, GLdouble centerY, GLdouble centerZ, 
       GLdouble upX, GLdouble upY, GLdouble upZ 
      ); 

카메라가 eye 위치에와 centereye에서 방향을 찾고이 내 코드입니다.

eyecenter은 함께 카메라의 축 (방향)을 정의하고, 세 번째 벡터 up은이 축을 중심으로 한 회전을 정의합니다.

별도의 phi 및 쎄타 회전이 필요하지 않으므로 올바른 회전을 얻으려면 올바른 up 벡터를 전달하십시오. (0,1,0)은 카메라가 위를 향한 것을 의미하고, (0,-1,0)은 카메라가 거꾸로되어 있고 다른 벡터가 중간 위치를 정의한다는 것을 의미합니다.

이 벡터 수학의 비트가 필요
+0

코드에서 동일하지 않으므로주의 깊게 보면 'centerZ'에서 10을 뺍니다. – ybungalobill

+0

@ybungalobill : 고마워, 그 부분을 제거했습니다. – casablanca

관련 문제