Direct3D에서 물체의 출력은 다음과 같은 형식으로 진행됩니다.
VOID Render()
{
// 전 프레임 화면 지우기, 새로 화면에 무언가를 그릴려면 이미 그려져 있는 물체를 모두 지워야 합니다.
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB( 100, 100, 100 ), 1.0f, 0 );
// 화면 시작
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// 광원 설정
SetupLights();
// 카메라 위치, 속성 등 설정
SetupMatrices();
// 물체 표면 색상 설정
SetupMaterial(1.0, 1.0, 0.0, 1.0); // Yellow
// 물체 위치, 회전 등 설정
SetWorldTransformMatrix(0.0f, -30.0f, 0.0f);
DrawBox( 0 );
// 다른 물체들 계속 출력
// 화면 끝
g_pd3dDevice->EndScene();
}
// 실제 화면 출력 시작
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
SetupLight는 화면상의 광원을 설정하는 함수입니다.
VOID SetupLights()
{
// 라이트 설정
// ambient light 하나, directional light 하나 설정
// 우선 directional light를 하나 설정합니다.
D3DXVECTOR3 vecDir;
D3DLIGHT9 light1;
ZeroMemory( &light1, sizeof( D3DLIGHT9 ) );
light1.Type = D3DLIGHT_DIRECTIONAL;
light1.Diffuse.r = 1.0f;
light1.Diffuse.g = 1.0f;
light1.Diffuse.b = 1.0f;
vecDir = D3DXVECTOR3( -10.0f, -170.0f, 1000.0f);
D3DXVec3Normalize( ( D3DXVECTOR3* )&light1.Direction, &vecDir );
light1.Range = 1000.0f;
g_pd3dDevice->SetLight( 0, &light1 );
g_pd3dDevice->LightEnable( 0, TRUE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
// 그리고 ambient light를 켜줍니다.
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
}
광원 설정에 이어 카메라의 위치와 시선 방향, 카메라 초점 거리 및 view angle, aspect ratio 등을 설정해 줍니다. 이 과정에서 D3D device에 view matrix와 projection matrix를 지정해주게 됩니다.
VOID SetupMatrices()
{
// 카메라 위치, 시선 방향 설정, 카메라의 위치 좌표 벡터, 그리고 시선 방향 벡터, 업 벡터로부터 view matrix를 생성하고 이를 D3D device에 설정해준다.
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &g_vEyePos, &vViewPos, &vViewUp );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
// 카메라 view angle, aspect ratio, neat clipping, far clipping 설정, 카메라의 view angle, aspect ratio, near clipping distance, far clipping distance로부터 projection matrix를 구하고 이를 D3D device에 설정해준다.
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, g_fViewAngle, g_fApRatio, 1.0f, 1000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}
계속해서 그려지는 물체의 표면 속성을 지정합니다.
VOID SetupMaterial(float R, float G, float B, float A)
{
// 물체 표면 색상 설정, 물체 표면의 diffuse color, ambient color 설정
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof( D3DMATERIAL9 ) );
mtrl.Diffuse.r = mtrl.Ambient.r = R;
mtrl.Diffuse.g = mtrl.Ambient.g = G;
mtrl.Diffuse.b = mtrl.Ambient.b = B;
mtrl.Diffuse.a = mtrl.Ambient.a = A;
g_pd3dDevice->SetMaterial( &mtrl );
}
마지막으로 drawbox 함수를 호출하여 triangle strip 형태로 지정된 육면체를 화면에 출력합니다.
VOID DrawBox(int index)
{
// 3차원 객체 렌더링, 육면체의 각 면마다 DrawPrimitive 수행, 각 면이 2개의 삼각형으로 구성되므로, 그리는 삼각형 개수는 언제나 2..
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, index + 0, 2 );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, index + 4, 2 );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, index + 8, 2 );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, index + 12, 2 );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, index + 16, 2 );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, index + 20, 2 );
}
'엔진 개발' 카테고리의 다른 글
| 기본 3D 물체의 출력 10. 기하객체 렌더링 (0) | 2009/03/19 |
|---|---|
| 기본 3D 물체의 출력 9. Geometry 초기화 (0) | 2009/03/13 |
| 기본 3D 물체의 출력 8. Direct3D 초기화 (0) | 2009/02/26 |
| 기본 3D 물체의 출력 7. 메인 함수 설명 (0) | 2009/02/25 |
| 기본 3D 물체의 출력 6. 3D 프로그램의 구조 (0) | 2009/02/23 |
| 기본 3D 물체의 출력 5. 컴파일과 실행 (0) | 2009/02/19 |
소스에서 관련 기능을 수행하는 부분은 InitGeometry() 부분입니다. 전부 9개의 육면체를 정의하고 있습니다.
정육면체의 경우 꼭지점이 8개가 있고 각각의 꼭지점은 3개의 면에 속하게 됩니다. 이 때 그려지는 면이 무엇이냐에 따라서 각 꼭지점에 적용되는 법선벡터는 달라지게 됩니다.
여기서는 각 정점의 FVF를 좌표와 법선벡터를 가지도록 정의했기 때문에 한 꼭지점을 3번씩 중복 정의하고 각각의 꼭지점 정의에 3개의 면의 법선벡터가 할당되도록 했습니다.
그래서 정의한 총 꼭지점 수는 8 * 9 * 3 해서 216개가 됩니다.
//-----------------------------------------------------------------------------
// 이름: InitGeometry()
// 설명: 버텍스 버퍼 초기화 등 3차원 물체 기하 데이터 초기화
//-----------------------------------------------------------------------------
HRESULT InitGeometry()
{
// 버텍스 버퍼 생성, 필요한 버텍스 개수만큼의 메모리 공간을 D3D 장치내에 할당한다.
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 216 * sizeof( CUSTOMVERTEX ),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
{
return E_FAIL;
}
버텍스 버퍼를 생성하고 있습니다.
// 버텍스 버퍼에 버텍스 좌표 정보과 법선벡터 정보를 채운다.
// 단위 규격의 정육면체를 구성하는 버텍스의 좌표 정보과 각 버텍스의 법선정보를 채운다.
// 육면체의 버텍스는 8개이지만, 각각의 버텍스가 소속하는 면(3개)이 무엇이냐에 따라 법선벡터가 바뀌므로, 각각 중복되어서 24개로 구성됨
// 총 9개의 육면체를 구성, 총 버텍스 개수 = 24 * 9 = 216
CUSTOMVERTEX* pVertices;
if( FAILED( g_pVB->Lock( 0, 0, ( void** )&pVertices, 0 ) ) )
return E_FAIL;
버텍스 버퍼를 Lock 한후 기하정보를 카피해 줍니다.
버텍스 버퍼는 그래픽 작업 시 여러 프로세스가 동시에 접근하게 되는데, 이렇게 Lock을 해 주면 데이터 이동 중에 다른 프로세스가 접근할 수 없도록 해 줍니다.
// 육면체 1, 바닥판, 윗판
pVertices[ 1].position = D3DXVECTOR3( 50.0f, 1.0f, -25.0f);
pVertices[ 0].position = D3DXVECTOR3(-50.0f, 1.0f, -25.0f);
pVertices[ 2].position = D3DXVECTOR3(-50.0f, -1.0f, -25.0f);
pVertices[ 3].position = D3DXVECTOR3( 50.0f, -1.0f, -25.0f);
pVertices[ 0].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5].position = D3DXVECTOR3( 50.0f, -1.0f, 25.0f);
pVertices[ 4].position = D3DXVECTOR3(-50.0f, -1.0f, 25.0f);
pVertices[ 6].position = D3DXVECTOR3(-50.0f, 1.0f, 25.0f);
pVertices[ 7].position = D3DXVECTOR3( 50.0f, 1.0f, 25.0f);
pVertices[ 4].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9].position = D3DXVECTOR3( 50.0f, 1.0f, 25.0f);
pVertices[ 8].position = D3DXVECTOR3(-50.0f, 1.0f, 25.0f);
pVertices[10].position = D3DXVECTOR3(-50.0f, 1.0f, -25.0f);
pVertices[11].position = D3DXVECTOR3( 50.0f, 1.0f, -25.0f);
pVertices[ 8].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13].position = D3DXVECTOR3( 50.0f, -1.0f, -25.0f);
pVertices[12].position = D3DXVECTOR3(-50.0f, -1.0f, -25.0f);
pVertices[14].position = D3DXVECTOR3(-50.0f, -1.0f, 25.0f);
pVertices[15].position = D3DXVECTOR3( 50.0f, -1.0f, 25.0f);
pVertices[12].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17].position = D3DXVECTOR3(50.0f, 1.0f, 25.0f);
pVertices[16].position = D3DXVECTOR3(50.0f, 1.0f, -25.0f);
pVertices[18].position = D3DXVECTOR3(50.0f, -1.0f, -25.0f);
pVertices[19].position = D3DXVECTOR3(50.0f, -1.0f, 25.0f);
pVertices[16].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21].position = D3DXVECTOR3(-50.0f, -1.0f, 25.0f);
pVertices[20].position = D3DXVECTOR3(-50.0f, -1.0f, -25.0f);
pVertices[22].position = D3DXVECTOR3(-50.0f, 1.0f, -25.0f);
pVertices[23].position = D3DXVECTOR3(-50.0f, 1.0f, 25.0f);
pVertices[20].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
여기까지 해서 육면체 하나가 정의됩니다. 좌표 정의와 법선 정의 각각 4개씩 해서 한면을 정의하게 되고요, 그것이 육면체의 각 면에 대해 각각 정의되면서 6면체 정의가 되는 거고요..
이 때 각 정점을 정의하는 순서에는 다음과 같은 방식이 있습니다.
- Triangle strip을 이용하는 방식
- 정점 1, 2, 3, 4, 5, 6 이 차례로 정의되면 이를 삼각형 1,2,3, 삼각형 2,3,4, 삼각형 3, 4, 5, 삼각형 4, 5, 6 으로 해석하는 방식, 최소 3개의 정점이 정의되어야 하며 인접하여 연결되는 삼각형의 띠를 정의할 수 있다. 정점 n개로 삼각형 n-2개를 표현할 수 있다.
- Triangle Fan을 이용하는 방식
- 정점 1, 2, 3, 4, 5, 6 이 차례로 정의되면 이를 삼각형 1, 2, 3, 삼각형 1, 3, 4, 삼각형 1, 4, 5, 삼각형 1, 5, 6 으로 해석하는 방식, 최소 3개의 정점이 정의되어야 하며 한 점을 중심으로 회전하는 형태로 연결되는 삼각형들을 정의할 수 있다. 정점 n개로 삼각형 n-2개를 표현할 수 있다.
- Triangle List를 이용하는 방식
- 정점 1, 2, 3, 4, 5, 6 이 차례로 정의되었을 경우 이를 삼각형 1, 2, 3 과 삼각형 4, 5, 6으로 각각 해석하는 방식, 최소 3개의 정점이 3의 배수만큼 정의되어야 한다. triangle strip이나 triangle fan과는 달리 삼각형들이 아무런 연관관계 없이 나열되어 있을때 사용할 수 있다.
여기서 삼각형들의 정의는 triangle strip 형태로 정의되어 있습니다. 육면체의 각 면을 2개의 삼각형으로 보시면 되고요, 이를 정점 4개로 구성된 triangle strip 형태로 정의했습니다.
// 육면체 2, 기둥
pVertices[ 1 + 24].position = D3DXVECTOR3( 2.0f, 30.0f, -2.0f);
pVertices[ 0 + 24].position = D3DXVECTOR3(-2.0f, 30.0f, -2.0f);
pVertices[ 2 + 24].position = D3DXVECTOR3(-2.0f, -30.0f, -2.0f);
pVertices[ 3 + 24].position = D3DXVECTOR3( 2.0f, -30.0f, -2.0f);
pVertices[ 0 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 24].position = D3DXVECTOR3( 2.0f, -30.0f, 2.0f);
pVertices[ 4 + 24].position = D3DXVECTOR3(-2.0f, -30.0f, 2.0f);
pVertices[ 6 + 24].position = D3DXVECTOR3(-2.0f, 30.0f, 2.0f);
pVertices[ 7 + 24].position = D3DXVECTOR3( 2.0f, 30.0f, 2.0f);
pVertices[ 4 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 24].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 24].position = D3DXVECTOR3( 2.0f, 30.0f, 2.0f);
pVertices[ 8 + 24].position = D3DXVECTOR3(-2.0f, 30.0f, 2.0f);
pVertices[10 + 24].position = D3DXVECTOR3(-2.0f, 30.0f, -2.0f);
pVertices[11 + 24].position = D3DXVECTOR3( 2.0f, 30.0f, -2.0f);
pVertices[ 8 + 24].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 24].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 24].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 24].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 24].position = D3DXVECTOR3( 2.0f, -30.0f, -2.0f);
pVertices[12 + 24].position = D3DXVECTOR3(-2.0f, -30.0f, -2.0f);
pVertices[14 + 24].position = D3DXVECTOR3(-2.0f, -30.0f, 2.0f);
pVertices[15 + 24].position = D3DXVECTOR3( 2.0f, -30.0f, 2.0f);
pVertices[12 + 24].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 24].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 24].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 24].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 24].position = D3DXVECTOR3(2.0f, 30.0f, 2.0f);
pVertices[16 + 24].position = D3DXVECTOR3(2.0f, 30.0f, -2.0f);
pVertices[18 + 24].position = D3DXVECTOR3(2.0f, -30.0f, -2.0f);
pVertices[19 + 24].position = D3DXVECTOR3(2.0f, -30.0f, 2.0f);
pVertices[16 + 24].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 24].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 24].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 24].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 24].position = D3DXVECTOR3(-2.0f, -30.0f, 2.0f);
pVertices[20 + 24].position = D3DXVECTOR3(-2.0f, -30.0f, -2.0f);
pVertices[22 + 24].position = D3DXVECTOR3(-2.0f, 30.0f, -2.0f);
pVertices[23 + 24].position = D3DXVECTOR3(-2.0f, 30.0f, 2.0f);
pVertices[20 + 24].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 24].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 24].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 24].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 3, 중간 좌우방향 긴 막대 모양 육면체
pVertices[ 1 + 48].position = D3DXVECTOR3( 12.0f, 1.5f, -1.5f);
pVertices[ 0 + 48].position = D3DXVECTOR3(-12.0f, 1.5f, -1.5f);
pVertices[ 2 + 48].position = D3DXVECTOR3(-12.0f, -1.5f, -1.5f);
pVertices[ 3 + 48].position = D3DXVECTOR3( 12.0f, -1.5f, -1.5f);
pVertices[ 0 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 48].position = D3DXVECTOR3( 12.0f, -1.5f, 1.5f);
pVertices[ 4 + 48].position = D3DXVECTOR3(-12.0f, -1.5f, 1.5f);
pVertices[ 6 + 48].position = D3DXVECTOR3(-12.0f, 1.5f, 1.5f);
pVertices[ 7 + 48].position = D3DXVECTOR3( 12.0f, 1.5f, 1.5f);
pVertices[ 4 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 48].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 48].position = D3DXVECTOR3( 12.0f, 1.5f, 1.5f);
pVertices[ 8 + 48].position = D3DXVECTOR3(-12.0f, 1.5f, 1.5f);
pVertices[10 + 48].position = D3DXVECTOR3(-12.0f, 1.5f, -1.5f);
pVertices[11 + 48].position = D3DXVECTOR3( 12.0f, 1.5f, -1.5f);
pVertices[ 8 + 48].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 48].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 48].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 48].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 48].position = D3DXVECTOR3( 12.0f, -1.5f, -1.5f);
pVertices[12 + 48].position = D3DXVECTOR3(-12.0f, -1.5f, -1.5f);
pVertices[14 + 48].position = D3DXVECTOR3(-12.0f, -1.5f, 1.5f);
pVertices[15 + 48].position = D3DXVECTOR3( 12.0f, -1.5f, 1.5f);
pVertices[12 + 48].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 48].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 48].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 48].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 48].position = D3DXVECTOR3(12.0f, 1.5f, 1.5f);
pVertices[16 + 48].position = D3DXVECTOR3(12.0f, 1.5f, -1.5f);
pVertices[18 + 48].position = D3DXVECTOR3(12.0f, -1.5f, -1.5f);
pVertices[19 + 48].position = D3DXVECTOR3(12.0f, -1.5f, 1.5f);
pVertices[16 + 48].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 48].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 48].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 48].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 48].position = D3DXVECTOR3(-12.0f, -1.5f, 1.5f);
pVertices[20 + 48].position = D3DXVECTOR3(-12.0f, -1.5f, -1.5f);
pVertices[22 + 48].position = D3DXVECTOR3(-12.0f, 1.5f, -1.5f);
pVertices[23 + 48].position = D3DXVECTOR3(-12.0f, 1.5f, 1.5f);
pVertices[20 + 48].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 48].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 48].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 48].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 4, 중간 앞뒤방향 긴 막대 모양 육면체
pVertices[ 1 + 72].position = D3DXVECTOR3( 1.5f, 1.5f, -12.5f);
pVertices[ 0 + 72].position = D3DXVECTOR3(-1.5f, 1.5f, -12.5f);
pVertices[ 2 + 72].position = D3DXVECTOR3(-1.5f, -1.5f, -12.5f);
pVertices[ 3 + 72].position = D3DXVECTOR3( 1.5f, -1.5f, -12.5f);
pVertices[ 0 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 72].position = D3DXVECTOR3( 1.5f, -1.5f, 12.5f);
pVertices[ 4 + 72].position = D3DXVECTOR3(-1.5f, -1.5f, 12.5f);
pVertices[ 6 + 72].position = D3DXVECTOR3(-1.5f, 1.5f, 12.5f);
pVertices[ 7 + 72].position = D3DXVECTOR3( 1.5f, 1.5f, 12.5f);
pVertices[ 4 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 72].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 72].position = D3DXVECTOR3( 1.5f, 1.5f, 12.5f);
pVertices[ 8 + 72].position = D3DXVECTOR3(-1.5f, 1.5f, 12.5f);
pVertices[10 + 72].position = D3DXVECTOR3(-1.5f, 1.5f, -12.5f);
pVertices[11 + 72].position = D3DXVECTOR3( 1.5f, 1.5f, -12.5f);
pVertices[ 8 + 72].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 72].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 72].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 72].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 72].position = D3DXVECTOR3( 1.5f, -1.5f, -12.5f);
pVertices[12 + 72].position = D3DXVECTOR3(-1.5f, -1.5f, -12.5f);
pVertices[14 + 72].position = D3DXVECTOR3(-1.5f, -1.5f, 12.5f);
pVertices[15 + 72].position = D3DXVECTOR3( 1.5f, -1.5f, 12.5f);
pVertices[12 + 72].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 72].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 72].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 72].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 72].position = D3DXVECTOR3(1.5f, 1.5f, 12.5f);
pVertices[16 + 72].position = D3DXVECTOR3(1.5f, 1.5f, -12.5f);
pVertices[18 + 72].position = D3DXVECTOR3(1.5f, -1.5f, -12.5f);
pVertices[19 + 72].position = D3DXVECTOR3(1.5f, -1.5f, 12.5f);
pVertices[16 + 72].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 72].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 72].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 72].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 72].position = D3DXVECTOR3(-1.5f, -1.5f, 12.5f);
pVertices[20 + 72].position = D3DXVECTOR3(-1.5f, -1.5f, -12.5f);
pVertices[22 + 72].position = D3DXVECTOR3(-1.5f, 1.5f, -12.5f);
pVertices[23 + 72].position = D3DXVECTOR3(-1.5f, 1.5f, 12.5f);
pVertices[20 + 72].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 72].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 72].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 72].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 5, 중간 박스
pVertices[ 1 + 96].position = D3DXVECTOR3( 5.5f, 5.5f, -5.5f);
pVertices[ 0 + 96].position = D3DXVECTOR3(-5.5f, 5.5f, -5.5f);
pVertices[ 2 + 96].position = D3DXVECTOR3(-5.5f, -5.5f, -5.5f);
pVertices[ 3 + 96].position = D3DXVECTOR3( 5.5f, -5.5f, -5.5f);
pVertices[ 0 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 96].position = D3DXVECTOR3( 5.5f, -5.5f, 5.5f);
pVertices[ 4 + 96].position = D3DXVECTOR3(-5.5f, -5.5f, 5.5f);
pVertices[ 6 + 96].position = D3DXVECTOR3(-5.5f, 5.5f, 5.5f);
pVertices[ 7 + 96].position = D3DXVECTOR3( 5.5f, 5.5f, 5.5f);
pVertices[ 4 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 96].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 96].position = D3DXVECTOR3( 5.5f, 5.5f, 5.5f);
pVertices[ 8 + 96].position = D3DXVECTOR3(-5.5f, 5.5f, 5.5f);
pVertices[10 + 96].position = D3DXVECTOR3(-5.5f, 5.5f, -5.5f);
pVertices[11 + 96].position = D3DXVECTOR3( 5.5f, 5.5f, -5.5f);
pVertices[ 8 + 96].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 96].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 96].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 96].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 96].position = D3DXVECTOR3( 5.5f, -5.5f, -5.5f);
pVertices[12 + 96].position = D3DXVECTOR3(-5.5f, -5.5f, -5.5f);
pVertices[14 + 96].position = D3DXVECTOR3(-5.5f, -5.5f, 5.5f);
pVertices[15 + 96].position = D3DXVECTOR3( 5.5f, -5.5f, 5.5f);
pVertices[12 + 96].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 96].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 96].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 96].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 96].position = D3DXVECTOR3(5.5f, 5.5f, 5.5f);
pVertices[16 + 96].position = D3DXVECTOR3(5.5f, 5.5f, -5.5f);
pVertices[18 + 96].position = D3DXVECTOR3(5.5f, -5.5f, -5.5f);
pVertices[19 + 96].position = D3DXVECTOR3(5.5f, -5.5f, 5.5f);
pVertices[16 + 96].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 96].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 96].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 96].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 96].position = D3DXVECTOR3(-5.5f, -5.5f, 5.5f);
pVertices[20 + 96].position = D3DXVECTOR3(-5.5f, -5.5f, -5.5f);
pVertices[22 + 96].position = D3DXVECTOR3(-5.5f, 5.5f, -5.5f);
pVertices[23 + 96].position = D3DXVECTOR3(-5.5f, 5.5f, 5.5f);
pVertices[20 + 96].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 96].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 96].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 96].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 6
pVertices[ 1 + 120].position = D3DXVECTOR3( 2.7f, 2.7f, -2.7f);
pVertices[ 0 + 120].position = D3DXVECTOR3(-2.7f, 2.7f, -2.7f);
pVertices[ 2 + 120].position = D3DXVECTOR3(-2.7f, -2.7f, -2.7f);
pVertices[ 3 + 120].position = D3DXVECTOR3( 2.7f, -2.7f, -2.7f);
pVertices[ 0 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 120].position = D3DXVECTOR3( 2.7f, -2.7f, 2.7f);
pVertices[ 4 + 120].position = D3DXVECTOR3(-2.7f, -2.7f, 2.7f);
pVertices[ 6 + 120].position = D3DXVECTOR3(-2.7f, 2.7f, 2.7f);
pVertices[ 7 + 120].position = D3DXVECTOR3( 2.7f, 2.7f, 2.7f);
pVertices[ 4 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 120].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 120].position = D3DXVECTOR3( 2.7f, 2.7f, 2.7f);
pVertices[ 8 + 120].position = D3DXVECTOR3(-2.7f, 2.7f, 2.7f);
pVertices[10 + 120].position = D3DXVECTOR3(-2.7f, 2.7f, -2.7f);
pVertices[11 + 120].position = D3DXVECTOR3( 2.7f, 2.7f, -2.7f);
pVertices[ 8 + 120].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 120].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 120].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 120].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 120].position = D3DXVECTOR3( 2.7f, -2.7f, -2.7f);
pVertices[12 + 120].position = D3DXVECTOR3(-2.7f, -2.7f, -2.7f);
pVertices[14 + 120].position = D3DXVECTOR3(-2.7f, -2.7f, 2.7f);
pVertices[15 + 120].position = D3DXVECTOR3( 2.7f, -2.7f, 2.7f);
pVertices[12 + 120].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 120].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 120].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 120].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 120].position = D3DXVECTOR3(2.7f, 2.7f, 2.7f);
pVertices[16 + 120].position = D3DXVECTOR3(2.7f, 2.7f, -2.7f);
pVertices[18 + 120].position = D3DXVECTOR3(2.7f, -2.7f, -2.7f);
pVertices[19 + 120].position = D3DXVECTOR3(2.7f, -2.7f, 2.7f);
pVertices[16 + 120].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 120].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 120].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 120].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 120].position = D3DXVECTOR3(-2.7f, -2.7f, 2.7f);
pVertices[20 + 120].position = D3DXVECTOR3(-2.7f, -2.7f, -2.7f);
pVertices[22 + 120].position = D3DXVECTOR3(-2.7f, 2.7f, -2.7f);
pVertices[23 + 120].position = D3DXVECTOR3(-2.7f, 2.7f, 2.7f);
pVertices[20 + 120].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 120].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 120].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 120].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 7
pVertices[ 1 + 144].position = D3DXVECTOR3( 4.7f, 0.7f, -0.7f);
pVertices[ 0 + 144].position = D3DXVECTOR3(-4.7f, 0.7f, -0.7f);
pVertices[ 2 + 144].position = D3DXVECTOR3(-4.7f, -0.7f, -0.7f);
pVertices[ 3 + 144].position = D3DXVECTOR3( 4.7f, -0.7f, -0.7f);
pVertices[ 0 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 144].position = D3DXVECTOR3( 4.7f, -0.7f, 0.7f);
pVertices[ 4 + 144].position = D3DXVECTOR3(-4.7f, -0.7f, 0.7f);
pVertices[ 6 + 144].position = D3DXVECTOR3(-4.7f, 0.7f, 0.7f);
pVertices[ 7 + 144].position = D3DXVECTOR3( 4.7f, 0.7f, 0.7f);
pVertices[ 4 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 144].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 144].position = D3DXVECTOR3( 4.7f, 0.7f, 0.7f);
pVertices[ 8 + 144].position = D3DXVECTOR3(-4.7f, 0.7f, 0.7f);
pVertices[10 + 144].position = D3DXVECTOR3(-4.7f, 0.7f, -0.7f);
pVertices[11 + 144].position = D3DXVECTOR3( 4.7f, 0.7f, -0.7f);
pVertices[ 8 + 144].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 144].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 144].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 144].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 144].position = D3DXVECTOR3( 4.7f, -0.7f, -0.7f);
pVertices[12 + 144].position = D3DXVECTOR3(-4.7f, -0.7f, -0.7f);
pVertices[14 + 144].position = D3DXVECTOR3(-4.7f, -0.7f, 0.7f);
pVertices[15 + 144].position = D3DXVECTOR3( 4.7f, -0.7f, 0.7f);
pVertices[12 + 144].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 144].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 144].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 144].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 144].position = D3DXVECTOR3(4.7f, 0.7f, 0.7f);
pVertices[16 + 144].position = D3DXVECTOR3(4.7f, 0.7f, -0.7f);
pVertices[18 + 144].position = D3DXVECTOR3(4.7f, -0.7f, -0.7f);
pVertices[19 + 144].position = D3DXVECTOR3(4.7f, -0.7f, 0.7f);
pVertices[16 + 144].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 144].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 144].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 144].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 144].position = D3DXVECTOR3(-4.7f, -0.7f, 0.7f);
pVertices[20 + 144].position = D3DXVECTOR3(-4.7f, -0.7f, -0.7f);
pVertices[22 + 144].position = D3DXVECTOR3(-4.7f, 0.7f, -0.7f);
pVertices[23 + 144].position = D3DXVECTOR3(-4.7f, 0.7f, 0.7f);
pVertices[20 + 144].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 144].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 144].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 144].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 8
pVertices[ 1 + 168].position = D3DXVECTOR3( 0.7f, 4.7f, -0.7f);
pVertices[ 0 + 168].position = D3DXVECTOR3(-0.7f, 4.7f, -0.7f);
pVertices[ 2 + 168].position = D3DXVECTOR3(-0.7f, -4.7f, -0.7f);
pVertices[ 3 + 168].position = D3DXVECTOR3( 0.7f, -4.7f, -0.7f);
pVertices[ 0 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 168].position = D3DXVECTOR3( 0.7f, -4.7f, 0.7f);
pVertices[ 4 + 168].position = D3DXVECTOR3(-0.7f, -4.7f, 0.7f);
pVertices[ 6 + 168].position = D3DXVECTOR3(-0.7f, 4.7f, 0.7f);
pVertices[ 7 + 168].position = D3DXVECTOR3( 0.7f, 4.7f, 0.7f);
pVertices[ 4 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 168].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 168].position = D3DXVECTOR3( 0.7f, 4.7f, 0.7f);
pVertices[ 8 + 168].position = D3DXVECTOR3(-0.7f, 4.7f, 0.7f);
pVertices[10 + 168].position = D3DXVECTOR3(-0.7f, 4.7f, -0.7f);
pVertices[11 + 168].position = D3DXVECTOR3( 0.7f, 4.7f, -0.7f);
pVertices[ 8 + 168].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 168].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 168].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 168].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 168].position = D3DXVECTOR3( 0.7f, -4.7f, -0.7f);
pVertices[12 + 168].position = D3DXVECTOR3(-0.7f, -4.7f, -0.7f);
pVertices[14 + 168].position = D3DXVECTOR3(-0.7f, -4.7f, 0.7f);
pVertices[15 + 168].position = D3DXVECTOR3( 0.7f, -4.7f, 0.7f);
pVertices[12 + 168].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 168].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 168].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 168].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 168].position = D3DXVECTOR3(0.7f, 4.7f, 0.7f);
pVertices[16 + 168].position = D3DXVECTOR3(0.7f, 4.7f, -0.7f);
pVertices[18 + 168].position = D3DXVECTOR3(0.7f, -4.7f, -0.7f);
pVertices[19 + 168].position = D3DXVECTOR3(0.7f, -4.7f, 0.7f);
pVertices[16 + 168].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 168].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 168].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 168].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 168].position = D3DXVECTOR3(-0.7f, -4.7f, 0.7f);
pVertices[20 + 168].position = D3DXVECTOR3(-0.7f, -4.7f, -0.7f);
pVertices[22 + 168].position = D3DXVECTOR3(-0.7f, 4.7f, -0.7f);
pVertices[23 + 168].position = D3DXVECTOR3(-0.7f, 4.7f, 0.7f);
pVertices[20 + 168].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 168].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 168].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 168].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
// 육면체 9
pVertices[ 1 + 192].position = D3DXVECTOR3( 0.7f, 0.7f, -4.7f);
pVertices[ 0 + 192].position = D3DXVECTOR3(-0.7f, 0.7f, -4.7f);
pVertices[ 2 + 192].position = D3DXVECTOR3(-0.7f, -0.7f, -4.7f);
pVertices[ 3 + 192].position = D3DXVECTOR3( 0.7f, -0.7f, -4.7f);
pVertices[ 0 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 1 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 2 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 3 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
pVertices[ 5 + 192].position = D3DXVECTOR3( 0.7f, -0.7f, 4.7f);
pVertices[ 4 + 192].position = D3DXVECTOR3(-0.7f, -0.7f, 4.7f);
pVertices[ 6 + 192].position = D3DXVECTOR3(-0.7f, 0.7f, 4.7f);
pVertices[ 7 + 192].position = D3DXVECTOR3( 0.7f, 0.7f, 4.7f);
pVertices[ 4 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 5 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 6 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 7 + 192].normal = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
pVertices[ 9 + 192].position = D3DXVECTOR3( 0.7f, 0.7f, 4.7f);
pVertices[ 8 + 192].position = D3DXVECTOR3(-0.7f, 0.7f, 4.7f);
pVertices[10 + 192].position = D3DXVECTOR3(-0.7f, 0.7f, -4.7f);
pVertices[11 + 192].position = D3DXVECTOR3( 0.7f, 0.7f, -4.7f);
pVertices[ 8 + 192].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[ 9 + 192].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[10 + 192].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[11 + 192].normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
pVertices[13 + 192].position = D3DXVECTOR3( 0.7f, -0.7f, -4.7f);
pVertices[12 + 192].position = D3DXVECTOR3(-0.7f, -0.7f, -4.7f);
pVertices[14 + 192].position = D3DXVECTOR3(-0.7f, -0.7f, 4.7f);
pVertices[15 + 192].position = D3DXVECTOR3( 0.7f, -0.7f, 4.7f);
pVertices[12 + 192].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[13 + 192].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[14 + 192].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[15 + 192].normal = D3DXVECTOR3(0.0f, -1.0f, 0.0f);
pVertices[17 + 192].position = D3DXVECTOR3(0.7f, 0.7f, 4.7f);
pVertices[16 + 192].position = D3DXVECTOR3(0.7f, 0.7f, -4.7f);
pVertices[18 + 192].position = D3DXVECTOR3(0.7f, -0.7f, -4.7f);
pVertices[19 + 192].position = D3DXVECTOR3(0.7f, -0.7f, 4.7f);
pVertices[16 + 192].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[17 + 192].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[18 + 192].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[19 + 192].normal = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
pVertices[21 + 192].position = D3DXVECTOR3(-0.7f, -0.7f, 4.7f);
pVertices[20 + 192].position = D3DXVECTOR3(-0.7f, -0.7f, -4.7f);
pVertices[22 + 192].position = D3DXVECTOR3(-0.7f, 0.7f, -4.7f);
pVertices[23 + 192].position = D3DXVECTOR3(-0.7f, 0.7f, 4.7f);
pVertices[20 + 192].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[21 + 192].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[22 + 192].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
pVertices[23 + 192].normal = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
g_pVB->Unlock();
데이터 복사 완료 후 버텍스 버퍼 Unlock
return S_OK;
}
'엔진 개발' 카테고리의 다른 글
| 기본 3D 물체의 출력 10. 기하객체 렌더링 (0) | 2009/03/19 |
|---|---|
| 기본 3D 물체의 출력 9. Geometry 초기화 (0) | 2009/03/13 |
| 기본 3D 물체의 출력 8. Direct3D 초기화 (0) | 2009/02/26 |
| 기본 3D 물체의 출력 7. 메인 함수 설명 (0) | 2009/02/25 |
| 기본 3D 물체의 출력 6. 3D 프로그램의 구조 (0) | 2009/02/23 |
| 기본 3D 물체의 출력 5. 컴파일과 실행 (0) | 2009/02/19 |
기본 3D 물체의 출력 7. 메인 함수 설명에 이어서 계속해서 Direct3D 초기화 부분을 살펴보겠습니다.
기본적으로 소스 파일에서 InitD3D 부분에 대한 설명이 되겠습니다. 초록색으로 쓴 부분에 동작에 대한 설명이 되겠습니다.
//-----------------------------------------------------------------------------
// 이름: InitD3D()
// 설명: Direct3D 초기화
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
// D3D 객체 생성
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
Direct3DCreate9는 Direct3D의 SDK 버전을 인자로 받아 Direct3D 객체를 생성하여 그 포인터를 반환하는 함수입니다. 생성된 객체 포인터는 프로그램 종료시까지 계속 쭈욱 사용되게 됩니다. 이 부분은 모든 Direct3D 프로그래밍에서 반드시 실행되어야 하는 부분입니다.
// zbuffer를 사용하는 D3DDevice 스트럭처 정의
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
D3D 객체에 이어 D3D 장치 (Direct3D Device)를 생성해야 합니다. 우선 장치 생성에 필요한 여러가지 변수들을 지정하기 위한 D3D 장치 속성을 표현하는 스트럭처를 생성하고 그 내용을 채우고 있습니다.
각 레코드의 값은 다음과 같습니다.
Windowed: TRUE일 경우 윈도우 모드, FALSE일 경우 풀스크린 모드
SwapEffect: Double backbuffering 등 back buffer의 개수와 동작에 대한 속성 지정
BackBufferFormat: Back buffer format, RGBA각각의 채널의 유무, 채널별 비트수
UNKNOWN일 경우 시스템에서 가장 적절한 값을 가져온다..
EnableAutoDepthStencil: depth stencil buffer의 활성화 및 비활성화 지정
AutoDepthStencilFormat: EnableAutoDepthStencil가 TRUE일 경우 생성되는 depth
stencil buffer의 포맷
// D3DDevice 생성
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
Direct3D 장치의 생성, 디스플레이 아답터 (D3DADAPTER_DEFAULT), 장치 타입 (하드웨어 장치를 사용할 경우 HAL, D3D 표준 레퍼런스 장치의 경우 REF, 등), 윈도우 핸들, 장치 behavior flag, 장치 속성 스트럭쳐, 그리고 생성되는 장치 포인터를 받아오기 위한 포인터 변수를 인수로 하여 호출된다.
생성된 장치는 윈도우가 최소화되거나 사이즈가 바뀌거나, 풀스크린 모드로 바뀌거나, 포커스를 잃거나 하면 lost 되었다가 reset 된다. 만일 D3D 장치 내에 메모리 영역을 사용하거나 하는 경우 lost 및 reset 시에 이러한 메모리 영역에 저장된 데이터에 대한 적절한 처리를 해 주어야 한다.. (예제 프로그램에는 아직 포함되어 있지 않음)
// zbuffer 유효화
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
장치에서 Z 버퍼의 동작을 활성화 시킨다.
RECT winRect;
if(GetClientRect(hWnd, &winRect)) // aspect ratio 초기화
g_fApRatio = (FLOAT)winRect.right / (FLOAT)winRect.bottom;
g_fViewAngle = D3DX_PI / 4; // view angle 초기화, 초기값은 각도법으로 45도
g_iCameraFlag = 1; // camera update flag 세팅
마지막으로 생성된 윈도우의 가로/세로 비율을 찾아내어 aspect ratio의 초기값을 설정하고, 카메라 뷰 각도를 45도로 초기화한 후, 카메라 업데이트 flag를 세팅한다.
return S_OK;
}
'엔진 개발' 카테고리의 다른 글
| 기본 3D 물체의 출력 10. 기하객체 렌더링 (0) | 2009/03/19 |
|---|---|
| 기본 3D 물체의 출력 9. Geometry 초기화 (0) | 2009/03/13 |
| 기본 3D 물체의 출력 8. Direct3D 초기화 (0) | 2009/02/26 |
| 기본 3D 물체의 출력 7. 메인 함수 설명 (0) | 2009/02/25 |
| 기본 3D 물체의 출력 6. 3D 프로그램의 구조 (0) | 2009/02/23 |
| 기본 3D 물체의 출력 5. 컴파일과 실행 (0) | 2009/02/19 |
//-----------------------------------------------------------------------------
// 이름: WinMain()
// 설명: 전체 프로그램 메인 함수, 프로그램 시작점
//-----------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
// window class 등록
WNDCLASSEX wc =
{
sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
"3D Objects Display", NULL
};
RegisterClassEx( &wc );
// 응용 프로그램 window 생성
HWND hWnd = CreateWindow( "3D Objects Display", "DirectX 01: 3D Objects Display",
WS_OVERLAPPEDWINDOW, 100, 100, 900, 700,
NULL, NULL, wc.hInstance, NULL );
// Direct3D 초기화
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// 3차원 물체 기하 구조 초기화
if( SUCCEEDED( InitGeometry() ) )
{
// window 출력
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// message loop 실행
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
while( msg.message != WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
Render();
}
}
}
UnregisterClass( "3D Objects Display", wc.hInstance );
return 0;
}
이를 이용해서 DirectX를 초기화 하고 (InitD3D(hWnd) 호출 부분),
계속해서 3차원 기하구조를 초기화한 후 (InitGeometry() 호출 부분),
ShowWindow( hWnd, SW_SHOWDEFAULT ), UpdateWindow( hWnd )를 차례로 호출하여 윈도우를 화면에 나타낸 후,
무한 루프로 들어갑니다. (while 문 부분)
여기서 윈도우즈 이벤트를 메시지 형식으로 처리해 준 후 (각종 마우스 클릭, 키보드 입력 등등)
프로그램을 종료해야 하는 경우가 아닌 이상 그 결과물을 화면에 출력합니다. (Render() 호출 부분)
기본 3D 물체의 출력 6. 3D 프로그램의 구조에서 설명한 3D 프로그램의 구조를 참조하시면 더욱 좋을 듯 합니다.
계속해서 Init 3D 함수의 동작, Init Geometry 부분의 동작을 설명하겠습니다.
'엔진 개발' 카테고리의 다른 글
| 기본 3D 물체의 출력 9. Geometry 초기화 (0) | 2009/03/13 |
|---|---|
| 기본 3D 물체의 출력 8. Direct3D 초기화 (0) | 2009/02/26 |
| 기본 3D 물체의 출력 7. 메인 함수 설명 (0) | 2009/02/25 |
| 기본 3D 물체의 출력 6. 3D 프로그램의 구조 (0) | 2009/02/23 |
| 기본 3D 물체의 출력 5. 컴파일과 실행 (0) | 2009/02/19 |
| 기본 3D 물체의 출력 4. 개발 환경 설정 (0) | 2009/02/19 |
main()
{
Direct3D 초기화; // Direct3D 변수 설정, 객체 생성, 초기화 등
Scene 초기화; // 3D 물체 형상 지정, 카메라 위치 및 속성 지정,
// 광원 위치 및 초기값 지정 등 3D 환경에 대한 초기화
while()
{
exit(0); // 프로그램 종료
사용자 입력 및 미리 지정된 로직에 따른 3D 환경 갱신;
// 객체 이동, 회전, 크기 변경, 애니메이션
// 카메라 이동 및 속성 변경
// 광원 이동, 속성 변경
// 기타 3D 환경 갱신
Scene Render(); // 3D 환경의 화면 출력
'엔진 개발' 카테고리의 다른 글
| 기본 3D 물체의 출력 8. Direct3D 초기화 (0) | 2009/02/26 |
|---|---|
| 기본 3D 물체의 출력 7. 메인 함수 설명 (0) | 2009/02/25 |
| 기본 3D 물체의 출력 6. 3D 프로그램의 구조 (0) | 2009/02/23 |
| 기본 3D 물체의 출력 5. 컴파일과 실행 (0) | 2009/02/19 |
| 기본 3D 물체의 출력 4. 개발 환경 설정 (0) | 2009/02/19 |
| 기본 3D 물체의 출력 3. 예제 프로그램 소스 (0) | 2009/02/18 |

Prev
Rss Feed