2009/03/09 14:23

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Programming/DirectX2009/02/27 00:16
DirectX로 3D를 구현하기 위해서는 수학적인 준비가 필요하다.
3D를 구현하기 위해서 일단 벡터, 행렬에 대해서 기본적인 지식이 필요하다. 내 생각으론 고등학교 3학년 자연계열을 공부한 사람이라면 문제 없는 난이도라고 생각된다. (수2까지 마쳤을 경우)
간결히 기본적인 함수에는 이런 것들이 있다고만 하는 것을 정리해봤다. 자세한 설명은 따로 올릴 생각이다.
(사실은 군대를 다녀올 나를 위해서 정리해 놓는 것일뿐 ㅋ)

[ 3D-공간에서의 백터 표현 ]
typedef struct D3DXVECTOR3 : public D3DVECTOR
D3DXVECTOR3 ()
D3DXVECTOR3 ( CONST D3DXVECTOR& )
D3DXVECTOR3 ( FLOAT x, FLOAT y, FLOAT z )

ex) i = ( 10, 5, 7 ) -> D3DXVECTOR3( 10.0f , 5.0f, 7.0f )

[ 벡터의 크기 계산 ]
FLOAT D3DXVec3Length ( CONST D3DXVECTOR3* pV )

ex) D3DXVECTOR3 u( 10.0f , 5.0f , 7.0f )
float length = D3DXVec3Length ( &u )

[ 벡터의 정규화 ]
벡터의 크기를 1로 만들어 단위 벡터가 되가 하는 것으로 연산을 쉽게 하기 위해서 수행한다.
D3DXVECTOR3* D3DXVec3Normalize ( D3DXVECTOR3* pOut , CONST D3DXVECTOR3* pV )

[ 벡터의 더하고 빼기 ]
D3DXVECTOR3 u( 10.0f , 5.0f, 7.0f )
D3DXVECTOR3 v( 0.0f , 5.0f, 3.0f )

D3DXVECTOR3 sum = u + v
D3DXVECTOR3 min = u - v

[ 스칼라곱 ]
D3DXVECTOR3 u( 10.0f , 5.0f, 7.0f )
D3DXVECTOR3 y = u * 10.0f

[ 내적과 외적 ]
내적 : FLOAT D3DXVec3Dot ( CONST D3DXVECTOR3* pA , CONST D3DXVECTOR3* pB )
외적 :
D3DXVECTOR3* D3DXVec3Cross ( D3DXVECTOR3* pOut , CONST D3DXVECTOR3* pA , CONST D3DXVECTOR3* pB )

D3DXVECTOR3 u( 10.0f , 5.0f, 7.0f )
D3DXVECTOR3 v( 0.0f , 5.0f, 3.0f )

float dot = D3DXVec3Dot ( &u , &v )
D3DXVECTOR3 w;
D3DXVec3Cross ( &w , &u , &v )

[ 행렬 정의 ]
typedef struct D3DXMATRIX : public D3DMATRIX
D3DXMATRIX ()
D3DXMATRIX ( CONST FLOAT * )
D3DXMATRIX ( CONST D3DMATRIX& )
D3DXMATRIX ( CONST D3DXFLOAT16 * )
D3DXMATRIX (
FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,
FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,
FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,
FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44   );

[ 여러가지 행렬 구하기 ]
항등행렬 :
D3DXMATRIX* D3DXMatrixIdentity ( D3DXMATRIX* pOut )

전치행렬 :
D3DXMATRIX* D3DXMatrixTranspose (
D3DXMATRIX* pOut , CONST D3DXMATRIX *pM )
역행렬 :
D3DXMATRIX* D3DXMatrixInverse ( D3DXMATRIX* pOut , FLOAT* pD , CONST D3DXMATRIX* pM )

[ 이동 행렬 구하기 ]
D3DXMATRIX* D3DXMatrixTranslation ( D3DXMATRIX* pOut , FLOAT x , FLOAT y , FLOAT z )

[ 회전 행렬 ]
D3DXMATRIX* D3DXMatrixRotationX ( D3DXMATRIX* pOut , FLOAT angle )
D3DXMATRIX* D3DXMatrixRotationY ( D3DXMATRIX* pOut , FLOAT angle )
D3DXMATRIX* D3DXMatrixRotationZ ( D3DXMATRIX* pOut , FLOAT angle )

[ 크기 변환 행렬 ]
D3DXMATRIX* D3DXMatrixScaling ( D3DXMATRIX* pOut , FLOAT sx, FLOAT sy, FLOAT sz )

[ 벡터 변환을 위한 함수 ]

D3DXVECTOR3* D3DXVec3TransformCoord (
D3DXVECTOR3* pOut , CONST D3DXVECTOR3* pV ,
       CONST
D3DXVECTOR3* pM )
D3DXVECTOR3* WINAPI D3DXVec3TransformNormal (
D3DXVECTOR3* pOut , CONST D3DXVECTOR3* pV,
     
CONST D3DXVECTOR3* pM )


Posted by 토와
Programming/DirectX2009/02/26 11:30
DirectX SDK를 설치하고 나서 빌드하기 위해서는 개발환경을 설정해 줄 필요가 있다.
보통 학생들이 아직도 많이 사용하고 있는 VC++ 6.0과 VC++ 2005(.NET)이 있는데 두가지의 설정법은 비슷하다.
보통은 Include폴더와 Lib폴더가 자동으로 추가되지만 추가되지 않았을 경우 확인하고 결로를 지정해 주어야 정상적으로 빌드가 가능하다.
그리고 추가적으로 d3d.lib , d3dx9.lib , winmm.lib 라이브러리 파일을 링크시켜주어야한다.
위의 파일들을 링크 시켜주지 않으면 빌드시 error LNK2019 의 링크 에러를 낼 수 있다.

[ VC++ 6.0에서 ]
  • 헤더파일과 라이브러리 파일 경로지정
도구 - 옵션 - 디렉토리 항목에서 다음과 같이 경로를 추가해주어야 한다.
  라이브러리 파일 : C:\DXSDK\Lib
  포함 파일 : C:\DXSDK\Include

  • 프로젝트에 라이브러리 파일 링크하기
프로젝트 - 설정 - 링크 탭에서 링크할 라이브러리 파일을 추가한다.
  d3d.lib d3dx9.lib winmm.lib

[ VC++ 2005(.NET)에서 ]
  • 헤더파일과 라이브러리 파일 경로지정
도구 - 옵션 - 프로젝트 및 솔루션 - VC++ 디렉터리 항목에서 각 항목을 선택하고 경로를 추가한다.
  라이브러리 파일 : C:\DXSDK\Lib
  포함 파일 : C:\DXSDK\Include


  • 프로젝트에 라이브러리 파일 링크하기
프로젝트 - 구성 속성 - 링커 - 입력 폴더의 추가종속성에 다음 파일들을 추가시켜준다.
  d3d9.lib d3dx9.lib winmm.lib


위와 같이 설정했다면 DirectX 예제 프로젝트를 빌드해보고 설정이 제대로 되었는지 확인합니다.
빌드가 되지 않는다면 지정해준 경로상에 라이브러리폴더와 포함폴더가 제대로 있는지 확인합니다.

Posted by 토와