언어/기타
2007.03.30 07:52

[DX&C++] 3대 행렬 연산의 사용

조회 수 1403 추천 수 4 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

오늘은 지난번에 표시한 삼각형에 움직임을 불어넣어볼 생각입니다.


 


3차원 상의 개체를 다루는데에는 3가지 기본 연산이 필요합니다.


 


이동, 회전, 크기조절이 있습니다.


 


중고등학교 수학 수업중에 행렬이라는 단위를 배우게 되는데, 아직 안배우신 분들을 위해 설명드리자면,


 


행렬이란 2차원 배열을 생각하시면 됩니다.


 


[ 0, 0, 0, 0 ]    [ 0, 0, 0 ]


[ 0, 0, 0, 0 ]    [ 0, 0, 0 ]    [ 0, 0, 0 ]


[ 0, 0, 0, 0 ]    [ 0, 0, 0 ]    [ 0, 0, 0 ]


[ 0, 0, 0, 0 ]    [ 0, 0, 0 ]    [ 0, 0, 0 ]


- 4x4 행렬 -   - 3x4 행렬 - - 3x3 행렬 -


 


예제를 보시면 가로x세로 행렬이라고 이름 붙이고, 그 안의 숫자가 여러개가 들어있습니다.


 


행렬의 기본 연산을 이용해 3D상의 각종 연산들의 공식들을 간단하게 표현할 수 있어서 행렬을 사용합니다.


 


원래대로라면 공식에 맞게 각 연산을 수행하기 알맞은 행렬을 직접 만들어줘야 합니다만,


 


DirectX는 그런 행렬들을 만들어주는 함수들이 여럿 있습니다.


 


D3DXMatrixTranslation(D3DXMATRIX* mat, FLOAT x, FLOAT y, FLOAT z);


이 함수를 이용해 이동연산을 할 수 있는 행렬을 만들 수 있습니다.


 


D3DXMatrixRotation(X,Y,Z)(D3DXMATRIX* mat,  FLOAT radian);


본 함수는 X,Y,Z 함수가 따로있으며, 2번째 인자로 넣는 radian 값은 일반적인 각도가 아니라, 라디안 단위로 적어야합니다.


 


일반적인 각도를 라디안 값으로 변환해주는 함수는 다음과 같이 짜시면 됩니다.


FLOAT AngleToRadian (FLOAT angle)


{


       return angle*D3DX_PI/180;


}


이는 고등학교 수업과정입니다만, 위 공식에 나오다시피 180도를 파이값으로 매칭시켜준 각도를 라디안각이라고 합니다.


 


D3DXMatrixScailing(D3DXMATRIX* mat, FLOAT sx, FLOAT sy, FLOAT sz);


마지막으로 이 함수를 이용해, x,y,z축에 대해 각각 sx배, sy배, sz배가 됩니다.


 


이제 실습에 들어가볼까요?


 


 


이 아래는 저번에 사용했던 코드중에 Render 함수만 가져온 것입니다.


 


