단순히 Pitch() 및 Yaw()를 호출하면 어떻게 카메라가 결국 Roll()이 될 수 있습니까?

StackOverflow https://stackoverflow.com/questions/784445

  •  16-09-2019
  •  | 
  •  

문제

저는 기본적인 OpenGL 게임을 코딩하고 있으며 카메라 이동과 관련하여 마우스를 처리하는 코드를 가지고 있습니다.

나는 다음 방법을 사용하고 있습니다 :

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

그러나 원을 둘러보면 카메라가 "롤"(회전)하기 시작하는 것을 알 수 있습니다.저는 Pitch와 Yaw만 호출하고 있기 때문에 이것이 어떻게 가능한지 모르겠습니다.

Camera 클래스에 사용하는 코드는 다음과 같습니다. http://pastebin.com/m20d2b01e

내가 아는 한, 내 카메라의 "롤링"은 발생해서는 안 됩니다.단순히 위아래로 움직이거나 왼쪽과 오른쪽으로 요잉해야 합니다.굴리지 마세요.

이 문제의 원인은 무엇입니까?

도움이 되었습니까?

해결책

축하합니다 - 당신은 거짓말 그룹 이론을 발견했습니다!

예, 가능합니다. 일련의 변환의 결과는 그들이 실행 된 순서에 따라 다릅니다. 피치를 한 다음 yaw를 수행하는 것은 요를하는 것과 같지 않으며 피치가 뒤 따릅니다. 실제로, 무한한 작은 요과 피치의 한계에서, 차이는 순수한 롤에 해당한다. 일반적인 경우는 조금 더 복잡합니다.

(물리학 자들은 이것을 "회전 그룹의 정류 관계"라고 부릅니다.)

회전 행렬에 익숙하다면 아주 쉽게 해결할 수 있습니다.

다른 팁

당신은 아마도 사용해야 할 것입니다 쿼터니언 회전을 작성하기 위해서는 아직 그렇게하지 않은 경우. 이것은 문제를 피합니다 짐벌 잠금 3 축 주위의 회전으로 카메라를 배향 할 때 얻을 수 있습니다.

그들 사이에서 변환하는 방법은 다음과 같습니다.

글쎄요, 수평선에 수평으로 전방을 바라보면서 시작하여 위로 90도 각도를 맞춘 다음 요를 왼쪽으로 90도 각도로 기울인 다음 아래로 90도 각도로 기울이면 시작했던 방향과 같은 방향을 바라보게 되지만 지평선은 수직이 됩니다( 마치 왼쪽으로 90도 회전한 것처럼).

편집하다:문제는 카메라를 비행기처럼 취급한다면 요(yaw)/피치(pitch)/롤(roll)이 적절할 것이라는 점이라고 생각합니다.아마도 당신이 원하는 것은 이를 구의 한 점처럼 취급하여 구에서 카메라가 가리키는 위치를 추적하는 것입니다.요/피치 대신 세타(위도)와 파이(경도)를 추적하는 구형 좌표를 사용합니다.비슷하게 들릴 수도 있지만 카메라가 바로 위를 향하고 있는 극단적인 경우를 생각해 보세요.요/피치를 사용하면 직선 방향에서 요와 피치를 자유롭게 조정할 수 있습니다.세타/파이를 사용하면 세타를 아래쪽으로만 조정할 수 있으며, 파이를 아무리 조정하더라도 세타를 줄이면 여전히 수평선과 평행한 카메라가 됩니다.이것이 FPS 카메라의 작동 방식입니다(뒤를 보고 있을 정도로 멀리 볼 수는 없습니다).

편집 2:연결한 카메라 코드를 보면 rotLati(float angle) 그리고 rotLongi(float angle) 기능.

수학적으로 그 이유는 3D 공간의 회전이 출퇴근하지 않기 때문입니다. 그 의미는 pitch () 뒤에 yaw ()가 yaw ()와 피치 ()와 같지 않지만 그 사실의 결과는 세 종류의 회전이 불가분의 관계가 있고 어떤 일이없고, 당신은 어떤 일도 실시 할 수 없다는 것입니다. 그중 두 명은 세 번째 중 일부를 얻지 못했습니다. 다시 말해, 모든 Pitch () es 및 yaw () s 시퀀스는 시퀀스의 후반이 전반전의 정확한 반대가 아니라면 시간이 지남에 따라 눈에 띄는 roll () 효과를 생성합니다. (이에 관련된 상당히 복잡한 수학이 많이 있지만 세부 사항은 특히 관련이 없습니다).

피치/요/롤은 모두 차량의 방향과 관련이 있습니다. 당신이 위아래로 올라가면, 당신은 Yaw의 축을 변경합니다. 마찬가지로, 당신이 요 할 때, 당신은 당신의 피치 축을 바꿉니다. 따라서 조합과 피치 및 요 기동으로 롤 기동과 유사한 방식으로 방향을 변경할 수 있습니다.

나는이 상황이 불려진다 고 믿는다 짐벌 잠금 - Wikipedia 페이지에 그림이있는 예가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top