Study/Etc.

Computer Graphics (Real-Time Rendering - chapter 3: Transformation)

빨간당무 2011. 4. 27. 01:51
이 문서는 개인적인 공부를 위해 정리된 내용입니다. 다소 오류가 존재할 수 있습니다.



= 목차
- 기본 변환 (Basic Transforms)
-- 평행 이동 (Translation) - 가장 많이 이용하는 변환
-- 회전 (Rotation) - 가장 많이 이용하는 변환
-- 크기 조정 (Scaling)
-- 쉬어 변환 (Shearing)
-- 변환의 결합 (Concatenation of Transforms)
-- 강체 변환 (The Rigid Body Transform)
-- 법선 벡터 변환 (Normal Transform)
-- 역변환 계산 (Computation of Inverse)
- 특수한 행렬 변환과 연산 (Special Matrix Transforms and Operation)
-- Eular 변환 (The Euler Transform)
-- Euler 변환으로부터 매개변수 추출 (Extracting Parameters from the Euler Transform)
-- 행렬 분해 (Matrix Decomposition) 
-- 임의의 축 주위로 회전 이동 (Rotation About an Arbitrary Axis)
- 사원수 (Quaternions)
-- 복소수 (Complex Number)
-- 사원수 (Quaternion)
-- 수학적 배경 (Mathematical Background)
-- 사원수 변환 (Quaternion Transforms)
- 정점 혼합 (Vertex Blending)
- 투영 (Projection)
-- 직교 투영 (Orthographic Projection)
-- 원근 투영 (Perspective Projection)
-  정리 (Summary)

= 동차 표기법 (Homogeneous Notation)
- 점과 벡터를 동일한 형태로 표현 (점과 벡터를 구분하기 위해 w가 없다면 벡터, w가 있다면 점)
- 물체의 변환은 이동, 크기, 회전 등의 변환 행렬의 결합
- 동차 행렬을 이용하면 모든 변환 행렬을 4X4 행렬 곱에 의한 변환으로 표현 가능
- 연산을 최소화하여 연산 시간을 단축

= 평행 이동
- 점만 변환 시킴, 벡터는 영향을 받지 않음

= 회전
- 특정한 점 p(피펫팅)를 기준으로 z 축을 따라 Φ라디안 만큼 회전 

= 크기 조정
- 반사 행렬 (Reflection Matrix) : s의 값 중 두개가 -1인 경우
- 거울 행렬 (Mirror Matrix) : s의 값이 모두 -1인 경우
- 특정 반향으로의 크기 조정

= 쉬어(Shear) 변환
- 직사각형 모향을 평행사변형 처럼 변환하는 것

= 변환의 결합 
- 2개의 변환을 나타내는 Matrix를 곱함
- 행렬의 결합은 순서 종속적 (비가환적)
- 먼저 이루어 지는 변환 행렬이 가장 뒷부분에 위치

= 강체 변환
- 물체의 위치와 방향만 변하는 변환 : 평행이동, 회전
- 물체의 모양에는 영향을 주지 않음

= 법선 벡터 변환
- 법선 벡터 변환행렬(N) : 기하구조 변환에 사용된 특정 행렬(M)의 역행렬의 전치 행렬
- 변환행렬이 직교 (Orthogonal) 행렬인 경우는 N=M
-- 회전, 평행이동, 회전과 평행이동이 결합된 행렬
-- 회전, 평행이동, 등방형 크기조정 변환과 이들이 결합된 행렬

= 역변환 계산
- 역변환은 여러 가지 경우에 필요 : 예) 좌표계간에 상호변환
- 역 행렬을 구하는 방법 : 단일, 단순 변환일 경우, 직교 행렬인 경우, 그 외의 경우(Gauss 소거법, Gauss-Jordan 방법, LU분해법등)

= 오일러 (Euler) 변환
- 방향지정 행렬 (Orientation matrix)이 Eular각으로 지정됨
-- hear(yaw) : Y축, pitch : X축, roll : Z축

