언어/기타
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 RPG Maker RPGXP 스크립트를 공부 합시다. -1강- 장아찌 2005.06.05 1587
843 언어/기타 셔츠그리기 카타린 2006.11.25 1586
842 언어/기타 흥크립트 팁 A. 미스릴 2007.12.30 1585
841 언어/기타 [DX&C++] 지형을 만들어 봅시다. (Height Map) Zeprod 2007.04.27 1580
840 언어/기타 서로 돕고 사는 세상~ Zeprod 2007.11.19 1575
839 언어/기타 작은 팁하나..전투애니메이션의 픽쳐화! file 윈드 2007.01.31 1572
838 언어/기타 나름대로 - 변수강좌 켈리시 2005.05.18 1569
837 언어/기타 [자작]마름모형 거리 재기 A. 미스릴 2006.10.22 1548
836 언어/기타 에에... 할일 없어서 해봤습니다... 카노 방식 이벤트 액알예제.... かの☆あおき 2007.01.19 1546
835 언어/기타 인터넷으로 케릭터제작하기[2번에있는거펌] 사토루 2005.08.13 1539
834 언어/기타 게임 기획[초보편] -* MiNi'M' 2006.02.22 1537
833 RPG Maker srpg의 이동 시스템 창공의곰팅이 2006.08.21 1535
832 언어/기타 R2k로 퍼즐 만들기 새벽도둑 2007.01.23 1534
831 언어/기타 액션 알피지 노가다 줄이는 방법 다크세이버™ 2006.11.08 1531
830 언어/기타 '에피소드'형식이 아닌 '화' 형식의 시나리오는 어떨까요? 우드록맨 2007.04.09 1529
829 언어/기타 게이지 시스템 [액알의 게이지 같은 거 아니에요. ] S.단이한 2006.10.07 1528
828 RPG Maker * 기타 - '대기'의 종류 천영진 2007.02.24 1527
827 언어/기타 [덧붙임] 변수번호의 스위치 사용은 되도록이면 자제 A. 미스릴 2008.04.26 1516
826 언어/기타 레벨업을 하라 . 그리하면 살것이니.. 1 file Norid 2005.05.22 1513
825 RPG Maker 방사형 마법범위 좌표구하기 BAYONET 2006.12.17 1510
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(김원배) | 사신지(김병국)