2024년 7월 23일 화요일

뷰 매트릭스

 

실시간 렌더링에서 플레이어,

즉 카메라가 바라보는 방향과 위치의 정보를 담고 있는 행렬을

뷰 매트릭스라 한다.




일단 왼손 좌표계와 오른손 좌표계가 있다.



이 둘의 차이는 그냥 Z축이 반대다

그래서 뷰 매트릭스를 생성하기 위해 두 가지 함수가 있는데

XMMatrixLookAtLH 랑 

XMMatrixLookAtLR 로


카메라의 위치, 바라보는 타겟의 위치, 업 벡터 세개를 매개변수로 받아

뷰 매트릭스로 바꿔준다.



근데 주로 LH를 쓰고 LR는 거의 쓰질 않는데

아마 다른 엔진이나 OpenGL 같이 오른손 좌표계를

쓰는 프로젝트에 이식하거나 할 수 있으니

일단 만들어 둔게 아닐까 생각함




카메라의 위치는 0, 0, -10에 두고

카메라 회전 각도는 0, 0, 0이니

이를 뷰 매트릭스로 변환하기 위해서는

먼저 회전 방향 xyz를 라디안으로 바꿔준다.




pitch, yaw, roll 요 셋은 각각 x, y, z 회전축의 방향 값이고

m_rotation 의 x, y, z 회전 방향 값을 라디안으로 바꿔준 값이다.

XMMatrixRotationRollPitchYaw 함수를 사용하면 회전값을 매트릭스로 만들어 주는데



이 회전 매트릭스는 카메라의 회전방향에 맞춰

업 벡터와 가르키는 방향을 회전시키는 연산을 할때 씀



4x4 회전 행렬에 저장되는 값은 요렇게 되는데

이건 0, Y, 0  즉 y값을 기준으로 회전하는 행렬이다.

연산 원리만 쉽게 설명하기 위해 이렇게 했는데

 x랑 z까지 포함하면 식이 엄청 길어짐





예를 들어 y축을 30도 만큼 회전 시킨 행렬을 생성하게 되면

이런 값을 갖게 되는 것이다.

sin cos 30도가 머였는지 이젠 기억 안나도

괜찮다 전부 컴터가 연산해주니까





그리고 이걸 타겟 좌표랑 업 벡터를 행렬과 곱연산 해주는데

그럼 y축 30도 회전시킨 LookAtVector는 이렇게 연산된다.





실제로 값도 맞게 나온다.

UpVector는 설명할것도 없고 동일하게 회전되는데

y축만 회전시켰으니 그대로 0,1,0이 됨



마무리로 가르키는 방향 좌표를 카메라 포지션만큼 더하면 됨


이제 결과들을 viewMatrix로 생성하면 끝이다

댓글 없음:

댓글 쓰기

c++ thread.h

 c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데 이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는 함수가 없어서 조금 아쉬운 애다. std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든 start 함...