정점 변환
Object는 다수의 Local Vertex로 이루어져있고, Local Vertex는 Object Matrix의 SRT변환에 의해 World Vertex로 변환될 수 있음
이렇게 변환된 World Vertex는 다수의 변환을 거쳐 NDC 좌표계 내부에 들어야 출력될 수 있음
LocalVector∗WorldMatrix∗ViewMatrix∗ProjectileMatrix=NDCCoordinate
View Matrix
임의의 Object는 SRT순으로 Transform한다.
MObjectWorld=IWorld×MObjectScaleWorld×MObjectRotateWorld×MObjectTranslateWorldMCameraWorld=IWorld×MCameraRotateWorld×MCameraTranslateWorld
Object의 이동을 간단한 표현으로 변경한다
MObjectTransformWorld=MObjectScaleWorld×MObjectRotateWorld×MObjectTranslateWorld
Camera가 이동한 반대 방향으로 모든 Object를 이동 시킨다
MObjectWorld×MCameraTranslateWorld−1=IWorld×MObjectTransformWorld×MCameraTranslateWorld−1MCameraWorld×MCameraTranslateWorld−1=IWorld×MCameraRotateWorld
Camera가 회전한 반대 방향으로 모든 Object를 회전시킨다
MObjectWorld×MCameraTranslateWorld−1×MCameraRotateWorld−1=IWorld×MObjectTransform×MCameraTranslateWorld−1×MCameraRotateWorld−1MCameraWorld×MCameraTranslateWorld−1×MCameraRotateWorld−1=IWorld
이제 Camera는 원점에 위치하게 되고 모든 Object는 Camera Coordinate를 기준으로 배치가 되므로 다음이 View Matrix가 된다
IWorld=MObjectWorld×MCamera−1=MViewMObjectWorld=MObjectTransformWorldMCamera=MCameraRotateWorld×MCameraTranslateWorld
View Matrix 생성
초기 인수
Vector3 eye;
Vector3 vUp;
Vector3 target;
외적 이용법
Vector3 zAxis = target - eye;
Vector3 xAxis = vUp.Cross(zAxis);
Vector3 yAxis = zVector.Cross(xAxis);
내적 이용법(그람-슈미트 직교화)
Vector3 zAxis = target - eye;
Vector3 yAxis = vUp - (vUp.Dot(zAxis)) * zAxis;
Vector3 xAxis = yAxis.Cross(zAxis);
View Matrix 계산
MCameraTranslate=⎣⎢⎢⎢⎡100eye.x010eye.y001eye.z0001⎦⎥⎥⎥⎤MCameraTranslate−1=⎣⎢⎢⎢⎡100−eye.x010−eye.y001−eye.z0001⎦⎥⎥⎥⎤
MCameraRotate=⎣⎢⎢⎢⎡xAxis.xyAxis.xzAxis.x0xAxis.yyAxis.yzAxis.y0xAxis.zyAxis.zzAxis.z00001⎦⎥⎥⎥⎤MCameraRotate−1=⎣⎢⎢⎢⎡xAxis.xxAxis.yxAxis.z0yAxis.xyAxis.yyAxis.z0zAxis.xzAxis.yzAxis.z00001⎦⎥⎥⎥⎤
행렬을 구성하는 각 벡터는 서로 수직하므로 Transpose연산만으로 역행렬을 구할 수 있음
이때 이동과 변환은 따로 계산하여야 한다