<aside> 💡
<aside> 💡
LookAt 함수는 UpVector를 정확하게 안 줘도 내부적으로 외적을 통해서 다시 UpVector와 Forward Vector를 정확하게 구해준다.
그러나 그렇다고 해서 아예 UpVector 와 Forward Vector 를 거의 평행하게 주면 문제가 생긴다..
현재 LookAt 에는 Forward Vector는 Directional Light 의 방향대로 결정되지만, UpVector 는 (0, 1, 0, 0) 으로 항상 고정시켜두었었다.
이것이 문제였다. Directional Light와 UpVector가 평행해진다면 문제가 발생한다.
평행한 두 벡터를 외적하면 Sin 0 = 0 이 되어 값이 0 이 되어버린다.
그래서 LookAt이 내부적으로 Forward Vector 를 (0, 0, 0, 0) 으로 두고 View 행렬을 만들게 된다.. </aside>
<aside> 💡
<aside> 💡
[0] = { 0.0000000, -0.0000000, 0.0000000, 0.0000000 }
[1] = { 0.0000000, -1.0000000, 0.0000000, 0.0000000 }
[2] = { -1.0000000, 0.0000000, 0.0000000, 0.0000000 }
[3] = { 0.0000000, 0.0000000, 25.0000000, 1.0000000 }
r[0] = ( right.x, up.x, forward.x, 0 )
r[1] = ( right.y, up.y, forward.y, 0 )
r[2] = ( right.z, up.z, forward.z, 0 )
r[3] = ( trans.x, trans.y, trans.z, 1 )
저기서 r[3] 에 해당하는 Vector 는 기존 월드좌표계를 View 기준 좌표계로 맞추기위해 다른 월드의 물체들을 - cameraWorld 만큼 움직이는 역할을 한다.
그런데 지금 forward에 해당하는 값들이 모두 0 으로 들어간 것을 알 수 있다.
이에 대한 원인을 파악하기 위해서는 먼저 LookAt 함수의 내부동작을 이해해야한다.
LookAt 함수는 UpVector를 정확하게 안 줘도 내부적으로 외적을 통해서 다시 UpVector와 Forward Vector를 정확하게 구해준다.
그러나 그렇다고 해서 아예 UpVector 와 Forward Vector 를 거의 평행하게 주면 문제가 생긴다..
현재 LookAt 에는 Forward Vector는 Directional Light 의 방향대로 결정되지만, UpVector 는 (0, 1, 0, 0) 으로 항상 고정시켜두었었다.
만약 Forward Vector 와 UpVector 가 평행해진다면?
문제해결 후 올바르게 생성된 Directional Light 의 Depth Map