= 오일러 변환의 문제점
- 행렬로 부터 원래 각도 추출이 어려움
- 회전 변환은 순서에 의존적 - 세개의 Euler 각이 독립적이지 않음
- 자연스러운 보간을 구현하기 어려움
- Gimbal Lock 발생 (의미없는 변환이 발생)

= 행렬 분해 (Matrix Decomposition)
- 결합된 변환 행렬에서 독립, 단순 변환 행렬을 분해
-- 어떤 변환들이 결합되었는지 확인할 경우
-- 대상물의 scaling, rotation, translation 매개변수 값들이 필요할 때
-- 특정 시스템이 필요로 하는 변환 구성할 때
-- 특정 변환을 제거할 때

= 임의의 축 주위로 회전 이동 (Case 1)
- 정규화 된 회전축 r 중심으로 a 라디안 만큼 회전 시키는 경우
-- 1. 회전 축 r과 서로 수직을 이루는 두개의 벡터 구하기
-- 2. R축이 x축과 일치하도록 변환
-- 3. 회전 각 만큼 회전 변화
-- 4. 원래의 r축으로 역변환

= 임의의 축 주위로 회전 이동 (Case 2)
- 임의의 축으로 객체가 회전할 경우
-- 1. 객체의 중심적 P0를 원점으로 욺김
-- 2. 임의의 축 u를 정규화
-- 3. 축 u를 z-축과 일치시킴
-- 4. z-축 중심으로 주어진 각 만큼 회전
-- 5. 역회전을 수행하여 회전축을 원래로 돌림
-- 6. 회전축을 원래 자리로 옮겨 놓은 역변환을 적용

= 복소수 (복소수 : 실수와 허수가 결합된 공간; 허수 : 제곱하면 음수가 나오는 값)
- 임의의 복소수(위치) : C = X + Y i
- 단위 복소수(방향;회전) : R = cosθ + i sinθ

= 복소수와 2차원상의 회전
- 복소수와 2차원 회전의 연관성 : 임의의 복소수와 단위 복소수를 곱한 결과는 2차원 행벡터(x,y)에 2차원 회전행렬을 곱한 것과 같음 (부호차이는 회전방향의 차이)

= 사원수 (Quaternion)
- 복소수를 확장한 것으로, 4개의 성분(허수 성분 3개와 실수 성분 1개)을 가지며 벡터처럼 표현 : 회전 전용임
- 벡터와 구분하기 위해 hat을 씌워 표시 (q 위에 둥근 모자를 씌워서 표기)
- 사원수는 변환을 구성하는 강력한 도구로서 회전이나 방향지정 시에 뛰어난 성능을 발휘 => Eular 변환의 단점이 해결됨
- 3차원 공간에서 특정 사원수에 단위 사원수를 곱한 것이 3차원 공간에서의 회전에 대응

= 사원수 연산
- 곱셈 법칙 (Laws of Multiplication) : 선형성 (Linearity), 결합법칙 (Associativity)

= 사원수 변환
- 어떠한 형태의 3차원 회전이든 자유롭게 표현가능
- 단위사원수를 이용한 표현법은 매우 단순하고 간결함
- 회전변환을 위해 사원수 앞 뒤에 단위사원수와 공액사원소를 곱합

= 행렬 변환
- 회전 외에 다른 변환을 하기 위해 변환함
- 행렬곱셈이 하드웨어로 구현되어 있는 시스템
-- 행렬을 곱하는 것이 사원수를 곱하는 것보다 효율적
-- 사원수를 행렬로 변환하고 연산후에 행렬을 다시 사원수로 변환하는 방법이 필요함

= 선형 보간
- 장점 : 빠른 속도, 짧은 구간에서의 보간에는 좋은 효과를 보임
- 단점 : 선형 보간은 magnitude(=Norm)를 보존하지 않음, 매끄러운 애니메이션 구현이 어려움, 호를 선형보간시 각 구간의 길이가 달라져 버림

