본문 바로가기
Directx12 3D 프로그래밍 입문/5. 렌더링 파이프 라인

5.14 1 ~ 8번 연습문제

by ftftgop3 2024. 2. 8.

1. 프라미드 정점 목록, 색인 목록

색인 (vo v3 v1) (v1, v3, v2) (v3 v4 v0)(v0 v4 v1)(v1 v4 v2) (v2 v3 v4)

정정 목록 : v0 {0,0,0} v1 {1, 0, 0} v2{1, 0,1} v3{0,0,1} v4 {0.5,1,0.5}

 

2. 두 도형의 정점 색인을 하나로 표현

정점 목록

a 형태 정점 목록 : v0 {0,0,0} v1{0.2, 1, 0} v2{1.2, 1, 0} v3{0.8, 0.2, 0}

b 형태 정점 목록 : v4{5, 0.5, 0} v5{6,0.5,0}, v6{5.8, 0.25,0} v7{5,0,0}

v8{4.8,0.25,0} v9{4,0.5,0} v10{4.8, 0.75,0} v11{5,1,0} v12{5.8, 0.75,0}

색인 목록

(v0 v1 v2) , (v0 v2 v3)

(v4 v5 v6) (v4, v6, v7) (v4, v7, v8) (v4, v8, v9) (v4, v9, v10) (v4, v10, v11)

(v4, v11, v12)

 

3. 카메라가 세계 좌표계 기준으로 (-20,35,-50), 대상점 (10,0,30)

셰계공간 상향 벡터(0,1,0) 카메라이 시야 행렬 값은

//연습문제 3 
     pos = XMVectorSet(-20, 35, -50, 1.0f);
     target = XMVectorSet(10.0f, 0.0f, 30.0f, 0.0f);
     up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
    XMMATRIX view = XMMatrixLookAtLH(pos, target, up);

 

4. 수직 시야각 45도, 종횡비 a = 4/3 , 가까운 평면 n =1, 먼거리 100

P = XMMatrixPerspectiveFovLH(0.25f * MathHelper::Pi, 4/3, 1.0f, 100.0f);

5. 시야 창 높이 4, 수직 시야각 60도 시야창과 원점의 거리 d의 값은 ?

$$ tan30 = \frac{2}{d}\\d = 2cot(30)\\d=3.464 $$

 

6. 다음 원근 투영 행렬에서 수직 시야각 a, 종횡비 r, 가까운 평면 n 먼 평면 f 를 구해라

$$ \begin{bmatrix}1.866.3 & 0 & 0 & 0 \\0 & 3.73205 & 0 & 0 \\0 & 0 & 1.02564 & 1 \\0 & 0 & -5.12821 & 0 \\\end{bmatrix} $$

자세한 계산 7번 참고

$$ a = 2arctan(1/3.73205) = 30\\r = 3.73205/1.86603 = 1.999\\f = 1.02564n / 1.02564 -1 = 40.0015n\\n = -\frac{-5.12821}{1.02564} = 5\\f = 40.0015 * 5 = 200  $$

 

7.다음과 상수 A, B,C, D 원근 투영 행렬에서

수직 시야각 a, 종횡비 r, 가까운 평면 n 먼 평면 f를 구현 하는 식을 풀어라

$\begin{bmatrix}A & 0 & 0 & 0 \\0 & B & 0 & 0 \\0 & 0 & C & 1 \\0 & 0 & D & 0 \\\end{bmatrix}$

A,B, C D의 식을 풀면 a, r, n, f 를 추출 하는 공식이 나타 난다.

$$ A = \frac{1}{rtan(a/2)}\\B = \frac{1}{tan(a/2)}\\C = \frac{f}{f-n}\\D = \frac{-nf}{f-n}   $$

 

B값을 풀어서 a 값을 구한다

$$ B = \frac{1}{tan(a/2)}\\\frac{1}{B} = tan(a/2)\\arctan(\frac{1}{B}) = arctan(tan(a/2))\\arctan(\frac{1}{B}) = a/2\\2 arctan(\frac{1}{B}) = a $$

arctan(tan(a/2)) = a/2 속성을 이용해서 풀이

 

A 값 풀이 위에서 a 값을 사용

$$ A = \frac{1}{rtan(a/2)}\\\frac{1}{A} = rtan(a/2)\\a = 2arctan\frac{1}{B}\\\frac{1}{A} = rtan(\frac{2arctan\frac{1}{B}}{2})\\\frac{1}{A} = r * \frac{1}{B}\\\frac{B}{A} = r $$

tan(arctan(1/B)) = 1/B 속성을 이용해서 풀이

 

C 식에서 f 식을 추출

$$ C = \frac{f}{f-n}\\ C(f-n)-f = 0\\ Cf-Cn-f = 0\\ Cf - f = Cn\\ (C -1)f = Cn\\ f = \frac{Cn}{C-1} $$

 

D값 구하기

위의 f 식을 넣어줘서 n을 구한 후 f를 구한다.

$$ f = \frac{Cn}{C-1} \ \ D = \frac{-nf}{f-n}\\D(f-n) = -nf \\D(\frac{Cn}{C-1} - n) = -n \frac{Cn}{C-1}\\CnD - nD(C-1) = -Cn^2\\CnD - CnD + nD = -Cn^2\\nD = -Cn^2 \\-\frac{D}{C} = n $$

 

8. 다음 식을 증명 하라 VPTw == VPwT 즉 원근 나누기 전 후에 아핀 행렬을 곱 할 경우

값이 같은지 증명 해라 V = 4차원 벡터, P = 투영 행렬, w = 원근 나누기, T = 아핀 행렬

T 아핀 변환은 w 값에 영향을 주지 않는다

 

$$ (\frac{vP}{(vP)_w})T = \frac{(vPT)}{(vPT)_w} $$

 

		//연습 문제 8 테스트 
    XMVECTOR V = XMVectorSet(1.0f, 1.0f, 2.0f, 0.0f);
    V = XMVector4Transform(V, P);
    XMFLOAT4 wvalue;
    XMStoreFloat4(&wvalue, V);
    wvalue.x = wvalue.x/wvalue.w;//원근 나누기
    wvalue.y = wvalue.y / wvalue.w;
    wvalue.z = wvalue.z / wvalue.w;
    wvalue.w = wvalue.w / wvalue.w;
    
    // Define a 4x4 matrix
    XMMATRIX m = XMMatrixIdentity();

    // Set the matrix to translate by (1, 2, 3)
    m.r[3] = XMVectorSet(1.0f, 2.0f, 3.0f, 1.0f);
    V = XMLoadFloat4(&wvalue);
    V = XMVector4Transform(V, m);
    XMStoreFloat4(&wvalue, V);

    XMVECTOR V2 = XMVectorSet(1.0f, 1.0f, 1.0f, 0.0f);
    V2 = XMVector4Transform(V2, P * m);
    
    XMFLOAT4 wvalue2;
    XMStoreFloat4(&wvalue2, V2);
    wvalue2.x = wvalue2.x / wvalue2.w;//원근 나누기
    wvalue2.y = wvalue2.y / wvalue2.w;
    wvalue2.z = wvalue2.z / wvalue2.w;
    wvalue2.w = wvalue2.w / wvalue2.w;

 

참고 및 내용 인용
프랭크 D 루나 지음, 류광 옮김 
한빛 미디어
Directx 12를 이용한 3D 게임 프로그래밍 입문(2017)