오로라 뿔 과 회전

오로라 각 은 자주 방 위 를 묘사 하 는 방법 이다.이 기술 은 유명한 수학자 인 Leonhard Euler (1707 ~ 1783) 의 이름 으로 명명 되 었 으 며, 그 는 각 변위 서열 이 하나의 각 변위 와 같다 는 것 을 증명 했다.자세히 알 고 싶 은 것 은 위 키 피 디 아 를 클릭 하 세 요:http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92#.E5.88.A5.E7.A8.AE.E9.A0.86.E5.BA.8F
1. 오로라 뿔 이란 무엇 인가?
      오로라 각 의 기본 사상 은 각 위 치 를 세 개의 서로 수직축 을 도 는 세 개의 회전 으로 구 성 된 서열 로 분해 하 는 것 이다.이것 은 듣 기 에 복잡 하지만, 사실 그것 은 매우 직관 적 이다.'각 변위' 라 는 말 이 있 는 이 유 는 오 라 각 이 임 의 회전 을 묘사 할 수 있 기 때 문 이지 만 가장 의미 있 는 것 은 피리 칼 좌 표를 사용 하고 일정한 순서에 따라 구 성 된 회전 서열 이다.가장 많이 사용 되 는 약속, 즉 '헤드 링 - fitch - bank' 약속 이다.이 시스템 에서 한 방 위 는 하나의 heading 각, 하나의 pitch 각, 그리고 하나의 bank 각 으로 정의 된다.그것 의 기본 사상 은 바로 물 체 를 '표준' 방위 에서 시작 하 게 하 는 것 이다. 바로 물체 좌표 축 과 관성 좌표 축 을 정렬 하 는 것 이다.표준 방위 에서 물 체 를 heading, pitch, bank 로 회전 시 키 고 마지막 에 물 체 는 우리 가 묘사 하고 자 하 는 방향 에 도착 합 니 다.
     용어 'heading', 'pitch', 'bank' 를 정확하게 정의 하기 전에 이 책 에서 사용 하 는 좌표 공간 약속 을 간략하게 살 펴 보 자.우 리 는 왼손 좌 표를 사용 하여 + x 를 오른쪽으로, + y 를 위로, + z 를 앞으로 한다.
     헤드 링 은 y 축 을 감 는 회 전량 이 고 오른쪽으로 회전 하 는 것 이 정 이다. 회전 정방 향 은 시계 방향 이다. 헤드 링 을 통 해 회전 한 후에 pitch 는 x 축 을 감 는 회 전량 이다. 물체 좌표계 의 x 축 이지 원래 관성 좌표계 의 x 축 이 아니 라 왼손 법칙 을 지 키 고 아래로 회전 하 는 것 이 정 이다.마지막 으로 heading, pitch 를 거 친 후에 bank 는 z 축 을 감 는 회 전량 으로 여전히 물체 좌표계 의 z 축 이다.
     우리 가 회전 하 는 순서 가 헤드 링 - fitch - bank 라 고 말 할 때 관성 좌표계 에서 물체 좌표계 로, 물체 좌표계 에서 관성 좌표계 로 가면 반대 된다.
2, 오로라 뿔 에 대한 다른 약속
     앞에서 언급 한 바 와 같이 헤드 링 - fitch - bank 시스템 은 유일한 오 라 각 시스템 이 아니 며, 임의의 세 개의 서로 수직축 을 도 는 임의의 회전 서열 은 모두 하나의 방 위 를 정의 할 수 있다.그래서 다양한 선택 이 오 라 각 약속의 다양성 을 초래 했다.
     1) heading - fitch - bank 시스템 은 두 개의 이름 이 있 습 니 다. 물론 서로 다른 이름 은 서로 다른 약속 을 대표 하지 않 습 니 다. 이것 은 중요 하지 않 습 니 다. 한 조 에서 자주 사용 하 는 용 어 는 roll - fitch - yaw 입 니 다. 그 중에서 roll 은 bank, yaw 와 대응 하고 물체 좌표계 에서 관성 좌표계 까지 의 회전 순 서 를 정의 합 니 다.
     2) 세 개의 축 이 모두 회전축 이 될 수 있다. 반드시 피리 칼 축 이 어야 하 는 것 은 아니 지만 피리 칼 축 을 사용 하 는 것 이 가장 의미 가 있다.
     3) 오른손 좌표 규칙 도 선택 가능
     4) 회전 은 다른 순서 로 할 수 있다
3. 장점: 1) 사용 하기 쉽다.2) 표현 이 간결 하 다.3) 임 의 3 각 은 모두 합법적이다
4. 단점: 1) 방 위 를 정 하 는 표현 방식 이 유일 하지 않다.2) 두 각도 에서 가 치 를 구 하 는 것 은 매우 어렵다.
오 라 각 을 제한 하 는 방법 으로 상기 문제 의 발생 을 피한다. heading 은 + - 180 으로 제한 하고 pitch 는 + - 90 이다.
    이상 은 오 라 각 의 정의 입 니 다.회전 하 는 방법 은 다음 과 같다.
