카메라 클래스 - 오일러
이번에는 오일러를 바탕으로 한 간단한 카메라 클래스를 만들었다.
카메라에서 중요한건 회전이다. 이 회전처리하는 부분을 잘 보도록 하자.
뷰행렬 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 |