2014-09-14 3 views
0

그래서 벡터와 gluLookAt를 사용하여 자유 비행 카메라를 거의 구현했습니다.
모든 4 방향으로의 이동과 Y 축 주위의 회전이 정상적으로 작동합니다.자유 비행 카메라 - X 축을 중심으로 한 이상한 회전

는 Y 축 주위 회전 I는 눈 중심 벡터 사이의 벡터를 계산하고, 다음과 같이 회전 행렬과 회전 :

 Vector temp = vecmath.vector(center.x() - eye.x(), 
        center.y() - eye.y(), center.z() - eye.z()); 

    float vecX = (temp.x()*(float) Math.cos(-turnSpeed)) + (temp.z()* (float)Math.sin(-turnSpeed)); 
    float vecY = temp.y(); 
    float vecZ = (temp.x()*(float) -Math.sin(-turnSpeed))+ (temp.z()*(float)Math.cos(-turnSpeed)); 

    center = vecmath.vector(vecX, vecY, vecZ); 

I 막에 중심을 설정 끝에 새로 계산 된 벡터.
축에 대해 동일한 작업을 수행하려고하면 벡터가 회전하지만 매우 이상한 방식으로 물결 모양의 선으로 움직입니다.

 Vector temp = vecmath.vector(center.x() - eye.x(), 
          center.y() - eye.y(), center.z() - eye.z()); 

    float vecX = temp.x(); 
    float vecY = (temp.y()*(float) Math.cos(turnSpeed)) + (temp.z()* (float)-Math.sin(turnSpeed)); 
    float vecZ = (temp.y()*(float) Math.sin(turnSpeed)) + (temp.z()*(float)Math.cos(turnSpeed)); 

    center = vecmath.vector(vecX, vecY, vecZ); 

을 왜이 작동하지 않습니다
난 그냥 X의 회전 행렬로, 이전 회전과 같은 논리를 사용? 어쩌면 내가 다른 곳에서 뭔가 잘못한 것일까 요?

+0

대부분의 1 인칭 게임 에서처럼 카메라 이동 작업을하려고합니까? 즉 상향 벡터는 항상 월드 공간에서 '상향'을 가리 킵니까? – bofjas

+0

@bofjas FPS 카메라처럼 좋지만 더 많이, 너무 날아 가야합니다. 오 ... 카메라가 약간 위쪽을 가리키면 이미 벡터가 왜곡됩니까? 맞아 .... 더 이상 위쪽으로 가리키고 있지 않아, 그래서 나는 그 위 벡터도 계산해야만 해? –

답변

1

당신이 직면하고있는 문제는 처음으로 카메라 움직임을 구현하려고 할 때 문제가있는 것과 똑같습니다. 문제는 처음에 X 축을 똑바로 내려다보고 X 축을 중심으로 회전하여 카메라를 "기울"려고하면 실제로 보는 방향으로 실제로 회전하기 때문에 문제가 발생합니다.

카메라 이동을 처리하는 가장 좋은 방법은 각도를 별도의 변수에 축적하고 매번 원점에서 완전히 회전시키는 것입니다. 이렇게하면 먼저 X 축을 중심으로 회전 한 다음 Y 축을 중심으로 회전하여 "기울이기"할 수 있습니다. 이 순서로 수행하면 기울이기가 항상 카메라를 기준으로 올바른 축을 중심으로 이루어 지도록합니다. 다음과 같은 내용이 있습니다.

구문이 완전히 올바른지 나는 알 수 없습니다. 잠시 동안 java에서 프로그래밍하지 않았습니다.

+0

와우 당신은 최고입니다, 완벽하게 작동합니다! 그러나 나는 수학에서 그다지 좋지 않기 때문에 완전한 논리를 완전히 이해하지 못한다고 생각합니다. 아마 이것에 대해 읽은 기사 나 튜토리얼이있을 것입니다. 나는 이것을 이해하고 싶다. –

+1

불행히도 특정 링크가 없습니다. 나는 그것들이 불분명하다면 코사인 (cos)과 죄 (sin)를 읽는 것이 좋습니다. 하지만 기본적으로 회전하지 않는 카메라는 중심에서 z 방향으로 똑바로 나옵니다. 우리가 기울일 때 z 축에서 점점 더 90도까지 도달하고 z 축에 0.0이 남아있을 때까지 y로 이동합니다. 이것이 처음 세 줄로 우리가하고있는 일입니다. 그 후에 방금 생성 한 벡터의 z 구성 요소와 똑같은 작업을 수행합니다. 우리가 Y 축을 중심으로 회전하기 때문에 y 구성 요소는 수정되지 않습니다. 코멘트에서 설명하기가 어렵습니다. 행운을 빌어 요! – bofjas

+0

흠, 설명해 주셔서 감사합니다. 제 생각에 저는이 사실을 지금 조금은 이해하고 있다고 생각합니다. 하지만 지금은 그 회전에 약간의 문제가 있습니다. 처음으로 회전 할 때 벡터 나 다른 것들을 회전 시키므로 E 나 Q를 잡고 이전보기로 되돌려 야합니다. 그리고 Y 회전으로 시작하지 않고 X 회전으로 시작해야합니다. 순서를 뒤집 으면 UP 버튼이 DOWN 등이됩니다. 그러나 Y 회전으로 시작하면 X 회전이 정상적으로 작동합니다. 아마 어떤 방법으로 뷰를 초기화하여 이미 회전 시켰고 뷰가 정상적으로 보이도록 조정할 수 있습니까? –

관련 문제