2014-09-19 3 views
1

우주선 시뮬레이터에서 작업 중이며 두 개의 공간 객체 사이에 호가 마주 칠 때 문제가 있습니다. 물론 갖는 XYZ 좌표로두 개의 3d 회전 행렬 간의 대각선 호 계산

//Top row 
rotation[0][0] = cos(pitch)*cos(yaw); 
rotation[0][1] = -sin(yaw)*cos(pitch); 
rotation[0][2] = sin(pitch); 
//Middle row 
rotation[1][0] = cos(yaw)*sin(pitch)*sin(roll) + sin(yaw)*cos(roll); 
rotation[1][1] = -sin(yaw)*sin(pitch)*sin(roll) + cos(yaw)*cos(roll); 
rotation[1][2] = -cos(pitch)*sin(roll); 
//Bottom row 
rotation[2][0] = -cos(yaw)*sin(pitch)*cos(roll) + sin(yaw)*sin(roll); 
rotation[2][1] = sin(yaw)*sin(pitch)*cos(roll) + cos(yaw)*sin(roll); 
rotation[2][2] = cos(pitch)*cos(roll); 

: 각 오브젝트는 다음과 같이 정의되는 회전 매트릭스를 갖는다.

이 정보를 사용하여 전방, 우현, 항구, 후미, 등쪽 (위) 및 아래쪽 (아래) 나는이 물체를 사용하려고했습니다. 다음 수식 :

arc = acos(sum(a*b)/(sqrt(sum(a * a)) * sqrt(sum(b * b)))) 

여기서 | a | | object2 |의 벡터 방향입니다. - | object1 | 및 | b | row1 (전진 호), row2 (우현 호) 또는 row3 (위 호). 예상대로 작동하지 않기 때문에 나는 뭔가 잘못하고 있습니다. 그래서 나는 실수를하는 곳을 찾는데 도움을 청하고 있습니다.

P. 요, 피치 및 롤은도 (0-360)로 저장되고 PI/180.0을 곱하여 rads로 변환됩니다.

+1

코드를 훑어 보는 것에서의 스타일 힌트 : 각 줄마다 사인과 코사인을 계산하지 마십시오. 그들을 한번 계산하고 지역 변수에 저장하십시오. –

+1

* nods * 나는 실제로 코드에서, 내가 뭘하는지 분명히하기 위해 위와 같이 썼다. :) –

+0

이 질문은 [Mathematics.SE]와 (과) 관련이 있기 때문에 화제가 아닙니다. Math.SE에 메소드를 요청하십시오. 그런 다음이 코드를 'C'코드 포스트로 변환하는 데 문제가 있으면 여기를 클릭하십시오. – ja72

답변

1

롤, 피치 및 요와 관련하여 베어링을 설명하여 문제를 잘못 접근하고 있다고 생각합니다. 이것들은 우주선의 현재 좌표계 자체에서 우주선의 움직임을 나타내는 오일러 각입니다. 이 각도는 독립적이지 않으며 그 중 하나가 ± 90 ° 일 때 문제를 일으킬 수 있습니다. 롤, 피치 및 요는 선박의 움직임을 설명하고 싶을 때 유용합니다.

사례를 다르게 모델링합니다. 각 우주선은 글로벌 데카르트 x, y, z 시스템에서 주어진 위치 {P}를 갖습니다. 그것은 또한 지구 공간에서 3 개의 orthonormal 벡터 u, v, w로 주어지는 베어링을 가지고있다.

{s} = [R] · {S - P} 

참고 :

 | ux vx wx | 
[R] = | uy vy wy | 
     | uz vz wz | 

그런 다음 배의 로컬 좌표계에 위치 (S)와 다른 개체의 위치를 ​​설명 할 수 있습니다

당신은 또한 회전 행렬을해야합니다
  • {s} = {su, sv, sw}의 최대 절대 구성 요소를 결정하여 우주선에서 다른 물체를 가장 잘 볼 수있는 방법을 결정할 수 있습니다. 예를 들어 s = {-12, 8, 10}이면 객체가 뒤에 있습니다. (또는 더 정확하게는 이면이 다른 다섯 방향에있는 것보다 후방이 주 방향입니다.) s = {2, -5, 8}이면 대상이 사용자의 아래에 있습니다.

  • 전진에는 u, 우현에는 y, 위로는 z를 사용합니다. 그것은 왼손 시스템을 설명합니다. 오른쪽 시스템을 사용하는 것이 좋습니다. 거의 모든 데카르트 시스템이이를 준수하기 때문입니다. 예를 들어, 전달에는 u, 우현에는 y, 아래로는 w를 사용할 수 있습니다.

  • 데카르트 벡터 {s}를 w 방향의 천정과 함께 구 좌표계로 나타낼 수 있습니다. 이렇게하면 물체 r과 두 개의 독립 각도 인 배 (u, v) 평면의 방위각과이 평면에서 물체의 높이를 나타내는 정점이 표시됩니다.

  • 우주선이 움직이면 롤, 피치 및 요우를 사용하여 글로벌 베어링을 업데이트 할 수 있습니다.

  • 위 공식을 사용하여 원하는 호를 계산할 수 있습니다. 배의 좌표에서 {s} = {su, sv, sw}를 사용하면 참조 축은 u = {1, 0, 0}, v = {0, 1, 0} 및 w = {0, 0, 1} :

    uarc = acos(su/r) 
    varc = acos(sv/r) 
    warc = acos(sw/r) 
    

    여기서, r은 거리, r² = {s} · {s}이다. 계산 한 호는별로 유용하지 않습니다. 그들은 축과 물체 사이의 각도를 알려주지 만,이 각도는 애매합니다. 비행기에서 각도를 계산하는 것이 더 좋습니다.

    uvarc = atan2(sv, su) 
    vwarc = atan2(sw, sv) 
    wuarc = atan2(su, sw) 
    

    0도 참조는 표현식의 두 번째 축 즉, uvarc의 u입니다. 그러면 해당 평면에 투영 된 거리 벡터의 각도가 표시됩니다.

+0

당신이 정확하게 맞습니다, 그것은 내가 90도 각도로 직면하고있는 문제입니다. 이제 우주 시뮬레이터 시스템은 20 년 이상 사용되어 왔으며 원래의 프로그래머는 베어링에 오일러 각을 사용하도록 시스템을 설정했습니다. 나는 아무도 전에 직면하는 호들의 기이함을 발견하지 못했다. 이상적으로는 사용자 POV에서 아무것도 변경하지 않고 내부적으로 90도 각도의 문제를 해결할 수있는 솔루션을 찾고 있습니다. 유익한 답변을 해주셔서 너무 감사드립니다. :) –