Search results for '게임개발'

동차좌표

2007/08/24 17:44
동차좌표는 해석기하학에서 나온 개념인데, "열"을 추가해 표현과 변환을 쉽게 하고자 나온 개념이다. 해석기하학은 도형등의 실체적 개념을 좌표를 도입하여 실수화해서 실수의 대수적 계산능력을 이용하려 했다. 좌표란 점/선을 표현할 수 있는 도구이고, 실체적인(쉽게 받아들일수 있는) 좌표의 표현력을 늘리기 위해 동차좌표라는 개념이 등장했다.

동차좌표를 아주 쉽게 받아들일수 있는 표를 Florida Atlantic University의 한 강좌페이지에서 찾아볼수 있는데, 필요한 부분만 발췌하면 아래와 같다.

inhomogeneous coordinate homogeneous coordinates
0 (0,1)
-7/3 (7,-3)
(1,0)
not a point (0,0)

inhomogeneous coordinates homogeneous coordinates
(5,-7/3) (5,-7/3,1)
(∞,0) (1,0,0)
(0,∞) (0,1,0)
(2,3/4) (8,3,4)
(-3∞,2∞) (-3,2,0)

예를 들어 점을 표현하는 2차원 점 좌표계에서 x축을 나타내기 위해 일반적으로 수가 아닌 기호를 써서(∞,0)로 나타내지만, 동차좌표를 이용해 (1,0,0) 으로 나타내면 x축이라는 직선을 모두 수로만 나타낼수 있다.

컴퓨터 그래픽스는 본질적으로 3차원 점 좌표에 관심을 가지는 분야이고 3차원 점좌표에대해 변환을 쉽게 하기 위해 4x4 행렬과 4개의 원소로 구성된 열백터를 사용하며, 이 열백터는 3차원 점에 대한 동차좌표이다. 그리고 이러한 동차좌표표현을 통해 이동변환(Translation)과 투영변환(Projection)을 쉽게 할 수 있다.

수학 이야기 게임개발, 수학

익명 공용체와 익명 구조체 ( anonymous union / anonymous structure )

2007/08/19 22:57
익명의 공용체에 익명 구조체를 쓰는것은 대부분의 C++ 컴파일러가 지원하는 확장이지만 표준은 아니다.
꼴에 표준을 좋아해서 DX에서 쓰이는 아래의 행렬은 새로 작성하고 있는 end 의 행렬객체로는 부적격.

(Language : cpp)
typedef struct _D3DMATRIX {
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;

        };
        float m[4][4];
    };
} D3DMATRIX;


현재는 이런식으로 행렬 클래스를 설계하고 있다.

(Language : cpp)
namespace end
{
    class Matrix4
    {
    public:

        enum ENTRIES
        {
            _11=0,  _12,  _13,  _14,
            _21,    _22,    _23,    _24,
            _31,    _32,    _33,    _34,
            _41,    _42,    _43,    _44
        };

        //////////////////////////////////////////////////////////////////////
        // 단위행렬 / 영행렬 ---
        //
        void makeIdentity();
        void makeZero();


        //////////////////////////////////////////////////////////////////////
        // 주어진 행렬로부터 행렬을 만드는 경우 ---
        //
        void makeFromInverse( const Matrix4& _rMatToGetInvers );
        void makeFromMultiply(
                const
Matrix4* _pMat1,
                const Matrix4* _pMat2,
                const Matrix4* _pMat3NullIfNotUse = 0,
                const Matrix4* _pMat4NullIfNotUse = 0,
                const Matrix4* _pMat5NullIfNotUse = 0 );


        //////////////////////////////////////////////////////////////////////
        // 변환의 용도로 쓰일 행렬을 만드는 경우 ---
        //
        void makeTransform( const Matrix4& _rMat );

        void makeTransformPerspectiveProjectionLH(
                float _fFieldOfViewRadians = END_PI/4.f,
                float _fAspectRatio = 4.f/3.f,
                float _fZNear = 1.0f, float _fZFar = 1000.0f );
        void makeTransformPerspectiveProjectionRH(
                float _fFieldOfViewRadians = END_PI/4.f,
                float _fAspectRatio = 4.f/3.f,
                float _fZNear = 1.0f, float _fZFar = 1000.0f );

        void makeTransformOrthogonalProjectionLH(
                float _fWidth = 800.0f, float _fHeight = 600.0f,
                float _fZNear = 0.0f, float _fZFar = 1.0f );
        void makeTransformOrthogonalProjectionRH(
                float _fWidth = 800.0f, float _fHeight = 600.0f,
                float _fZNear = 0.0f, float _fZFar = 1.0f );

        void makeTransformViewLH(
                const Vector3& _rPosition,
                const Vector3& _rDir,
                const Vector3& _rUp );
        void makeTransformViewRH(
                const Vector3& _rPosition,
                const Vector3& _rDir,
                const Vector3& _rUp );

        void makeTransformCoordinateSystem(
                const Vector3& _rOrigin,
                const Vector3& _rX,
                const Vector3& _rY,
                const Vector3& _rZ );


        //////////////////////////////////////////////////////////////////////
        // 행렬연산 ---
        //
        void multiply( const Matrix4& _rMatToMultiply );
        void transformVector3( Vector3& _rOutVecToTransform );
        void transformVector4( Vector4& _rOutVecToTransform );

        /*  00, 01, 02, 03    =   11, 12, 13, 14
            04, 05, 06, 07  = 21, 22, 23, 24
            08, 09, 10, 11  = 31, 32, 33, 34
            12, 13, 14, 15  = 41, 42, 43, 44   */

        float Entries[16];
    };
}


음... 나름 괜찮다고 생각중.. 특히 저 makeFromMultiply는 최적화를 잘해줘서 불필요한 임시객체 생성을 막을수 있을듯.

프로그래밍 게임개발, 프로그래밍, 행렬