디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

적분시리즈: 4. 행렬변환을 통해 회전, 확대/축소하기

∫ 2t dt=t²+c갤로그로 이동합니다. 2009.11.24 23:47:11
조회 702 추천 0 댓글 3


이번에는 스프라이트를 확대/축소하거나 회전해서 출력할 수 있게 해보자.

이런 까다로운 일들을 하기 위해선 \'행렬\'이라는 걸 알아야한다. 하지만 여기서 행렬에 대해서 자세히 설명할 시간은 없고, 3D프로그래밍을 할때는 행렬을 통해서 여러가지 변환을 한다는 사실만 알아두도록 하자.

D3D에서는 행렬을 위한 자료형으로 D3DXMATRIX타입을 제공한다.
그리고 편리한 행렬 계산을 위해 D3DXMatrix~~~ 시리즈 함수를 제공한다.
D3DXMATRIX 타입에 각종 연산자(대입, 곱하기, 더하기, 빼기 등등)가 정의되어 있으므로 연산도 편리하게 할 수 있다.

점 (x, y, z, 1)에다가 4차정사각행렬을 곱함으로써 행렬변환은 이루어진다. 점에다가 특정한 행렬을 곱하면 여러가지 효과를 줄 수 있다.

ID3DXSprite는 SetTransform 라는 변환행렬을 지정하는 함수를 제공한다.
19499B174B0BD8A98067DA
자, 가상의 텍스쳐가 좌표계 위에 있다.
(화면 상의 좌표계는 수학과는 다르게 아래로 내려갈수록 y가 증가한다. )
변환행렬을 단위행렬로 설정해놓으면 항상 이 상태로 텍스쳐가 출력된다.
자, 이제 행렬의 마법이 시작된다.
1. 평행이동 D3DXMatrixTranslation(행렬, x이동, y이동, z이동)
1121FC234B0BE132248A03
x축, y축, z축 방향으로 평행이동시킨다. 근데 2D출력에서는 z축이동은 필요가 없으므로 무시해도 된다.

D3DXMATRIX mat;
D3DXMatrixTranslation(&mat, 3.f, 4.f, 0.f);
m_pspr->SetTransform(&mat);
//x축으로 3, y축으로 4만큼 평행이동해서 그린다.

2. 확대/축소 D3DXMatrixScaling(행렬, x축확대율, y축확대율, z축확대율)
2018BA0C4B0BE2420961C1
x축, y축, z축으로 일정 비율 확대/축소시킨다. 역시 z축은 무시하도록 하자. 확대/축소시에 기준점은 항상 원점이다.

D3DXMATRIX mat;
D3DXMatrixScaling(&mat, 3.f, 4.f, 1.f);
m_pspr->SetTransform(&mat);
//x축으로 3배 늘리고, y축으로 4배 늘려서 그린다.

3. 회전 D3DXRotationZ(행렬, 회전각도)
2005F50C4B0BE2E1236869
z축을 축으로 일정 각도 회전시킨다. z축은 원점을 지나, x,y축에 수직으로 화면속으로 들어가는 방향이다. 그러므로 기준점은 원점이 되고, 회전방향은 우리가 보는 입장에서 시계방향이 된다.

D3DXMATRIX mat;
D3DXMatrixRotationZ(&mat, D3DX_PI/6.f);
m_pspr->SetTransform(&mat);
//시계방향으로 30도(Pi/6)회전시켜서 그린다.

참 쉽죠?
근데,  원점을 기준으로 회전하니까, 좀 거시기하다. 텍스쳐의 중심을 기준으로 회전하게 하려면 어떻게 해야 할까?

먼저 평행이동을 통해서 텍스쳐의 중심을 원점과 일치시킨다.
2066EF234B0BE89B7B583F

그리고 회전시킨다.
2014C11F4B0BE8B5653DEF
그리고 다시 평행이동시켜 원래 위치로 보낸다
121D48214B0BE8CF0A97E3
D3DXMATRIX mat, mat1, mat2, mat3;
D3DXMatrixTranslation(&mat1, -w*0.5f, -h*0.5f, 0.f); //w,h는 텍스쳐의 가로 세로길이
D3DXMatrixRotationZ(&mat2, angle); //angle은 회전각도
D3DXMatrixTranslation(&mat3, w*0.5f, h*0.5f, 0.f);
mat=mat1*mat2*mat3;
/*변환을 차례대로 적용하고 싶으면,
변환행렬들을 차례대로 곱하면 된다.*/
m_pspr->SetTransform(&mat);