오 라 각 벡터 에서 전환 하 는 것 은 쉽 고 어 려 운 부분 은 전환 하 는 것 이다.XNA 는 회전 행렬 을 만 들 수 있 는 방법 을 제 공 했 지만, 변환 하 는 방법 을 제공 하지 않 았 기 때문에 우 리 는 스스로 실현 할 수 밖 에 없 을 것 이다.
우선, 우 리 는 회전 행렬 로 전환 합 니 다. Matrix. Create FromYaw PitchRoll () 방법 은 이 점 을 할 수 있 습 니 다.만약 여기에 오로라 뿔 을 사용한다 면, 우 리 는 다음 순서 로 좌 표를 제공 해 야 한다.
Yaw (편 항): 오로라 각 벡터 의 y 축 Pitch (내 려 다 보기): 오로라 각 벡터 의 x 축 Roll (스크롤 백): 오로라 각 벡터 의 z 축 비행 기 를 상상 해 보 세 요.Pitch 는 수평 방향의 협각 을 가리 키 며 x 축 을 감아 회전한다.Roll 은 비행기의 굴 림 을 가리 키 며 z 축 을 돌 며 회전한다.다음 코드 는 이 과정 을 보 여 줍 니 다.
// Converts a rotation vector into a rotation matrix
Matrix Vector3ToMatrix(Vector3 Rotation)
{
    return Matrix.CreateFromYawPitchRoll(Rotation.Y, Rotation.X, Rotation.Z);
}

이런 방법 은 회전 을 나타 내 는 행렬 을 제공 할 수 있다.다음은 가장 어 려 운 부분 이다. 행렬 을 오 라 각 으로 전환한다.
이 과정 은 행렬 을 분리 하 는 것 입 니 다. 하 나 는 위 치 를 나타 내 는 Vecto 3 이 고, 다른 하 나 는 크기 를 표시 하 며, 4 원 수 는 회전 을 표시 합 니 다.그런 후에 우 리 는 이 4 원 수 를 오로라 각 벡터 로 바 꿔 야 한다.나 는 코드 뒤의 수학 원 리 를 상세 하 게 토론 할 생각 은 없 지만, 만약 네가 관심 이 있다 면, 앞 에 연 결 된 인터넷 주소 로 가서 볼 수 있다.
다음은 회전 행렬 을 오 라 각 으로 바 꾸 는 코드 입 니 다.
// Returns Euler angles that point from one point to another
Vector3 AngleTo(Vector3 from, Vector3 location)
{
    Vector3 angle = new Vector3(); 
    Vector3 v3 = Vector3.Normalize(location - from); 

    angle.X = (float)Math.Asin(v3.Y);
    angle.Y = (float)Math.Atan2((double)-v3.X, (double)-v3.Z);

    return angle;
}

// Converts a Quaternion to Euler angles (X = Yaw, Y = Pitch, Z = Roll)
Vector3 QuaternionToEulerAngleVector3(Quaternion rotation)
{
    Vector3 rotationaxes = new Vector3();
    Vector3 forward = Vector3.Transform(Vector3.Forward, rotation);
    Vector3 up = Vector3.Transform(Vector3.Up, rotation);

    rotationaxes = AngleTo(new Vector3(), forward);

    if (rotationaxes.X == MathHelper.PiOver2)
    {
        rotationaxes.Y = (float)Math.Atan2((double)up.X, (double)up.Z);
        rotationaxes.Z = 0;
    }
    else if (rotationaxes.X == -MathHelper.PiOver2)
    {
        rotationaxes.Y = (float)Math.Atan2((double)-up.X, (double)-up.Z);
        rotationaxes.Z = 0;
    }
    else
    {
        up = Vector3.Transform(up, Matrix.CreateRotationY(-rotationaxes.Y));
        up = Vector3.Transform(up, Matrix.CreateRotationX(-rotationaxes.X));

        rotationaxes.Z = (float)Math.Atan2((double)-up.Z, (double)up.Y);
    } 

    return rotationaxes;
}

// Converts a Rotation Matrix to a quaternion, then into a Vector3 containing
// Euler angles (X: Pitch, Y: Yaw, Z: Roll)
Vector3 MatrixToEulerAngleVector3(Matrix Rotation)
{
    Vector3 translation, scale;
    Quaternion rotation;

    Rotation.Decompose(out scale, out rotation, out translation);

    Vector3 eulerVec = QuaternionToEulerAngleVector3(rotation);

    return eulerVec;
}

또한 오 라 각 의 순서 규정 은 모두 12 가지 로 전환 할 때 규정 이 어떤 지 알 아야 한다.

좋은 웹페이지 즐겨찾기