Software Development/Graphics

5. Vertices_1)Vector

huiyu 2014. 10. 17. 22:50

1. Vector

- 벡터 구조체

 D3DVECTOR구조체와 D3DXVECTOR3구조체를 제공, D3DXVECTOR3는 벡터를 연살할 수 있는 연산자 오버로딩이 제공됩니다.

D3DVECTOR

typedef struct D3DVECTOR {
  float x;
  float y;
  float z;
} D3DVECTOR;


D3DXVECTOR3

typedef struct D3DXVECTOR3 : public D3DVECTOR
{
public:
    D3DXVECTOR3() {};
    D3DXVECTOR3( CONST FLOAT * );
    D3DXVECTOR3( CONST D3DVECTOR& );
    D3DXVECTOR3( CONST D3DXFLOAT16 * );
    D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z );

    // casting
    operator FLOAT* ();
    operator CONST FLOAT* () const;

    // assignment operators
    D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& );
    D3DXVECTOR3& operator -= ( CONST D3DXVECTOR3& );
    D3DXVECTOR3& operator *= ( FLOAT );
    D3DXVECTOR3& operator /= ( FLOAT );

    // unary operators
    D3DXVECTOR3 operator + () const;
    D3DXVECTOR3 operator - () const;

    // binary operators
    D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& ) const;
    D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;
    D3DXVECTOR3 operator * ( FLOAT ) const;
    D3DXVECTOR3 operator / ( FLOAT ) const;

    friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& );

    BOOL operator == ( CONST D3DXVECTOR3& ) const;
    BOOL operator != ( CONST D3DXVECTOR3& ) const;

} D3DXVECTOR3, *LPD3DXVECTOR3;


-벡터연산

1) 벡터의 합 : +연산자 오버로딩과 D3DXVec3Add()함수를 이용한다.

D3DXVec3Add 함수

D3DXVECTOR3* D3DXVec3Add(
  _Inout_  D3DXVECTOR3 *pOut,
  _In_     const D3DXVECTOR3 *pV1,
  _In_     const D3DXVECTOR3 *pV2
);


예제

#include "stdafx.h"
#include <d3dx9.h>

int _tmain(int argc, _TCHAR* argv[])
{
	D3DXVECTOR3 v1(0.0f, 3.0f, 0.0f);
	D3DXVECTOR3 v2(3.0f, 0.0f, 0.0f);
	D3DXVECTOR3 v3;

	v3 = v1 + v2;
	printf("합 : %f %f %f \n", v3.x, v3.y, v3.z);

	D3DXVec3Add(&v3, &v1, &v2);
	printf("합 : %f %f %f \n", v3.x, v3.y, v3.z);


	return 0;
}


2) 벡터의 뺄셈 : -연산자 오버로딩과 D3DXVec3Subtract()함수를 이용한다.

D3DXVec3Subtract 함수

D3DXVECTOR3* D3DXVec3Subtract(
  _Inout_  D3DXVECTOR3 *pOut,
  _In_     const D3DXVECTOR3 *pV1,
  _In_     const D3DXVECTOR3 *pV2
);


예제

#include "stdafx.h"
#include <d3dx9.h>

int _tmain(int argc, _TCHAR* argv[])
{
	D3DXVECTOR3 v1(0.0f, 3.0f, 0.0f);
	D3DXVECTOR3 v2(3.0f, 0.0f, 0.0f);
	D3DXVECTOR3 v3;

	v3 = v2-v1;
	printf("뺄셈 : %f %f %f \n", v3.x, v3.y, v3.z);

	D3DXVec3Subtract(&v3, &v2, &v1);
	printf("뺄셈 : %f %f %f \n", v3.x, v3.y, v3.z);
	
	
	return 0;
}


3) 벡터의 크기 : D3DXVec3Length()함수를 이용한다.

D3DXVec3Length 함수

FLOAT D3DXVec3Length(
  _In_  const D3DXVECTOR3 *pV
);


예제

#include "stdafx.h"
#include <d3dx9.h>