VOID Render()
{
    // 화면에 출력될 그림이 저장되는 버퍼(BackBuffer)를 파랑색으로 초기화합니다.
    // D3DCOLOR_XRGB는 단순 정의로써 괄호 안에 입력된 숫자를 DWORD값으로 변환해줍니다.


 


    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );



 


    // 그림을 그릴수 있는 허가를 받기위해 호출하는 함수입니다.


    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {


 


        // 이곳이 이번 시간에 변경되는 부분입니다.!!


 


        // 현재 시간을 읽어와 회전을 시킵니다.


        // timeGetTime() 함수로 얻는 값의 크기는 매우 크지만 시간에 맞게 증가합니다. 1초당 1000씩 증가하거든요.


        // 따라서 이동함수같은 것에 걸면 순식간에 삼각형이 도망가버리는(?!) 모습이 보일겁니다.


        // 지금은 회전을 하는 것이기에 시간 값을 바로 썼지만, 이외의 경우에는 약간 재처리를 해주셔야 합니다.


        D3DXMatrixRotationX(&mat, timeGetTime());


 


        // 현재 세상 전체를 mat 행렬 기준으로 변경합니다.


        // 이렇게 한 후 그림을 그려놓으면 다시 원상태로 돌아가서 볼때 개체 혼자 움직이는 것처럼 보이지 않겠습니까? ^^


        g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat);


 


        // 3대 행렬 연산 부분의 끝입니다.


 



        // 우리는 InitVB를 호출한 다음이라면 g_pVB를 지속적으로 그려주는 것만으로


        // 삼각형을 그릴 수 있습니다.


        // VB에서 0번째 메모리구역에서 CUSTOMVERTEX사이즈 만큼의 소스를 읽어나가는


        // 것을 설정해줍니다.


        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );


 



 


        // 맨 처음 설정한 내용을 이곳에서 사용하는 것입니다.


        // 프로그래머가 사용할 버텍스들의 설정이 어떠한지 D3D에게 알려주는 과정입니다.


        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );



 


        // DrawPrimitive 함수를 이용해 그림을 그려주게 됩니다.


        // D3DPT_TRIANGLELIST는, 앞에서부터 3개의 버텍스씩 끊어 삼각형(폴리곤)을


        // 그리는 방식입니다. 이외에도 여러가지 방식이 있습니다만, 이 예제에서는 삼각형만


        // 그려내는 것이 목적이기 때문에 이 방식을 사용합니다.


        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );



 


        // End the scene
        g_pd3dDevice->EndScene();
    }



 


    // 백버퍼에 그림을 모두 그렸다면, 화면에 직접 뿌려줍니다.


    // 이것은 이중버퍼링이라는 기법으로, 프로그램에서 그림을 그리는 과정과 모니터에서


    // 그림을 출력하는 과정이 겹치면서 그림이 조금씩 깨지는 현상을 막기위한 것입니다.


    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


 


 


 


-----------------------------------------------------------------------------


이것으로 삼각형이 Y축 기준으로 회전을 하게 되었습니다.


이부분을 약간씩 고쳐서 3대 연산을 모두 연습해보세요. ^^


 


그럼 다음시간에는 삼각형 자체에 특성을 부여하도록 하겠습니다.


속도, 위치, 회전속도, 방향 등등 말이죠.


 


이것들은 모두 물리적 속성입니다. 다른 속성들도 기호에 따라 추가할 수 있겠습니다만,


물리 공부를 많이 하실수록 현실감을 위해 부여할 수 있는 속성이 많아지겠지요? ^^

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
844 언어/기타 렉없는 자동세이브 스크립트!!! 귀찮아‡ 2007.04.22 1474
843 언어/기타 [DX&C++] 3D를 넘어 2D로! Zeprod 2007.04.18 1674
842 언어/기타 코드진행 기초테크닉 1 나그네M 2007.04.14 709
841 언어/기타 그림 메뉴 2 [제 2의 타이틀 메뉴 (기본 메뉴편)] [거히 치트비법..] file 우드록맨 2007.04.12 771
840 RPG Maker 마우스 이동 스크립트 2 아크로s 2007.04.11 1965
839 언어/기타 '에피소드'형식이 아닌 '화' 형식의 시나리오는 어떨까요? 우드록맨 2007.04.09 1528
838 RPG Maker [초 노가다 시스템]그림 메뉴 1 file 우드록맨 2007.04.08 880
837 언어/기타 [DX&C++]3D공간상 카메라 시점의 대한 정의 실베 2007.04.02 1351
836 언어/기타 [DX&C++] IndexBuffer를 알아보자! Zeprod 2007.03.31 1240
835 언어/기타 3D좌표계에 3D물체를 찍기위환 기초과정 실베 2007.03.31 1354
834 언어/기타 [공개자료] 먼치킨 액알 만들기 책벌레공상가 2007.03.30 2499
» 언어/기타 [DX&C++] 3대 행렬 연산의 사용 Zeprod 2007.03.30 1403
832 언어/기타 숫자 게이지 색에 관한 팁 『덩키동크』 2007.03.30 1427
831 언어/기타 [DX&C++] 3D를 다루는 프로그램의 개요 Zeprod 2007.03.25 1245
830 언어/기타 template에 관한 간단한 예. 김두한 2007.03.12 1178
829 언어/기타 [고난도 시스템] 당구를 만들어 보자 5 SSS 2007.03.12 1196
828 언어/기타 2D격투게임만들기95 황금잉어빵 2007.03.08 2409
827 RPG Maker 1 - 1. 변수 응용 프로그램 만들기 (난수) 천영진 2007.03.06 1279
826 언어/기타 몬스터 성향 괴인X 2007.03.04 1256
825 언어/기타 [DX&C++] 3D 공간에 대한 이해 Zeprod 2007.03.04 1247
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)