3D 지오메트리 : 한 쌍의 점을 다른 점으로 변환하여 다른 점을 평행하게 정렬합니다.

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

문제

(x1, y1, z1)에서 (x2, y2, z2)로가는 선 (실제로 큐브)이 있습니다. (x3, y3, z3)에서 (x4, y4, z4)로 이동하는 다른 라인을 따라 정렬되도록 회전하고 싶습니다. 현재 나는 사용 중입니다 Math::Atan2 와 함께 Matrix::RotateYawPitchRoll. 이것을하는 더 좋은 방법은 무엇입니까?

편집 : 나는이 게시물을 매우 나쁘게 말했다고 생각합니다. 내가 실제로 찾고있는 것은 두 벡터의 회전 매트릭스입니다.

도움이 되었습니까?

해결책

예, 각도 측면에서 생각할 필요 없이이 작업을 수행 할 수 있습니다.

큐브가 있으므로 한쪽 코너를 선택한 다음 벡터 F0, F1, F2로 방사되는 3 개의 가장자리를 정의한다고 가정 해 봅시다 (이들은 선택한 코너에 대한 방향 벡터입니다). 그것들을 정규화하고 매트릭스 f로 열로 쓰십시오.

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

이제 회전하려는 큐브의 벡터 T0, T1, T2에 대해 동일한 작업을 수행하여 매트릭스 T라고 부릅니다.

이제 행렬 r = t * verse (f)는 첫 번째 큐브의 방향에서 두 번째 방향으로 회전하는 행렬입니다 (역 F 맵 eg f0 ~ (1 0 0) ', T 맵 (1). 0) '~ t0).

이것이 왜 작동하는지 알고 싶다면 좌표계 기본 벡터 측면에서 생각해보십시오. XY 및 Z 축을 새로운 좌표계로 회전시키려면 회전 매트릭스의 열은 원하는 벡터입니다 (1 0. 0) ', (0 1 0)'& (0 0 1) '에 맵핑됩니다. t*vereverse (f)는 큐브를 원래 방향에서 축으로 정렬 한 다음 원하는 방향으로 효과적으로 회전시킵니다.

(죄송합니다. 위의 열 벡터와 OpenGL 스타일의 열 벡터 및 변환입니다. Direct3D는 오른쪽의 행 벡터이고 변형 된 것을 기억하지만, 전환하는 방법은 분명해야합니다).

또한 번역 구성 요소가있는 4x4 행렬에도 똑같이 적용됩니다.

다른 팁

실제로 행렬을 보간하는 방법을 추가 할 수 있습니다. 소스 및 대상 행렬은 답에있어 적합하지만 역을 계산하는 것은 무의미합니다. Quaternions는 가장 짧은 회전 경로를 제공 할 것이므로 두 행렬에서 회전 3x3 행렬을 가져 가서 쿼터니언으로 변환하고 그 사람들을 배치하십시오. 번역을 위해 별도의 LERP를 수행하고 권장하십시오. Quaternion 용 Google- 매트릭스 및 백 전환 및 Quaternion Lerp.

편집 : 전방에서 회전 매트릭스와 위 벡터는 사소합니다. 누락 된 컬럼은 다른 두 벡터의 크로스 곱입니다. (열을 정규화하는 것을 잊지 마십시오).

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