상세 컨텐츠

본문 제목

카메라의 뷰 좌표계와 LookAt 행렬 유도하기

게임엔진공부

by 뿡뿡이형 2019. 12. 19. 20:42

본문

뷰 좌표계란

- 월드를 카메라를 기준으로 본 좌표계

1. 카메라의 오일러 회전 값을 알고있는 경우.

 - 카메라의 회전 행렬 (TMatrix)구하고

 - 카메라의 이동행렬(RMatrix)도 구한다

 - ViewMatrix = TMatrix * RMatrix (역행렬)

2. 카메라가 향해야 하는 물체의 위치를 알고 있는 경우(Look At)

1. (목표물 - 카메라)를 정규화하여 Forward벡터를 구한다.

2. Forward벡터와 월드의 Up(0,1,0)을 외적하여 Right벡터도 구해준다.

3. 얻은 Forward벡터와 Right벡터를 외적하면 카메라의 Up벡터도 구할 수 있다.

X는 Forward Y는Right Z는 Up벡터이다.

출처 : http://blog.naver.com/destiny9720/221423054915


LookAt 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Matrix4x4 Camera::GetViewMatrix(GameObject & InTargetObject) const
{
    //목표물 - 카메라를 정규화 해 viewZ 벡터를 구한다.
    Vector3 viewZ = (Transform.Position - InTargetObject.GetTransform().Position).Normalize();
    //월드의 Up벡터와 아까구한 viewZ벡터를 외적하여 viewX벡터를 구한다.
    Vector3 viewX = Vector3::UnitY.Cross(viewZ).Normalize();
    if (viewX.IsZero())
    {
        viewX = Vector3::UnitX;
    }
    //viewZ벡터와 viewX벡터를 외적해 나머지 viewY벡터도 구한다
    Vector3 viewY = viewZ.Cross(viewX).Normalize();
 
    //viewX, viewY, viewZ를 이용하여 rotation 행렬을 만들어주고
    Matrix4x4 virMat = Matrix4x4(Vector4(viewX, false), Vector4(viewY, false), Vector4(viewZ, false), Vector4::UnitW).Tranpose();
    //뷰 좌표계므로 Translate행렬에 포지션 값은 -를 해준다.
    Matrix4x4 vitMat = Matrix4x4(Vector4::UnitX, Vector4::UnitY, Vector4::UnitZ, Vector4(-Transform.Position));
 
    //행렬은 SRT순으로 곱해야하는데 뷰 좌표계엔 Scale값은 필요 없으므로 R*T를 해준다.
    return virMat * vitMat;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

관련글 더보기