언어/기타
2007.03.30 07:52

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

조회 수 1407 추천 수 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대 연산을 모두 연습해보세요. ^^


 


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


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


 


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


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

?

  1. RPG게임 뻔한요소들.

    Date2015.10.05 Category언어/기타 By천무 Views1458
    Read More
  2. 시작 하자 마자 스위치, 변수 조작하기

    Date2007.02.13 Category언어/기타 ByEverSmileMan Views1453
    Read More
  3. [구기술체험소] Fast Animation System

    Date2007.05.03 Category언어/기타 By비밀소년 Views1452
    Read More
  4. 나름대로 게임제작1 - 시나리오 작성법

    Date2006.12.26 CategoryRPG Maker By켈리시 Views1447
    Read More
  5. 턴알에서 순간데미지 2배이상으로늘리기[턴알]

    Date2007.05.21 Category언어/기타 ByDship Views1446
    Read More
  6. 귀차니즘 타파 알고리즘

    Date2008.02.11 Category언어/기타 ByA. 미스릴 Views1446
    Read More
  7. 두드리는 미니게임...

    Date2007.07.25 Category언어/기타 ByJIN[晉] Views1439
    Read More
  8. 숫자 게이지 색에 관한 팁

    Date2007.03.30 Category언어/기타 By『덩키동크』 Views1428
    Read More
  9. 왜 C언어를 해야하나요? -1

    Date2006.09.16 Category언어/기타 By웁피 Views1426
    Read More
  10. RPG MV 게임 도중에 윈도우 스킨 파일 자체를 통째로 바꿔버리는 방법 (출처: HIME)

    Date2016.07.08 CategoryRPG Maker By최저 Views1420
    Read More
  11. 포트리스예제 최종수정판!

    Date2006.07.28 Category언어/기타 By윈드 Views1420
    Read More
  12. [예제포함] 턴제 액션알피지 간단하게 만들어보자 !!

    Date2005.09.28 Category언어/기타 By다크세이버™ Views1417
    Read More
  13. [초급]숲을 가꾸어 봅시다.

    Date2006.01.24 CategoryRPG Maker By카스-오로치 Views1415
    Read More
  14. [초보용!] 뭐 ~? 몬스터가 원거리 공격을 한다구~

    Date2005.12.05 Category언어/기타 By다크세이버™ Views1415
    Read More
  15. XP툴을 이용한 SRPG 이동형식

    Date2005.11.26 CategoryRPG Maker By다크아머 Views1415
    Read More
  16. 애완동물 만들기/따라다니게하기

    Date2005.08.31 CategoryRPG Maker By크레시스 Views1413
    Read More
  17. [잡담] ONE's SCRIPT 소개

    Date2008.12.16 Category언어/기타 ByZeprod Views1409
    Read More
  18. 중,고수를 위한 빠른 숲맵배치[+부록:노하우통맵배치]

    Date2006.07.30 CategoryRPG Maker By『덩키동크』 Views1408
    Read More
  19. [DX&C++] 3대 행렬 연산의 사용

    Date2007.03.30 Category언어/기타 ByZeprod Views1407
    Read More
  20. BGM, ME 소리가 안들렸다?[대책을 알아낸.............!!!]

    Date2007.05.18 Category언어/기타 Bysmofdz Views1399
    Read More
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 15 ... 51 Next
/ 51






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

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