int _tmain(int argc, _TCHAR* argv[])
{
	D3DXVECTOR3 v1(0.0f, 3.0f, 0.0f);
	D3DXVECTOR3 v2(3.0f, 0.0f, 0.0f);
	D3DXVECTOR3 v3;

	v3 = v2-v1;

	float fLength;
	
	fLength = D3DXVec3Length(&v3);

	printf("크기 : %f\n", fLength);
	

	return 0;
}


4) 값과 벡터의 곱셈 : D3DXVec3Scale()함수를 이용한다.

D3DXVec3Scale 함수

D3DXVECTOR3* D3DXVec3Scale(
  _Inout_  D3DXVECTOR3 *pOut,
  _In_     const D3DXVECTOR3 *pV,
  _In_     FLOAT s
);


예제

#include "stdafx.h"
#include <d3dx9.h>

int _tmain(int argc, _TCHAR* argv[])
{
	float fScale = 2.0f;
	D3DXVECTOR3 v5(2.0f, 1.0f, 0.0f);

	D3DXVec3Scale(&v5, &v5, fScale);
	printf("값과 벡터의 곱 : %f %f %f \n", v5.x, v5.y, v5.z);

	return 0;
}


5) 단위 벡터 : D3DXVec3Normalize() 함수를 이용

D3DXVec3Normalize 함수

D3DXVECTOR3* D3DXVec3Normalize(
  _Inout_  D3DXVECTOR3 *pOut,
  _In_     const D3DXVECTOR3 *pV
);


예제

#include "stdafx.h"
#include <d3dx9.h>

int _tmain(int argc, _TCHAR* argv[])
{
	D3DXVECTOR3 v6(2.0f, 2.0f, 3.0f);
	D3DXVECTOR3 vResult;

	float fNormalize;

	D3DXVec3Normalize(&vResult, &v6);
	printf("단위벡터 : %f %f %f \n", vResult.x, vResult.y, vResult.z);
	fNormalize = D3DXVec3Length(&vResult);

	printf("크기 : %f \n", fNormalize);

	return 0;
}


6)내적 : D3DXVec3Dot() 함수 이용

FLOAT D3DXVec3Dot(
  _In_  const D3DXVECTOR3 *pV1,
  _In_  const D3DXVECTOR3 *pV2
);


예제

#include "stdafx.h" #include <d3dx9.h> int _tmain(int argc, _TCHAR* argv[]) { //내적함수 D3DXVECTOR3 v7(3.0f, 0.0f, 0.0f); D3DXVECTOR3 v8(-3.0f, 0.0f, 0.0f); float fCos, fDot, fScale2; fDot = D3DXVec3Dot(&v7, &v8); fScale2 = D3DXVec3Length(&v7) * D3DXVec3Length(&v8); fCos = fDot / fScale2; printf("라디언 : %f \n", fCos); return 0; }


7)외적 : D3DXVec3Corss()함수 이용

D3DXVECTOR3* D3DXVec3Cross(
  _Inout_  D3DXVECTOR3 *pOut,
  _In_     const D3DXVECTOR3 *pV1,
  _In_     const D3DXVECTOR3 *pV2
);


예제

#include "stdafx.h" #include <d3dx9.h> int _tmain(int argc, _TCHAR* argv[]) { D3DXVECTOR3 v1(0.0f, 3.0f, 0.0f); D3DXVECTOR3 v2(3.0f, 0.0f, 0.0f); D3DXVECTOR3 vResult2; D3DXVec3Cross(&vResult2, &v1, &v2); D3DXVec3Normalize(&vResult2, &vResult2); printf("%f %f %f \n", vResult2.x, vResult2.y, vResult2.z); return 0; }



728x90

'Software Development > Graphics' 카테고리의 다른 글

6. Matrices  (0) 2014.10.20
5. Vertices_2)정점  (0) 2014.10.17
4. DirectX 프레임워크(framework)  (0) 2014.10.14
3. DirectX 기본환경 설정  (0) 2014.10.14
2. DirectX 설치, VisualStudio 2010 설정, 프로젝트 생성  (1) 2014.10.07