많은 게임 엔진들을 보다보면 엔진에서 사용하는 변수 타입들을 자체 정의하여 사용하는 것을 많이 볼수 있습니다. Vector, Matrix, Plane 이라든가 말이죠. PC/Windows/DirectX 한정으로만 제작할거라면 DirectX에서 제공 하는 타입들을 사용해 DirectX에서 제공하는 각종 API들을 바로 쓸 수 있는 편리함을 누릴수 있겠지만, 다른 플랫폼을 생각한다면 역시 자체 변수 타입을 사용해야 할 것입니다.

저도 그래서 되도 않는 욕심으로 나중에는 OpenGL도 같이 지원해야지 하는 생각으로 이번 리뉴얼에 자체 변수 타입도 추가중에 있습니다. Vector부터 해서 Matrix, Quaternion, Plane 등을 Ogre와 GCC, GameBryo를 참조해 쓰기 편하게 제작 하고 있습니다.

아무래도 3D에서는 자주 사용하는 변수들인데다 각종 상황 ( 기본 타입들과의 연산 )등을 고려 하여야 하기 때문에 연산자 정의까지 꼼꼼히 해야 하는게 은근 손이 많이 가더군요.

밑은 vector3의 헤더 부분입니다. 외부 함수 도움 없이 자체적으로 정규화, 길이 구하기, 내적, 외적등을 수행할수 있게 해뒀습니다.

#ifndef _EVE_VECTOR_3_H_
#define _EVE_VECTOR_3_H_

// Vector3 Type Class
class DLL_API ev_CVector3
{
public:
	ev_CVector3();
	ev_CVector3( const float fVal );
	ev_CVector3( const float fX, const float fY, const float fZ );
	~ev_CVector3();

public:
	inline float operator[]( const size_t i ) const;
	inline ev_CVector3& operator=( const ev_CVector3& rhs );
	inline ev_CVector3& operator=( const float& rhs );
	inline bool operator<( const ev_CVector3& rhs ) const;
	inline bool operator>( const ev_CVector3& rhs ) const;
	inline bool operator==( const ev_CVector3& rhs ) const;
	inline bool operator!=( const ev_CVector3& rhs ) const;
	inline ev_CVector3 operator+( const ev_CVector3& rhs ) const;
	inline ev_CVector3 operator-( const ev_CVector3& rhs ) const;
	inline ev_CVector3 operator*( const float rhs ) const;
	inline ev_CVector3 operator*( const ev_CVector3& rhs) const;
	inline ev_CVector3 operator/( const float rhs ) const;
	inline ev_CVector3 operator/( const ev_CVector3& rhs) const;
	inline ev_CVector3& operator+=( const float rhs );
	inline ev_CVector3& operator+=( const ev_CVector3& rhs );
	inline ev_CVector3& operator-=( const float rhs );
	inline ev_CVector3& operator-=( const ev_CVector3& rhs );
	inline ev_CVector3& operator*=( const float rhs );
	inline ev_CVector3& operator*=( const ev_CVector3& rhs );
	inline ev_CVector3& operator/=( const float rhs );
	inline ev_CVector3& operator/=( const ev_CVector3& rhs );
	inline const ev_CVector3& operator+() const;
	inline ev_CVector3 operator-() const;

	// 전역 연산자 함수 ( friend 이므로 구현부에 작성 안됨 )
	inline friend ev_CVector3 operator*( const float lhs, const ev_CVector3& rhs )
	{
		return ev_CVector3( lhs * rhs.x, lhs * rhs.y, lhs * rhs.z );
	}
	inline friend ev_CVector3 operator/( const float lhs, const ev_CVector3& rhs )
	{
		return ev_CVector3(	lhs / rhs.x, lhs / rhs.y, lhs / rhs.z );
	}
	inline friend ev_CVector3 operator+( const ev_CVector3& lhs, const float rhs )
	{
		return ev_CVector3(	lhs.x + rhs, lhs.y + rhs, lhs.z + rhs );
	}
	inline friend ev_CVector3 operator+( const float lhs, const ev_CVector3& rhs )
	{
		return ev_CVector3(	lhs + rhs.x, lhs + rhs.y, lhs + rhs.z );
	}
	inline friend ev_CVector3 operator-( const ev_CVector3& lhs, const float rhs )
	{
		return ev_CVector3(	lhs.x - rhs, lhs.y - rhs, lhs.z - rhs);
	}
	inline friend ev_CVector3 operator-( const float lhs, const ev_CVector3& rhs )
	{
		return ev_CVector3( lhs - rhs.x, lhs - rhs.y, lhs - rhs.z );
	}

public:
	inline void Swap( ev_CVector3& vec3 );
	inline float Length( void ) const;
	inline float Distance( const ev_CVector3& vec3 ) const;
	inline float DotProduct( const ev_CVector3& vec3 ) const;
	inline ev_CVector3 CrossProduct( const ev_CVector3& vec3 ) const;
	inline float Normalize( void );
	inline ev_CVector3 GetNormalVec( void ) const;

public:
	float x, y, z;

	// 상수 벡터
	static const ev_CVector3 ZERO;
	static const ev_CVector3 UNIT_X;
	static const ev_CVector3 UNIT_Y;
	static const ev_CVector3 UNIT_Z;
	static const ev_CVector3 NEGATIVE_UNIT_X;
	static const ev_CVector3 NEGATIVE_UNIT_Y;
	static const ev_CVector3 NEGATIVE_UNIT_Z;
	static const ev_CVector3 UNIT_SCALE;
};

#endif
이전에 올린 추상 렌더러 글과 이어지는 맥락이라고 볼수 있습니다. 자체 타입을 사용 함으로서 특정 SDK에 종속되지 않으므로, 플랫폼이 바뀌더라도 내부 수정이 필요 없게되겠죠. 언젠가 이 엔진으로 아이폰 게임을 만들수도 있지 않을까 하는 생각으로 작업 ㄱㄱㅆ~

짤은 요즘 너무 좋은 아이유


  1. BlogIcon 구차니 2011.01.02 08:35 신고

    으헝헝 전 openGL 공부하려다가 포기하고 CUDA도 던져버리고 그러는데 티스님은 천재세요 으헝헝 ㅠ.ㅠ
    결론 : 그냥 8800GT SLI로 작년에 업글하고 게임이나 할 신세 -_-




    대세는 아이유!

+ Recent posts