언어/기타
2007.03.30 07:52

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

조회 수 1404 추천 수 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.01.07 1302
843 언어/기타 작은 팁하나..전투애니메이션의 픽쳐화! file 윈드 2007.01.31 1572
842 RPG Maker 자질구레팁1] 0.75배속/1.5배속/3배속으로 이벤트를 움직이게 해보자. 파파 곤잘레스 2006.04.18 479
841 언어/기타 자작광석4개 A.M.S 2010.02.07 723
840 언어/기타 자작 시스템 [z]버튼 누르고 상자밀고 끌기 시스템... - 3- file 플레니아 2006.04.25 383
839 언어/기타 자유 게시판에서 한바탕 난리를 보신 분들도 있을 겁니다. file 아란 2006.08.13 911
838 언어/기타 자연스러운 커다란 맵에 스크린샷 나른한지지 2006.01.12 535
837 언어/기타 자바스크립트와 관련해서 참고할 만한 사이트들 3 MARCO 2015.10.04 698
836 언어/기타 자바 기초 로직 ˙ dnajs 2006.09.16 1290
835 언어/기타 자료구조 (3) - 링크리스트 성령의분노 2006.03.24 465
834 언어/기타 자료구조 (2) - Queue[민프레스 강의정리] 성령의분노 2005.12.31 392
833 언어/기타 자료구조 (1) - Stack [민프레스 강의정리] 성령의분노 2005.12.30 549
832 언어/기타 자동 길찾기 기능을 만들어보자 1 file Black-☆ 2010.08.19 3487
831 RPG Maker 자가진화하는 CPU 플레이어 file 니체 2006.05.14 400
830 언어/기타 임시변수 없이 스왑(swap)하기~ 케이코냥이 2006.08.28 1140
829 언어/기타 일정한 장비착용시 HP나 MP가 회복되게 해보자! 어둠의그림자 2005.09.23 624
828 언어/기타 일단 예제를 만들어보십쇼5칸이내로 가면 죽는 시스템 のㅏ②뜨 2005.08.11 350
827 언어/기타 일, 시간, 분, 초 시스템 . 스포아 2006.06.28 868
826 언어/기타 인터넷으로 케메하기 안티테제 2005.06.19 1113
825 언어/기타 인터넷으로 케릭터제작하기[2번에있는거펌] 사토루 2005.08.13 1539
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(김원배) | 사신지(김병국)