카메라 클래스 - 오일러

반응형

이번에는 오일러를 바탕으로 한 간단한 카메라 클래스를 만들었다.
카메라에서 중요한건 회전이다. 이 회전처리하는 부분을 잘 보도록 하자.
뷰행렬           x     y    z
                 | rx   ux   lx   0   |
      V =      | ry    uy   ly   0   |
                 | rz   uz   lz   0   |
                 |-pr  -pu  -pl  1   |

void CameraEular::GetViewMatrix(D3DXMATRIX* vmat)
{
 // right, up, look 벡터들를 모두 단위벡터로 정규화.
 D3DXVec3Normalize(&lookAt_, &lookAt_);
 D3DXVec3Cross(&up_, &lookAt_, &right_); // up

 D3DXVec3Normalize(&up_, &up_);
 D3DXVec3Cross(&right_, &up_, &lookAt_); // right

 D3DXVec3Normalize(&right_, &right_);

 // 뷰행렬
 float x = -D3DXVec3Dot(&right_, &pos_);
 float y = -D3DXVec3Dot(&up_, &pos_);
 float z = -D3DXVec3Dot(&lookAt_, &pos_);

 (*vmat)(0,0) = right_.x; (*vmat)(0, 1) = up_.x; (*vmat)(0, 2) = lookAt_.x; (*vmat)(0, 3) = 0.0f;
 (*vmat)(1,0) = right_.y; (*vmat)(1, 1) = up_.y; (*vmat)(1, 2) = lookAt_.y; (*vmat)(1, 3) = 0.0f;
 (*vmat)(2,0) = right_.z; (*vmat)(2, 1) = up_.z; (*vmat)(2, 2) = lookAt_.z; (*vmat)(2, 3) = 0.0f;
 (*vmat)(3,0) = x;        (*vmat)(3, 1) = y;     (*vmat)(3, 2) = z;     (*vmat)(3, 3) = 1.0f;
}

이것 이외에는 카메라에 빛을 넣기위해 정점에 노말값을 집어 넣는 과정에서
이전처럼 점을 공유해서 사용할 수 없어 정점을 모두 만들어서 각각에 노말을 넣어주는 부분정도가 바뀌었다.

.fx
PS_Input VS( VS_Input input )
{
 PS_Input output = (PS_Input)0;
 output.pos = mul( float4(input.pos, 1), matWorld );
 output.pos = mul( output.pos, mul( matView, matProjection ) );
 output.normal = mul( input.normal, (float3x3)matWorld );
 return output;
}

float4 PS( PS_Input input ) : SV_Target
{
 float3 lightDirection = float3(1.0f, -1.0f, 1.0f);  // 빛의 방향
 float4 cAmbient = float4(0.2f, 0.2f, 0.2f, 1.0f);  // 기본 밝기
 
 // 0~1로 제한해주는 포화연한
 return saturate(dot(input.normal, -normalize(lightDirection))) * diffuseColor + cAmbient;
}


'Study > Directx 10' 카테고리의 다른 글

3ds 로드, 가상트랙볼  (0) 2010.05.09
카메라 클래스 - 쿼터니온  (5) 2010.05.08
Depth Stencil ( orbit )  (0) 2010.05.05
육면체 렌더링  (0) 2010.05.05
삼각형 렌더링  (0) 2010.05.05
TAGS.

Comments