2008-10-31 5 views
1

(x1, y1, z1)에서 (x2, y2, z2)로가는 선 (실제로는 정육면체)이 있습니다. 나는 그것이 (x3, y3, z3)에서 (x4, y4, z4)로가는 또 다른 선을 따라 정렬되도록 회전시키고 싶다. 현재 Matrix::RotateYawPitchRoll과 함께 Math::Atan2을 사용 중입니다. 이 작업을 수행하는 더 좋은 방법은 무엇입니까?3D 기하학 : 한 쌍의 점을 다른 점과 평행하게 정렬

편집 : 나는이 게시물을 매우 나쁘게 말했습니다. 제가 실제로 찾고있는 것은 두 개의 벡터로부터의 회전 행렬입니다.

답변

4

예 각도로 생각할 필요없이 할 수 있습니다.

큐브가 있기 때문에 하나의 모서리를 선택한 다음 벡터로부터 방사되는 3 개의 모서리를 벡터 f0, f1, f2 (사용자가 선택한 모서리를 기준으로 한 방향 벡터입니다)라고 가정하십시오. 사람들을 정상화하고 매트릭스의 열로 쓰기 F

(f0x f1x f2x) 
(f0y f1y f2y) 
(f0z f1z f2z) 

이제 당신이 회전하고 통화 할 큐브의 벡터 T0, T1, T2에 대해 동일한 것은 지금

T.

행렬 할 행렬 R = T * 역 (F)는 첫 번째 정육면체의 방향에서 두 번째 정사각형의 방향으로 회전하는 행렬이다 (inverse F는 예를 들어 f0에서 (1 0 0) '로 매핑되고, 0) '~ t0).

이것이 작동하는 이유를 알고 싶다면 좌표계 기본 벡터를 고려하십시오. XY 및 Z 축을 새 좌표계로 회전하려면 회전 행렬의 열이 벡터 원하는 (1 0 0) ', (0 1 0)'& (0 0 1) '이 매핑됩니다. T * Inverse (F)는 큐브를 원래 방향에서 축 정렬로, 그리고 원하는 방향으로 효과적으로 회전시킵니다.

(위의 코드는 열 벡터와 왼쪽의 OpenGL 스타일을 변환합니다 .Director3D는 행 벡터이고 오른쪽이 변형 된 것 같습니다.하지만 전환하는 방법은 분명해야합니다.)

또한 변환 요소가있는 4x4 행렬에도 똑같이 적용됩니다.

+0

사실 그것은 큐브도 아닙니다. 강철 I- 섹션. 그러나 이것이 도움이 될 것입니다. 감사. –

+0

확인. 요점은 로컬 좌표계를 정의해야한다는 것입니다. 단지 선만있는 경우 회전이 모호합니다. – timday

+0

고마워, 팀. 나는 왜 이것이 선들에게 효과가 없어야하는지 이해하지 못했습니다. –

0

실제로 행렬을 보간하는 방법을 추가 할 수 있습니다. 소스와 대상 행렬은 답안에서 문제가 없지만 역행렬을 계산하는 것은 무의미합니다. 쿼터니언은 가장 짧은 회전 경로를 제공하므로 두 행렬 모두에서 회전하는 3x3 행렬을 가져 와서 쿼터니언으로 변환하고 그 행방을 바꿉니다. 번역과 재구성을 위해 별도의 저주를하십시오. Google for quaternion - 행렬 및 역 변환 및 쿼터니언 lerp.

편집 : 앞으로 및 위쪽 벡터에서 회전 행렬은 사소한 것입니다. 누락 된 열은 다른 두 벡터의 외적입니다. (열을 정규화하는 것을 잊지 마세요).

관련 문제