2012-12-29 2 views
2

최근에 완료 한 OpenGL 프로그램에 "카메라"가 있습니다. 그러나 회전하고 다시 움직일 때마다 x, y 및 z 각이 변경된다는 것을 알았습니다. 예를 들어 "w"키를 누르면 "z"축을 따라 앞으로 이동합니다. 그런 다음 카메라를 90도 회전하면 "W"키를 누르면 실제로 "x"축을 따라 오른쪽으로 이동합니다. 왜 이런 일이 일어나는지 이해가됩니다. 왜 그런 일이 일어 났는지 궁금합니다.OpenGL 1 인칭 카메라 위치 문제

private void camera() { 
    glRotatef(xrot, 1.0f, 0.0f, 0.0f); 
    glRotatef(yrot, 0.0f, 1.0f, 0.0f); 
} 

키보드 기능 : 다음은 회전 기능의

if (Keyboard.isKeyDown(Keyboard.KEY_D)) { 
     xpos -= 0.035 * delta; 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_A)) { 
     xpos += 0.035 * delta; 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_W)) { 
     zpos += 0.03f * delta; 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_S)) { 
     zpos -= 0.035 * delta; 
    } 
if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { 
     xrot += 0.035; 
     if (xrot > 360) { 
      xrot -= 360; 
     } 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { 
     xrot -= 0.035; 
     if (xrot > 360) { 
      xrot += 360; 
     } 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { 
     yrot += 0.035; 
     if (xrot > 360) { 
      xrot -= 360; 
     } 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { 
     yrot -= 0.035; 
     if (xrot > 360) { 
      xrot += 360; 
     } 

    } 

그리고 내 기능 번역 :이 문제를 해결하는 방법에 대한

 glTranslated(xpos, ypos, zpos - 30); 

어떤 아이디어?

답변

2

카메라가 가리키는 곳을 기준으로 이동할 것으로 예상됩니다. 즉, 해당되는 경우 x, y 및 z 위치에 델타를 추가하는 것입니다. 당신은 오일러 각 (xrot, yrot)에서 카메라 viewMatrix를 계산 한 다행히도

는, 회전 행렬 추가 정확하게 값을 포함합니다 : '-'

[rx ux fx - ] 
[ry uy fy - ] = viewMatrix 
[rz uz fz - ] 
[ - - - - ] 

을 표시 요소를 무시, 당신은 추가해야 위/아래로 움직일 때 "위로"벡터 = (ux, uy, uz)와 앞 벡터 (fx, fy, fz)를 이동할 때 오른쪽/왼쪽으로 이동할 때 "오른쪽"열 벡터 = (rx, ry, rz) 앞/뒤로 움직일 때.

고도가 변경되지 않은 경우 ry, uy, fy 구성 요소는 무시하지만 나머지 두 구성 요소를 표준화 할 준비를하십시오.