= 구선형 보간 (Spherical Linear Interpolation)
- 두개의 단위 사원수, 그리고 매개변수가 정해졌을 때 이들 사이에 보간된 사원수를 계산하는 연산
- 물체의 애니메이션에 유용하나, 카메라 방향을 보간하는데는 좋지 못함
-- 카메라의 "up"벡터가 보간 과정에서 기울어지는 교란효과(disturbing effect)가 생길 수 있음
- 단위 사원수는 4차원 단위 구(hyper-sphere)상의 점을 정의
- 매끄러운 애니메이션 q, r를 잇는 호를 따라서 값들을 보간함으로써 가능함
- SLERP
-- 장점 : 매끄러운 3D animation, 두 방향 사이를 보간하는데 상당히 효과적 (오일러 변환에서는 여러 개의 오일러 각을 변환하는 경우 gimbal lock 발생)
-- 단점 : 둘 이상의 quaternion을 연속으로 보간할 경우 각각의 제어점에서 방향이 갑자기 꺽이는 듯한 경로가 생길 수 있음

= 스플라인 보간
- 부드러운 3차 스플라인을 이용하여 사원수들을 구형으로 보간하는데 사용

= 정점 혼합
- 디지털 캐릭터 관절의 애니메이션
-- 하박과 상박의 두 부분으로 나누어 표현
-- 강체변환을 이용하여 애니메이션 될 수 있음
-- 두 개의 분리된 객체들이 겹쳐져 연결점 생성
-- 문제점
--- 두 개의 분리된 객체들을 사용하므로 연결점이 실제 팔꿈치처럼 보이지 않음
--- 관절을 유연하게 만드는 방법이 필요함
- skinning, enveloping, skeleton-subspace deformation이라고도 함
- 정점 혼합의 가장 단순한 형태 (예)
-- 상박과 하박이 따로 애니메이션 되도록 함
-- 두 객체의 연결 부분을 탄력있는 피부(elastic skin)로 이어줌
-- 탄력 있는 부분 : 하박 행렬에 의해 변환되는 정점들과 상박 행렬에 의해 변환되는 정점들로 구성
- 정점들이 서로 다른 행렬에 의해 변환되는 삼각형이 만들어짐
-- stitching 기법

= 여러 개의 서로 다른 행렬들에 의한 변환
- 각 행렬에 의한 변환시에 가중치 부여 (예)
-- (2/3, 1/3), 정점 변환시 2/3 만큼은 상박의 영향, 1/3 만큼은 하박의 영향을 받음
- 계산 결과 하나로 통합
- 극단적인 예 : 팔 전체가 "탄력적"일 수도 있음
-- 모든 정점들이 하나 이상의 행렬들로부터 양향을 받음
- 정점 혼합 기법 : 정점 p에 서로 다른 뼈들의 결합 행렬들을 적용 한 후 가중치를 곱하여 합산

= 정점 혼합의 실행
- CPU상에서 실행
- 응용단계가 병목인 경우
-- 그래픽스 하드웨어 상에서 수행하도록 하는 것이 좋음
-- 정점 셰이더를 갖춘 하드웨어는 정점 혼합을 할 수 있도록 프로그래밍 가능

= 정점 셰이더의 장점
- 정점 응영처리 효과 가능
- 하드웨어에 의해 가속화
- 팔레트에서 사용가능한 행렬의 최소 개수가 정해짐
- [0, 1] 범위를 벗어나거나 그 합이 1이 되지 않는 가중치를 주는 것도 가능 (과도한 효과도 줄 수 있음)
- bump mapping과 같은 픽셀별 조명 효과 등과 숩게 결합될 수 있음

= 정점 혼합의 문제점
- 정확한 충돌 검출 시 : 변환된 정점들에 접근할 수 있도록 하기 위해 셰이더를 끄고 혼합연산을 CPU상(즉, S/W적으로)에서 해야함
- 원하지 않는 folding(접힘 현상), 비틀림, 자기교차 발생

