왜 2D 변환은 3x3 매트릭스가 필요합니까?
-
12-12-2019 - |
문제
2D 도면을하고 있으므로 약간의 매트릭스 변환을 구현하고 싶습니다. 내 빛의 수학 배경으로 나는 C #에서 어떻게 그렇게하는지 이해하려고 노력하고 있습니다. (다른 OOP 언어는 분명히 할 수 있습니다).
읽은 모든 것은 번역에 대처할 수 있도록 3x3 매트릭스와 함께 일해야한다는 것을 설명하고 있습니다. 곱셈으로 번역을 할 수 없기 때문에. 그러나 이것은 우리가 변형을 창출하는 행렬의 곱셈을 사용합니다. 그래서 우리는 다음과 같이 일합니다 :
{ x1, x2, tx }
{ y1, y2, ty }
{ 0, 0, 1 }
.
세 번째 열의 평균을 이해하지만 세 번째 행이 필요한 이유는 무엇입니까? 신원 매트릭스뿐만 아니라 회전, 스케일 또는 회전에서 마지막 행은 동일합니다. 내가 필요로하는 작업이 있지 않은 작업이 있습니까? 일부 언어 (Java)는 "제곱 차원"배열로 더 잘 수행되기 때문입니까? 그렇다면 C #에서 3 개의 열과 2 행을 사용할 수 있습니다 (Jagged Arrays는 잘 작동하거나 더 잘 작동합니다).
예를 들어 회전 + 번역의 경우 i 이와 같은 매트릭스가 있습니다
{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2, ty }
{ 0, 0, 1 }
.
마지막 행이 필요 없습니다.
해결책
이것은 우리가 변형을 창출하는 행렬의 곱셈을 사용하고 있습니다
이 은 우리가 사각형 매트릭스를 원하는 이유입니다.
우리가 제안한 것을 수행하고 우리의 변환을 위해 2x3 매트릭스를 사용했다고 가정합니다.
회전은
( x1, x2, 0 )
( y1, y2, 0 )
.
및 번역은
( 1, 0, tx )
( 0, 1, ty )
.
우리는 매트릭스를 지점을 나타내는 열 벡터에 의해 매트릭스를 곱하여 회전 또는 번역을 수행 할 수 있습니다.
( x )
M ( y )
( 0 )
.
정답을 얻으려면
그러나 - 변형을 어떻게 생각합니까? 실제로, 당신의 "회전 + 번역을 위해 나는이"예를 들어 매트릭스가 있습니다. "은 그 매트릭스를 어떻게 얻었습니까? 물론,이 경우, 단지 그것을 쓸 수 있습니다, 그러나 일반적으로? 글쎄, 당신은 대답을 알고 있습니다 :
이것은 우리가 변형을 창출하는 행렬의 곱셈을 사용하고 있습니다
2 개의 변형 매트릭스를 곱하여 다른 변환 행렬 을 곱하게 할 수 있어야합니다. 매트릭스 곱셈의 규칙은 다음과 같습니다.
( . . . ) ( . . . )
( . . . ) ( . . . ) = ???
.
는 유효한 매트릭스 곱셈이 아닙니다. 우리는 우리의 변화가 합성 가능하기 위해 곱해질 수있는 행렬이 필요합니다. 그래서 우리는 그 여분의 행을 가지고 있습니다.
이제는 여기에서 표현하는 방식은 실제로 회전 및 번역의 익숙한 변환이 전사적 인 비행기에서 균일 한 좌표 변환의 완전한 힘의 특별한 사례 일뿐입니다. 그러나 매트릭스 스퀘어를 만들기 위해 여분의 행이 필요한지 보여주기 위해 당신에게 보여줄 것이라고 생각합니다.
다른 팁
대답은 균질 한 좌표입니다.하나의 조작에서 회전 및 번역을 결합하려면 모델이 요구하는 것보다 하나의 추가 차원이 필요합니다.평면의 것들은 3 가지 구성 요소이며 공간적 인 것들은 4 개의 구성 요소입니다.운영자는 3 개의 구성 요소를 취하고 3x3 매트릭스가 필요한 3 개의 구성 요소를 반환합니다.