2012-02-08 3 views
0

3x3 회전 행렬에서 회전 축과 회전 각도를 추출하려고합니다. 현재이 방법을 사용하고 있지만 현재 진행 중인지 확실하지 않습니다. 내 프로그램의 다른 곳에서 문제가 발생하고 있으며 이것이 원인 일 수 있다고 생각하지만이 문제를 직접 확인할 수는 없습니다.matrx에서 회전 축과 각도 찾기

제가 도움이된다면 XNA 프레임 워크로 작업하고 있습니다. 스케일 (vec3)과 회전 (quaternion)을 반환하는 Matrix.Decompose()를 사용했지만,이 값에서 필요한 데이터 데이터를 추출 할 수 있는지 확신하지 못했습니다.

public static void MatrixRotationAxisAngle(Matrix m, ref float theta, ref Vector3 rot_axis) { 
     float trace = m.M11 + m.M22 + m.M33; 
     float cos_theta = 0.5f * (trace - 1.0f); 
     if (cos_theta > 0.999999875f) { 
      //allow some epsilon value 
      theta = 0.0f; 
      rot_axis = new Vector3(1.0f, 0.0f, 0.0f); 
     } else if (cos_theta > -0.999999875f) { 

      theta = (float)Math.Acos(cos_theta); 
      rot_axis.X = (m.Up.Z - m.Forward.Y); 
      rot_axis.Y = (m.Forward.X - m.Right.Z); 
      rot_axis.Z = (m.Right.Y - m.Up.X); 
      rot_axis.Normalize(); 

     } else { //angle within PI limits 
      theta = (float)Math.PI; 
      //find index of largest diag term in matrix 
      int index = 0; 

      if (m.M11 > m.M22 && m.M11 > m.M33) { 
       index = 0; 
      } 
      if (m.M22 > m.M11 && m.M22 > m.M33) { 
       index = 1; 
      } 
      if (m.M33 > m.M11 && m.M33 > m.M22) { 
       index = 2; 
      } 

      switch (index) { 
       case 0: 
        float ix = 1.0f/rot_axis.X; 
        rot_axis.X = (float)Math.Sqrt(m.M11 + 1.0f); 
        rot_axis.Y = m.M12 * ix; 
        rot_axis.X = m.M13 * ix; 
        break; 
       case 1: 
        float iy = 1.0f/rot_axis.Y; 
        rot_axis.Y = (float)Math.Sqrt(m.M22 + 1.0f); 
        rot_axis.X = m.M21 * iy; 
        rot_axis.Z = m.M23 * iy; 
        break; 
       case 2: 
        float iz = 1.0f/rot_axis.Y; 
        rot_axis.Z = (float)Math.Sqrt(m.M33 + 1.0f); 
        rot_axis.X = m.M31 * iz; 
        rot_axis.Y = m.M32 * iz; 
        break; 
      } 
      rot_axis.Normalize(); 
     } 
    } 

답변

0

나는 장 2.1 (당신의 매트릭스에 따라) this mathematical explanation (pdf)에서 의사로 살펴하는 것이 좋습니다. 내 프로젝트 중 하나에서 코드를 성공적으로 사용했으며 내 경우에는 유효한 결과를 반환했습니다.

0

의 행렬을 참조하십시오.

시타를 찾는 것이 매우 쉽습니다. 다른 방정식을 사용하여 다른 각도를 찾으십시오.