= 투영
- 한 장면에 잇는 모든 물체들을 평면이나 단순한 볼륨상에 투영
-- 투영을 제외한 변환들 : w성분에 영향을 조지 않음, 4X4 행렬에서 마지막 행은 항상 (0 0 0 1)
- 투영의 종류
-- 직교 투영 (Orthographic Projection) (원근감 미적용)
--- 좀더 단순한 투영으로서 w성분에 영향을 주지 않음
-- 투시 투영 (Perspective Projection) (원근감 적용)
--- 행렬의 마지막 행은 특정 수치를 가지는 벡터나 점을 포함
--- 동차화 과정이 필요 : w는 1이 아닐 수도 있음, 동차화되지 않은 점들을 얻기 위해 w로 나눠주는 작업 필요

= 좌표계 (Coordinate System)
- 오른손 좌표계
-- 관측자가 음의 Z축을 따라서 물체를 바라봄
-- Y축은 머리방향으로 가리킴
-- X축은 오른쪽을 가리킴
- 왼손 좌표계 (Computer Graphics에서 사용됨)
-- 관측자가 양의 Z축을 따라서 물체를 바라봄

= 직교 투영
- 평행선은 투영을 한 후에도 평행성을 유지
- 단순한 직교 투영 행렬의 예
-- 한 점의 x성분과 y성분은 그대로 두고 z성분만 0으로 만들어 줌 : 하나의 점을 z=0인 평면상에 수직으로 투영

= 직교 투영의 문제점
- 3차원을 2차원으로 축소하였을 경우 축소된 차원 다시 복원 못함
- 양의 z값을 가지는 점과 음의 z값을 가지는 점들이 하나의 투영면으로 투영
- 해결방법 : z값을 n(근평면)부터 f(원평면)까지 특정 구간으로 제한
- 직교 투영을 수행하는 일반적인 행렬
-- 여섯 튜플 형식으로 표현
-- (l, r, b, t, n, f) : 왼쪽, 오른쪽, 아래, 위, 근평면, 원평면
-- 주의사항 : 관측자는 이 볼륨공간을 음의 z방향으로 내려다보고 있으므로 n>f가 되도록 해야 함
- 축에 정렬된 정육면체 (canonical view voume)
-- (-1, -1, -1)과 (1, 1, 1)의 좌표를 가지는 모서리를 가짐
-- 정규화된 장치 좌표라고 함
-- 클리핑에 훨씬 효율적임
- 축에 정렬된 정육면체상에서 AABB(Axis Aligned Bouding Box)를 변환하는 모습
- 직교 투영 변환은 항상 거울 변환을 포함
-- AABB를 정의하는 방법에서는 원점 값이 근점 값보다 작기 때문임

= 투시 투영
- 사람이 사물을 보고 이해하는 방식과 유사 : 멀리 있는 물체가 더 작게 보이는 원리
- 특징 : 평행성이 변환된 후 평행하지 않게 됨, 진행이 계속되면 한 점에서 수렴
- 투시 투영의 경우도 직교 투영과 마찬가지로 z값은 없어지지만 z값을 추축할 수 있음

= 시야 (Field of View) (화각 = 시야각)
- 인간의 눈은 컴퓨터 화면과 비교할 때 복잡한 시야를 가짐
- 시야 계산식 : Φ = 2arctan(w/(2d)), Φ : 시야, w : 시선에 수직인 물체의 폭, d : 물체까지의 거리
- 넓은 시야각의 장단점
-- 장점 : 주변 상황에 대한 더 많은 정보를 제공
-- 단점 : 물체가 왜곡되어 보일 수 있음

= 정리
- 정점 혼합
-- 여러 객체를 연결할 경우 연결 부분을 좀더 유연하게 만들어 주는 기법
- 투영
-- 실제 장면들을 렌더링 하기 위해서는 장면의 모든 물체들을 투영해야 함
-- 직교 투영 : z축의 값을 0으로 하여 3차원의 물체를 2차원으로 만드는 단순한 투영기법
-- 투시 투영 : 사람이 사물을 보고 이해하는 방식, 떨어진 거리에 따라 크기가 달라짐

referece : 리얼-타임 렌더링 2판 (Real-Time Rendering), 신병석, 오경수 공역, 정보문화사