3D 회전 행렬 (4x4)을 구성 요소 부분 (회전, 스케일 등)으로 전환 할 수 있습니까?


11

좀 더 구체적으로 말하면, 나는 iOS 앱에서 일하고 있으며 CATransform3D구조체 (기본적으로 4x4 변환 배열)를 가지고 있습니다.

이 매트릭스가 암시하는 모든 다른 "작업"을 추론 할 수 있습니까? 회전, 스케일 등의 의미는 무엇입니까?

답변:


10

행렬 를 변환, 스케일링 및 회전과 같은 기본 변환으로 분해 할 수 있습니다 . 이 매트릭스가 주어지면 :M=TRS

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

마지막 열 사용하여 검사하여 번역을 분해 할 수 있습니다 .t=(a03,a13,a23)

스케일링을 위해 행렬의 처음 세 열은 밑 (축)에 해당합니다. 이 벡터의 길이 / 규모, 즉베이스가 얼마나 많은지에 따라 스케일을 얻을 수 있습니다. 따라서 스케일은 여기서 :s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

이제 스케일에는 사용하여 제거 할 수있는 부분 행렬이 대응하는 스케일의 역수로 행렬을 곱하여 에 받기R S3×3RS RS1R

(아르 자형에스)에스1=[000102101112202122][에스0000에스1000에스2]1=[000102101112202122][1/에스00001/에스10001/에스2]

따라서 ( ) :(아르 자형에스)에스1=아르 자형나는=아르 자형

아르 자형=[00/에스001/에스102/에스210/에스011/에스112/에스220/에스021/에스122/에스2]

이것이 최종 회전 행렬입니다. 여러 가지 방법으로 추가로 분해 할 수 있습니다. 종료 시간이 길지만 회전 행렬 분해를 검색 할 수 있습니다 .


이 방법은 평행 이동, 스케일링 및 회전 형식의 동등한 값만 제공합니다 (원래 매트릭스는 다른 유형의 변환 결과 일 수 있음). 분해 된 각도를 추가로 사용하는 경우 회전 각도와 함께 부동 소수점 정밀도에 문제가있을 수 있으며 반올림 오류가 계산에 누적 될 수 있습니다. 매트릭스를 직접 구성하지 않은 경우에는 사용하지 마십시오.

행렬을 구성한 사람이고 변환, 스케일 및 회전을 개별적으로 그리고 독립적 으로 편집하고 표시 할 수 있도록 분해를 원한다면 , 의 구성 요소를 저장하는 것이 가장 깨끗한 이유 일 것입니다 변환 클래스 및 은 개별적으로 벡터 (회전의 쿼터니언 일 수 있음)입니다. 변환 매트릭스가 필요한 경우에만 이러한 컴포넌트에서 매트릭스를 구성하십시오 (일부 컴포넌트가 변경 될 때까지 매트릭스를 캐시 할 수 있음).에스아르 자형아르 자형에스


2
부동 소수점 정밀도의 문제점이 무엇인지 명확히 할 수 있습니까? 이 방법에서 스케일이 실제로 극단적 인 경우가 아니라면 정밀도 문제를 일으킬 수있는 것은 없습니다. 또한 행렬이 비 균일 스케일과 회전을 모두 포함하는 일련의 행렬로 구성된 경우이 방법이 실패 할 수 있습니다. 이 경우 행렬은 회전이 아닌 것으로 나타 났지만 일부 전단이 포함됩니다. 아르 자형
Nathan Reed

2
모든 부동 소수점 숫자에는 고유 (경계) 오류가 있습니다. 연산, 특히 덧셈 또는 뺄셈을 수행 할 때마다 오차가 더해져 경계의 크기가 커집니다. 분해 알고리즘에는 많은 곱셈 연산 (행렬 곱셈 및 스케일 크기 계산)과 제곱근 (스케일)이 숨겨져 있습니다. 더 분해하면 더 많은 오류가 발생합니다.
Timbo

1
@Timbo 여기에는 행렬의 곱셈이 없으며 행렬의 열에 역 스케일을 곱하면됩니다. 그리고 벡터 크기에는 모든 양의 양을 추가하는 것이 포함되므로 치명적인 취소는 없습니다. AFAICT, 그것은 상대적으로 많은 오류를 일으키지 않습니다. 어쨌든 저자는 회전 행렬을 오일러 각도 등으로 더 분해하는 것에 대해 이야기하고 있음을 분명히했습니다.
Nathan Reed

감사합니다 – 좋은 답변입니다. 후속 조치 : 원래 행렬을 되찾기 위해 정체성 행렬에서 시작하여 특정 순서의 작업을 수행해야한다고 가정합니다. 이 주문이 TRS입니까?
elsurudo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.