이제 스프라이트를 회전시켜서, 확대/축소시켜서 그릴수 있겠다.
GRET GSprites::DrawSprite(UINT index, int x, int y, float sx, float sy, D3DCOLOR color) const
{
    if(m_vspr.size()<=index)return GRET_ERROR_PARAM;
    D3DXMATRIX mat, mat2;
    D3DXMatrixScaling(&mat, sx, sy, 0);
    mat*=*D3DXMatrixTranslation(&mat2, (float)x, (float)y, 0);
    GGame::GetInstance()->GetSprite()->SetTransform(&mat);
    if(FAILED( GGame::GetInstance()->GetSprite()
        ->Draw(m_vptxt[m_vspr[index].itxt],
        &m_vspr[index].rect, NULL, NULL, color) ))
    {
        return GRET_ERROR_FAIL;
    }
    return GRET_OK;
}
가로로 sx배, 세로로 sy배 확대/축소하는 함수이다.
중간에
mat*=*D3DXMatrixTranslation(&mat2, (float)x, (float)y, 0);
라는 상당히 해괴한 코드가 보인다.

D3DXMatrix~~함수는 첫번째 인자를 다시 리턴해준다.
즉 원래는
D3DXMatrixTranslation(&mat2, (float)x, (float)y, 0);
mat*=mat2;
인데, 어차피 D3DXMatrixTranslation(&mat2, (float)x, (float)y, 0)가 &mat2이므로,
mat*=*D3DXMatrixTranslation(&mat2, (float)x, (float)y, 0);라고 쓴것이다.

ID3DXSprite::Draw을 사용할때, 주의할점.

HRESULT Draw(  LPDIRECT3DTEXTURE9 pTexture,  CONST RECT * pSrcRect, CONST D3DXVECTOR3 * pCenter,  CONST D3DXVECTOR3 * pPosition,  D3DCOLORColor );
네 번째 인자로 주는 pPosition으로 좌표를 줄때, 행렬변환이 적용된 것을 감안해야 한다.
만약 가로, 세로 2배씩 키워주는 행렬을 변환행렬로 잡았을때, pPosition을 (10, 10, 0)으로 주면, pPosition에도 변환이 적용되어 결국 (20, 20, 0)에 텍스쳐를 출력하게 될 것이다.
1628131A4B0BEF9B969972
행렬변환을 이용해서 스프라이트를 여러가지 모습으로 출력해보자.




