3x3 회전 행렬에 문제가 있습니다. 임의의 기존 회전 행렬을 조정할 수 있습니까? 회전이 수평선에 고정되도록 (롤 없음, 피치 및 턱)? 수평선을 항상 "수평"으로 만들 필요가 있습니다 (예 : 일부 FPS의 카메라 사용).회전 매트릭스를 수평선에 고정하려면 어떻게해야합니까?
답변
기존의 회전 행렬을 원하는대로 구속 된 회전 행렬로 변환 할 수 없습니다 (즉, 회전 행렬의 오른쪽 벡터는 항상 월드 좌표계의 위쪽 축에 수직 인 평면에 있음). 명확하게 말하면, 변환이 어떻게 이루어져야 하는지를 지정하시오. 기존의 회전 행렬은 원하는 제약 조건을 얻기 위해 전체 벡터 집합으로 회전 할 수 있지만 모두 다른 결과를 줄 수 있습니다.
아마 가장 자연스럽게 돌아가는 벡터는 기존 회전 행렬의 앞쪽 벡터이지만 세계 좌표계의 앞으로 또는 오른쪽 벡터 일 수도 있습니다.
기존 회전 행렬의 정방향 벡터를 중심으로 회전하는 예를 들어 보겠습니다. 저는 기본 OpenGL 좌표계와 같은 좌표계를 사용하고 있다고 가정 할 것입니다. 여기서 X는 오른쪽, Y는 위로, Z는 뒤에 있습니다. 좌표계가 다르면 조정해야합니다.
당신은 회전 행렬 객체는 다음 세상을 것이다 : 당신의 세계로 표현 각각 당신의 회전 물체의 존재
[r1 u1 b1]
[r2 u2 b2]
[r3 u3 b3]
r*
, u*
및 b*
최대 직교 오른쪽, 다시 벡터를 좌표계 좌표 체계.
오른쪽 벡터를 월드 좌표계의 상향 축에 수직 인 평면으로 제한하려는 경우 r2
은 항상 0
이어야합니다. 이제 r2
을 0
으로 설정하면 깨끗한 회전 대신 매우 이상한 변형이 생길 수 있습니다. 우리는 회전 할 각도를 찾아야 만 오른쪽 평면에 올바른 벡터를 얻을 수 있습니다. a*
당신의 조정 및 n*
입니다
[nr1 nu1 nb1] [r1 u1 b1] [ar1 au1 ab1]
[nr2 nu2 nb2] = [r2 u2 b2] * [ar2 au2 ab2]
[nr3 nu3 nb3] [r3 u3 b3] [ar3 au3 ab3]
새 회전 행렬이다 : 같은
귀하의 조정이 보일 것이다.
이제 회전 행렬은 기본적으로 r*
벡터를 월드 좌표계의 위쪽 벡터와 직각 인 평면으로 다시 가져 오는 각도 theta의 정방향 벡터 (Z 축) 주위로 회전합니다. 그 시타는 내적 (<r1, r2, r3>
과 <r1, 0, r3>
사이)으로 계산할 수 있습니다. 지금 생각해 너무 피곤, 마지막 인수 어쩌면 -1
glRotate3f(theta, 0, 0, 1)
적용 또는
dotproduct(<r1, r2, r3>, <r1, 0, r3>) == length(<r1, r2, r3>) * length(<r1, 0, r3>) * cos(theta)
theta = acos(dotproduct(<r1, r2, r3>, <r1, 0, r3>)/(length(<r1, r2, r3>) * length(<r1, 0, r3>)))
그런 다음 회전 행렬 a*
는 회전 행렬이다.
사용자 입력에서 자신 만의 피치 및 요 애플리케이션을 수행하는 경우 점진적 변환 행렬을 유지하는 대신 객체를 렌더링하는 모든 프레임을 회전 행렬로 계산하는 것이 더 쉽습니다.) 그 경우에는 입력을 사용할 때 피치와 요 수를 조정 한 다음 올바른 순서로 피치와 요를 적용하고 요법을 먼저하고 피치를 적용한 다음 주위를 돌리면 롤을 얻을 수 있습니다 부작용.
답장을 보내 주셔서 감사합니다. 매우 유용했습니다! 그러나 초기 버전에서는 저에게 효과가 없었습니다. 또한, 나에게 가장 가치있는 점은 부정확 한 요요와 피치 순서로 인해 롤 사이드 효과가 나타나는 이유에 대한 참고였다. – user1997471
예, 언급 한 바와 같이 변환 행렬 표현과 선택한 세계 축에 따라 다릅니다. 때로는 오른쪽, 위쪽 및 앞으로/뒤로 벡터가 OpenGL과 같은 열 대신에 행에있는 경우가 있습니다. 때로는 사람들이 반대 축을 사용하기도합니다. 때때로 사람들은 OpenGL에서와 같이 Y 대신 Y를 사용하여 세계 최대 축이됩니다. 당신은 조정할 필요가 있습니다. – wich
그리고 네가 다른 회전 순서를 사용하면 다른 효과를 얻습니다. 실행하는 회전은 그 점까지의 변환과 관련이 있습니다. 따라서 이미 앞쪽으로 투구하면 요는 위쪽 벡터에 해당합니다. 앞으로 기울어 져 있습니다. 세계 좌표계의 상향 벡터가 아니라 암시 적 굴림으로 이어집니다. 당신 주위의 다른 방법은 먼저 원하는 방향을 향하도록 수평으로 회전 한 다음 그 방향으로 앞으로 피치를 올립니다. – wich
- 1. 요소를 고정하려면 어떻게해야합니까?
- 2. 난수를 매끄럽게 고정하려면 어떻게해야합니까?
- 3. html 색인을 고정하려면 어떻게해야합니까?
- 4. 매트릭스를 사용한 절대 회전?
- 5. Eclipse : 검색보기를 기본적으로 고정하려면 어떻게해야합니까?
- 6. 확장기를 ListBox의 오른쪽에 고정하려면 어떻게해야합니까?
- 7. 변형시 매트릭스를 회전하고 회전 시키시겠습니까?
- 8. Android : 레이아웃이나보기의 화면 크기를 딥으로 고정하려면 어떻게해야합니까?
- 9. addon-builder의 DOM 요소에 패널을 고정하려면 어떻게해야합니까?
- 10. Firefox에서 테이블 셀의 높이를 고정하려면 어떻게해야합니까?
- 11. cocos2d의 장면에서 화면 방향을 가로로 고정하려면 어떻게해야합니까?
- 12. Graphviz - 수평선에 노드 배치
- 13. 안드로이드는 수평선에 상대적인 각도를 얻습니다.
- 14. Ruby 참조를 고정하려면 어떻게합니까?
- 15. matlab에 대각선에서 매트릭스를 재구성
- 16. 웹 페이지의 요소를 다른 요소에 상대적으로 고정하려면 어떻게해야합니까?
- 17. 사용자 지정 MessageBox를 시작할 때 상위 스레드를 고정하려면 어떻게해야합니까?
- 18. 4 선형 레이아웃을 선형 레이아웃의 맨 아래에 고정하려면 어떻게해야합니까?
- 19. div의 높이가 변하면 div의 아래쪽에 이미지를 고정하려면 어떻게해야합니까?
- 20. 태블릿이 아닌 휴대 전화의 화면 방향을 고정하려면 어떻게해야합니까? (Android)
- 21. 3D 매트릭스에서 2D 매트릭스를 얻으려면 어떻게해야합니까?
- 22. 호모 그래피 매트릭스를 올바르게 사용하려면 어떻게해야합니까?
- 23. MATLAB에서 가변 크기의 무작위 매트릭스를 생성하려면 어떻게해야합니까?
- 24. 이 2x2 매트릭스를 사용하여 픽셀을 회전 할 수 있습니까?
- 25. 필수 매트릭스에서 카메라 회전 및 변환 매트릭스를 결정하십시오.
- 26. 회전 매트릭스를 기반으로 한 OpenGL ES 패닝 (X, Y, Z)
- 27. 매트릭스를 어떻게 곱하면됩니까?
- 28. 3D 매트릭스를 반 시계 방향으로 90도 회전하려면 어떻게해야합니까?
- 29. 같은 수평선에 두 개의 버튼이 있습니다
- 30. 하나의 수평선에 배치해야하는 이미지 배열 (스크롤 포함)
'업'축에 대해서만 회전 할 수 있습니까? 질문을 시각화하는 데 문제가 있습니다. 여러분은 현재의 변화에 대한 예제 매트릭스와 다음에하고자하는 것을 제공 할 수 있습니까? – beaker
문제는 "위로"축 주위로 회전 할 필요는 없으며 "우측에서 오른쪽으로"축 주위로도 회전 할 필요가 있다는 것입니다. 행렬은 임의의 직교 회전 행렬입니다. "앞으로/뒤로"축을 중심으로 회전을 "제거"해야합니다. – user1997471
아, 나는 당신이 단지 yaw를 유지하기를 원한다고 생각하는 당신의 질문을 잘못 읽었습니다. 상징적 인 행렬조차도 도움이 될 것입니다. – beaker