2009년 10월 23일
[Direct3D] ID3DXSprite로 BillBoard 사용하기
몇년전 DX가지고 이런말 하는 것도 우습지만, DX가 버전업하면서
단순한 스크린평면에 텍스쳐를 뿌리는 것뿐이었던 ID3DXSprite가 여러가지 기능을 탑재하게 되었습니다.
그중 빌보드를 구현할 수 있다는 내용도 포함되어 있죠.
예전에는 기능이 있다는 것만 알고 넘어갔는데
얼마 전 수업에서 언급되었길래 한번 사용법을 찾아봤습니다...
당연히 3D상에서 빌보드효과를 위해선 월드좌표상에서 텍스쳐를 뿌려야겠죠...
(g_SP가 ID3DXSprite 객체입니다. D3DXCreateSprite로 생성합니다.)
g_SP->Begin(D3DXSPRITE_BILLBOARD | D3DXSPRITE_OBJECTSPACE);
그리고 출력을 합니다.
g_SP->Draw(g_pTxFloor, NULL, NULL, NULL, 0xffffffff);
당연히 제대로 출력될 리가 없죠...
BillBoard는 항상 카메라를 향하며 회전하므로, 그에 대한 정보를 넣어줘야 하니깐요.
카메라 정보를 전달해 주는 것은 SetWorldViewLH메소드가 맡고 있습니다.
g_SP->SetWorldViewLH(NULL, &mxView);
문제는 SetWorldViewLH의 호출 위치입니다!!!
이 함수는 Begin과 End내에서 호출하면 실패하게 됩니다.
반드시 Begin 앞에서 호출해줘야 합니다!!!
이것때문에 좀 해맸네요...
빌어먹을... MSDN에도 명시되어 있지 않습니다...
몇가지 유추한 것들을 적자면
SetWorldView의 WorldMatrix는 BillBoard에선 사용하지 않는 듯 싶습니다. 값변화가 적용되지 않습니다.
대신 위치를 지정할땐, Draw의 Position Vector로 입력해주면 됩니다.
또한 빌보드의 회전축은 기본적으로 이미지의 좌하단입니다. (Draw시 NULL 입력할때)
정상적인 빌보드로 사용할려면 이미지의 중심을 센터로 잡아줘야 하는데,
이때의 좌표값은 텍스쳐의 물리적 위치입니다. (일반적으로 1.0으로 맵핑되는 방식이 아닙니다.)
예를 들어 512x512이미지라면 256, 256를 넣어줘야 중심으로 지정됩니다.
그리고 월드스페이스상의 메쉬의 크기는 별도의 지정하는 게 안보이고
상대적으로 매우 커지는 것으로 봐선, 이미지의 크기만큼 메쉬를 생성하는게 아닐까 싶네요.
적당히 스케일해줘야겠죠... 자세한건 실험해보거나 문서를 찾아보면 되겠죠...
써 본 감상으로는....
그냥 빌보드 오브젝트 따로 만들어서 쓰고 말겠습니다....
만드는 것도 간단하고, 다른 메쉬들과 호환성도 유지할 수 있고 말이죠... 커스텀도 가능하고...
외국쪽에서도 그렇고, 자료 정말 없네요.....
하긴 그다지 필요 없어보이긴 하죠 --;;;
단순한 스크린평면에 텍스쳐를 뿌리는 것뿐이었던 ID3DXSprite가 여러가지 기능을 탑재하게 되었습니다.
그중 빌보드를 구현할 수 있다는 내용도 포함되어 있죠.
예전에는 기능이 있다는 것만 알고 넘어갔는데
얼마 전 수업에서 언급되었길래 한번 사용법을 찾아봤습니다...
당연히 3D상에서 빌보드효과를 위해선 월드좌표상에서 텍스쳐를 뿌려야겠죠...
(g_SP가 ID3DXSprite 객체입니다. D3DXCreateSprite로 생성합니다.)
g_SP->Begin(D3DXSPRITE_BILLBOARD | D3DXSPRITE_OBJECTSPACE);
그리고 출력을 합니다.
g_SP->Draw(g_pTxFloor, NULL, NULL, NULL, 0xffffffff);
당연히 제대로 출력될 리가 없죠...
BillBoard는 항상 카메라를 향하며 회전하므로, 그에 대한 정보를 넣어줘야 하니깐요.
카메라 정보를 전달해 주는 것은 SetWorldViewLH메소드가 맡고 있습니다.
g_SP->SetWorldViewLH(NULL, &mxView);
문제는 SetWorldViewLH의 호출 위치입니다!!!
이 함수는 Begin과 End내에서 호출하면 실패하게 됩니다.
반드시 Begin 앞에서 호출해줘야 합니다!!!
이것때문에 좀 해맸네요...
빌어먹을... MSDN에도 명시되어 있지 않습니다...
몇가지 유추한 것들을 적자면
SetWorldView의 WorldMatrix는 BillBoard에선 사용하지 않는 듯 싶습니다. 값변화가 적용되지 않습니다.
대신 위치를 지정할땐, Draw의 Position Vector로 입력해주면 됩니다.
또한 빌보드의 회전축은 기본적으로 이미지의 좌하단입니다. (Draw시 NULL 입력할때)
정상적인 빌보드로 사용할려면 이미지의 중심을 센터로 잡아줘야 하는데,
이때의 좌표값은 텍스쳐의 물리적 위치입니다. (일반적으로 1.0으로 맵핑되는 방식이 아닙니다.)
예를 들어 512x512이미지라면 256, 256를 넣어줘야 중심으로 지정됩니다.
그리고 월드스페이스상의 메쉬의 크기는 별도의 지정하는 게 안보이고
상대적으로 매우 커지는 것으로 봐선, 이미지의 크기만큼 메쉬를 생성하는게 아닐까 싶네요.
적당히 스케일해줘야겠죠... 자세한건 실험해보거나 문서를 찾아보면 되겠죠...
써 본 감상으로는....
그냥 빌보드 오브젝트 따로 만들어서 쓰고 말겠습니다....
만드는 것도 간단하고, 다른 메쉬들과 호환성도 유지할 수 있고 말이죠... 커스텀도 가능하고...
외국쪽에서도 그렇고, 자료 정말 없네요.....
하긴 그다지 필요 없어보이긴 하죠 --;;;
# by | 2009/10/23 23:59 | Programming | 트랙백 | 덧글(0)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]