모형 뷰 행렬의 조옮김 역이 법선 벡터를 변환하는 데 사용되는 이유는 무엇입니까?


22

객체에 변형이 적용된 3D 장면을 렌더링 할 때는 모델 뷰 행렬의 역 수치로 법선을 변형해야합니다. 따라서 법선 인 modelViewMatrix 을 사용하면 변환 된 법선 은nMn

n=(M1)Tn

객체를 변환 할 때 그에 따라 법선을 변환해야합니다. 그러나 왜 수학적으로 이것이 대응하는 변환 행렬입니까?


모델 행렬이 변환, 회전 및 배율로 구성된 경우 일반 행렬을 계산하기 위해 역전 치 할 필요가 없습니다. 법선을 제곱 스케일로 나누고 모델 행렬을 곱하면됩니다. 수직 축이있는 행렬로 확장 할 수 있습니다. 대신 사용하는 행렬의 각 축에 대한 제곱 스케일을 계산하십시오. 나는 내 블로그에 세부 사항을 썼습니다 : lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

답변:


22

다음은 역전 치가 필요하다는 간단한 증거입니다. 평면 방정식 정의 된 평면이 있다고 가정 합니다. 여기서 은 법선입니다. 이제이 평면을 행렬 으로 변환하고 싶습니다 . 즉, 이전 평면 방정식을 만족하는 정확히 동일한 값에 대해 만족 되는 새로운 평면 방정식 을 찾고 싶습니다 .n M n M x + d = 0 xnx+d=0nMnMx+d=0x

이렇게하려면 두 평면 방정식을 동일하게 설정하면됩니다. (이것은 임의로 평면 방정식을 재조정하는 능력을 포기하지만 인수에 중요하지 않습니다.) 그런 다음 설정 하고 빼는 것이 가능합니다. 우리가 남긴 것은 :d=d

nMx=nx

이것을 행렬 표기법으로 표현 된 내적 (1 열 행렬로 벡터를 생각할 때)으로 다시 작성하겠습니다.

nTMx=nTx

이제 모든 대해 이것을 만족 시키려면 다음이 있어야합니다.x

nTM=nT

지금은 해결 의 측면에서 , nnn

'=1'=(1)'=(1)

프레스토 악장! 점 가 행렬 로 변환 되면 평면 법선 을 유지하기 위해 평면 법선이 의 역전 치로 변환되어야합니다 .엑스

이것은 기본적으로 내적의 속성입니다. 변환이 적용될 때 내적 (dot product)이 변하지 않고 유지되도록하기 위해, 점이 찍힌 두 벡터는 대응하지만 다른 방식으로 변환되어야한다.

수학적으로,이 법선 벡터는 일반 벡터 아니라고 말에 의해 설명 될 수 있지만, 일이라는 covector을 (일명 공변 벡터, 듀얼 벡터, 또는 선형 형태). 코 벡터는 기본적으로 "불변 스칼라를 생성하기 위해 벡터로 점을 찍을 수있는 것"으로 정의됩니다. 이를 달성하기 위해서는 일반 벡터에서 작동하는 모든 매트릭스의 역 전치를 사용하여 변환해야합니다. 이것은 여러 차원에서 유지됩니다.

구체적으로 3D에서 바이 벡터는 코 벡터와 유사합니다. 그들은 아니에요 확실히 서로 다른 단위를 가지고 있기 때문에 같은하십시오 bivector 그들이 스케일링에 따라 다르게 작동 할 수 있도록 길이의 단위 (지역)의 제곱가있을 때 covector이 역 길이의 단위를 가지고있다. 그러나 방향과 관련하여 동일한 방식으로 변환되므로 법선에 중요합니다. 우리는 보통 법선의 크기에 신경 쓰지 않고 (어쨌든 항상 단위 길이로 정규화합니다), 일반적으로 바이 벡터와 코 벡터의 차이점에 대해 걱정할 필요가 없습니다.


2
대단한 설명. 그러나 2 점에서 조금 빠르면 조금 더 자세한 내용을 좋아할 것입니다. 1. 도트 제품에서 매트릭스 제품으로 어떻게 뛰어 넘습니까? 마지막으로 인용 된 부분의 라인 2와 3 사이의 2는 무슨 일하는 (n은 나에게 마술 비트를 왼쪽에서 오른쪽으로 이동)
v.oddou

4
1. a와 b가 같은 차원의 열 행렬 인 경우 (a ^ T) b는 dot (a, b)와 같습니다. 스스로 수학을 해보십시오! 2. (AB) ^ T = (B ^ T) (A ^ T) 및 (A ^ T) ^ T = A 더 많은 매트릭스 아이덴티티에 대해서는 The Matrix Cookbook
Mokosha

3
@ v.oddou 네, Mokosha가 옳습니다. 내적은 1xn 행렬 (행 벡터)에 x1 행렬 (열 벡터)을 곱한 것으로 표현할 수 있습니다. 결과는 단일 성분이 내적인 1x1 행렬입니다. 열 벡터의 전치 행은 행 벡터이므로 a · b를 a ^ T b로 쓸 수 있습니다. 두 번째 질문의 경우, 행렬 곱을 전치하는 것은 개별 요인을 전치하고 순서를 반대로하는 것과 같습니다.
Nathan Reed

완벽하고 문제없이 해결되었습니다. 둘 다 감사합니다.
v.oddou

@NathanReed (Gosh는 비행기로 대부분의 것을 모델링 한 초기 PowerVR 시절로 되돌아갑니다.) 또한 최적화 목적으로 회전 만 포함 하는 행렬 Mr (직교) 만있는 경우 Inverse ( Mr ) = Transpose ( Mr ), Trans (Inverse ( Mr ) = _ Mr_. SGL PowerVR 그래픽 라이브러리에서 FWIW를 사용하면 변환 행렬에 이러한 속성이 있는지 여부를 추적하여 일반 변환으로 비용을 절감 할 수있었습니다.
Simon F

6

이것은 법선이 실제로 벡터가 아니기 때문입니다! 교차 곱으로 생성되므로 벡터가 아닌 바이 벡터 가 생성됩니다 . 대수는 이러한 좌표에 대해 매우 다르게 작동하며 기하 변환은 다르게 동작하는 하나의 작업 일뿐입니다.

이에 대한 자세한 정보는 Eric Lengyel의 Grassman Algebra 프레젠테이션입니다 .


법선은 소위 의사 벡터라고도합니다. 일반화 및 경험 법칙으로, 교차 곱 (예 : 평면)에서 발생하는 모든 것이 비슷한 방식으로 변환됩니다.
Matthias
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.