추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 가족과 완벽하게 손절해야 할 것 같은 스타는? 운영자 24/06/24 - -
160067 클럽박스 검색 사이트 혹은 프로그램 만들어서... [12] 물속의다이아갤로그로 이동합니다. 09.12.01 191 0
160066 철권에 돈을 투자한 솔로 [9] 아주아슬갤로그로 이동합니다. 09.12.01 161 0
160065 확실히 경력자가 되니까 대우가 달라지네요 [8] 구루구루(115.145) 09.12.01 180 0
160064 북한 100:1 화폐개혁 단행 [2] Vita500갤로그로 이동합니다. 09.12.01 112 0
160061 정부의 어떤 프로젝트 (2) [12] ㅇㅇ(210.107) 09.12.01 162 0
160060 DrawText 질문점여. [4] 켁큇갤로그로 이동합니다. 09.12.01 86 0
160057 소켓 관련해서 질문하시는 분들 참고하세요. [3] 외계달팽갤로그로 이동합니다. 09.12.01 84 0
160054 으엌ㅠㅠㅠ 프갤형들 프로그램 돌려주는 서버같은거 없어? [23] ㄱㄷㅅ(222.120) 09.12.01 160 0
160052 asp 디비연동만 시키면 왜 오류가 나나요? [6] admino(125.133) 09.12.01 76 0
160051 캐닭횽은 봄미다. 연화갤로그로 이동합니다. 09.12.01 50 0
160050 정전을 방지하는 글... [2] 천회장(125.7) 09.12.01 69 0
160049 Cloud Computing [7] algo갤로그로 이동합니다. 09.12.01 126 0
160048 님드롸 이거 소켓 프로그래밍인데 조언좀; [5] 디디디다(218.55) 09.12.01 103 0
160047 iphone vs omnia [5] ㅇㄴㅣㅏ갤로그로 이동합니다. 09.12.01 108 0
160046 아오~ C# 버튼클릭으로 리스트뷰? 트리리스트? 어떻게 구성하는 거야?? [3] 클라리네이갤로그로 이동합니다. 09.12.01 132 0
160044 나 진짜 존나 병신인거같다. [7] 개쉛기갤로그로 이동합니다. 09.12.01 164 0
160043 PHP 질문요.. 유휴호갤로그로 이동합니다. 09.12.01 46 0
160042 필요하다. 인간적으로 [17] yundream(211.189) 09.12.01 228 0
160041 유리한은 봄미다 ㅡ.ㅡㅋ [4] 카이신갤로그로 이동합니다. 09.12.01 96 0
160040 머여. 윈도우는 루프백 주소 뭘로 확인 하냐.. [5] yundream(211.189) 09.12.01 149 0
160038 맷트랩 할줄 아는 형들~~ [2] 너니(203.249) 09.12.01 85 0
160037 지난떡밥이지만 네이버 N드라이브 괜찮은거 같다 진짜 [2] 캐꼬꼬닭(112.216) 09.12.01 119 0
160036 숙신횽은 젭알 봄.니.다. [1] 키즈라엘갤로그로 이동합니다. 09.12.01 80 0
160035 아침에 디질뻔 했음... [7] 아주아슬갤로그로 이동합니다. 09.12.01 119 0
160034 숙신횽은 젭알 봄.니.다. [2] 물속의다이아갤로그로 이동합니다. 09.12.01 84 0
160033 프갤에 들어오는 뉴비들은 봅니다 [7] 캐꼬꼬닭(112.216) 09.12.01 111 0
160032 나는 버스나 전철을 애용합니다. [2] 개쉛기갤로그로 이동합니다. 09.12.01 108 0
160030 코딩 스타일 [5] JuEUS-U갤로그로 이동합니다. 09.12.01 132 0
160026 횽들아 완전 초특급 급질문~ [5] 물속의다이아갤로그로 이동합니다. 09.12.01 72 0
160025 숙신 따위는 부럽지않다.. 나에겐 그녀가 있습니다. [1] Vita500갤로그로 이동합니다. 09.12.01 97 0
160024 viva횽은 봅니다. 노무현 전대통령의 기사내용 [3] Vita500갤로그로 이동합니다. 09.12.01 90 0
160023 아이폰 vs 안드로이드폰 [7] zijn(124.49) 09.12.01 167 0
160022 SQL 에 관한 문제 하나 물어 볼께여.... [2] 유휴호갤로그로 이동합니다. 09.12.01 80 0
160021 제가 지금 쇼핑몰을 만들면서공부하는데요 ㅎㅂㅎ(125.185) 09.12.01 42 0
160019 3일째 삽질중.. 질문이요 ㅜㅜ [3] MFC초보(203.246) 09.12.01 583 0
160018 지적 재산권을 저렇게 우습게 보는 나라에서 IT산업이 크길 바라다니 [12] AL갤로그로 이동합니다. 09.12.01 152 0
160016 asp 디비 연결만 시키면 오류가 나네요 admino(125.133) 09.12.01 45 0
160015 Winpcap 사용하고 싶은데 .. ㅜㅜ 우니피캐프(59.6) 09.12.01 2185 0
160014 여기서 틀린것좀 가르쳐주세요.. [2] 쥿뮈켥ㅃ!갤로그로 이동합니다. 09.12.01 45 0
160013 Triple3 님 저 알고리즘 3판 솔류션 다시 공유가능한가요?? [9] 울트라맨이야(222.112) 09.12.01 84 0
160012 프갤만 보고 디씨를 판단해서는 안됩니다. [3] prismatic갤로그로 이동합니다. 09.12.01 97 0
160011 현재시각 새벽 2시 16분 [1] 아주아슬갤로그로 이동합니다. 09.12.01 48 0
160010 후..30여페이지를 수정했더니 힘들군. [1] 발코딩(112.149) 09.12.01 47 0
160009 저는 자러갈게용 [3] 앙앙ㅇ갤로그로 이동합니다. 09.12.01 71 0
160008 프갤형들 프로그램 돌려주는 호스팅 업체같은거업엉? [2] ㄷㄱ(222.120) 09.12.01 61 0
160007 디씨한지 얼마 안됬는데요 질문좀. [5] vampiric갤로그로 이동합니다. 09.12.01 85 0
160006 차가운 핫 초코 제작법 [17] prismatic갤로그로 이동합니다. 09.12.01 179 0
160005 카이신 보고 예언하나 하지. [4] 유리한갤로그로 이동합니다. 09.12.01 61 0
160004 근데 생각해보니까 나 컴플렉스 있는거 같아... [9] 삼퀄(125.141) 09.12.01 85 0
160003 아 미치겟어 진짜 마우스 이벤트 -- [1] 좀소리갤로그로 이동합니다. 09.12.01 52 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2