10.14

신승빈·2022년 10월 14일
0

KGCA 수업

목록 보기
50/128

정점 변환

Object는 다수의 Local Vertex로 이루어져있고, Local Vertex는 Object Matrix의 SRT변환에 의해 World Vertex로 변환될 수 있음
이렇게 변환된 World Vertex는 다수의 변환을 거쳐 NDC 좌표계 내부에 들어야 출력될 수 있음
LocalVectorWorldMatrixViewMatrixProjectileMatrix=NDCCoordinateLocal Vector * World Matrix * View Matrix * Projectile Matrix = NDC Coordinate

View Matrix

임의의 Object는 SRT순으로 Transform한다.
MObjectWorld=IWorld×MObjectScaleWorld×MObjectRotateWorld×MObjectTranslateWorldMCameraWorld=IWorld×MCameraRotateWorld×MCameraTranslateWorldM_{Object}^{World} = I_{World} \times M_{Object Scale}^{World} \times M_{Object Rotate}^{World} \times M_{Object Translate}^{World} \newline M_{Camera}^{World} = I_{World} \times M_{Camera Rotate}^{World} \times M_{Camera Translate}^{World}

Object의 이동을 간단한 표현으로 변경한다
MObjectTransformWorld=MObjectScaleWorld×MObjectRotateWorld×MObjectTranslateWorldM_{Object Transform}^{World} = M_{Object Scale}^{World} \times M_{Object Rotate}^{World} \times M_{Object Translate}^{World}

Camera가 이동한 반대 방향으로 모든 Object를 이동 시킨다
MObjectWorld×MCameraTranslateWorld1=IWorld×MObjectTransformWorld×MCameraTranslateWorld1MCameraWorld×MCameraTranslateWorld1=IWorld×MCameraRotateWorldM_{Object}^{World} \times {M_{Camera Translate}^{World}}^{-1} = I_{World} \times M_{Object Transform}^{World} \times {M_{Camera Translate}^{World}}^{-1} \newline M_{Camera}^{World} \times {M_{Camera Translate}^{World}}^{-1} = I_{World} \times M_{Camera Rotate}^{World}

Camera가 회전한 반대 방향으로 모든 Object를 회전시킨다
MObjectWorld×MCameraTranslateWorld1×MCameraRotateWorld1=IWorld×MObjectTransform×MCameraTranslateWorld1×MCameraRotateWorld1MCameraWorld×MCameraTranslateWorld1×MCameraRotateWorld1=IWorldM_{Object}^{World} \times {M_{Camera Translate}^{World}}^{-1} \times {M_{Camera Rotate}^{World}}^{-1} = I_{World} \times M_{Object Transform} \times {M_{Camera Translate}^{World}}^{-1} \times {M_{Camera Rotate}^{World}}^{-1} \newline M_{Camera}^{World} \times {M_{Camera Translate}^{World}}^{-1} \times {M_{Camera Rotate}^{World}}^{-1} = I_{World}

이제 Camera는 원점에 위치하게 되고 모든 Object는 Camera Coordinate를 기준으로 배치가 되므로 다음이 View Matrix가 된다
IWorld=MObjectWorld×MCamera1=MViewMObjectWorld=MObjectTransformWorldMCamera=MCameraRotateWorld×MCameraTranslateWorldI_{World} = M_{Object}^{World} \times M_{Camera}^{-1} = M_{View} \newline M_{Object}^{World} = M_{ObjectTransform}^{World}\newline M_{Camera} = M_{Camera Rotate}^{World} \times M_{Camera Translate}^{World}

View Matrix 생성

초기 인수

Vector3 eye;	// Camera 위치
Vector3 vUp;	// y축을 의미하는 임의의 벡터
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=[100001000010eye.xeye.yeye.z1]MCameraTranslate1=[100001000010eye.xeye.yeye.z1]M_{Camera Translate} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ eye.x & eye.y & eye.z & 1 \end{bmatrix} \newline M_{Camera Translate}^{-1} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -eye.x & -eye.y & -eye.z & 1 \end{bmatrix}

MCameraRotate=[xAxis.xxAxis.yxAxis.z0yAxis.xyAxis.yyAxis.z0zAxis.xzAxis.yzAxis.z00001]MCameraRotate1=[xAxis.xyAxis.xzAxis.x0xAxis.yyAxis.yzAxis.y0xAxis.zyAxis.zzAxis.z00001]M_{Camera Rotate} = \begin{bmatrix} xAxis.x & xAxis.y & xAxis.z & 0 \\ yAxis.x & yAxis.y & yAxis.z & 0 \\ zAxis.x & zAxis.y & zAxis.z 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \newline M_{Camera Rotate}^{-1} = \begin{bmatrix} xAxis.x & yAxis.x & zAxis.x & 0 \\ xAxis.y & yAxis.y & zAxis.y & 0 \\ xAxis.z & yAxis.z & zAxis.z 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
행렬을 구성하는 각 벡터는 서로 수직하므로 Transpose연산만으로 역행렬을 구할 수 있음
이때 이동과 변환은 따로 계산하여야 한다

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글