블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total41,314
Today0
Yesterday6

3D Picking

20130827이전/DX / 2013.04.07 17:45

정점 파이프라인에서 좌표계의 변환과정을 역으로 하면 됨..

광선 추적

말은 쉬움.

월드변환, 카메라변환, 투영, 뷰포트 변환을 역으로...


순서


마우스 좌표를 이용해 뷰포트상의 위치를 구한다.

뷰포트상의 위치를 언프로젝션한다. 이때 z값을 1.0f로 놓으면 ViewFrustum의 farZ값이 나옴.

farZ는 광선의 방향, 광선의 시작위치는 0,0,0로 셋

위 광선벡터를 View 변환행렬의 역행렬을 이용해 월드좌표계로 변환(이 변환에서 시작위치는 카메라의 위치가 됨)

광선은 현재 월드좌표계에서의 위치와 방향이므로, 충돌 체크할 오브젝트를 동일한 좌표계로 변환(그 역도 가능)


구체적인 순서

1. ViewPort를 얻어온다.

D3DVIEWPORT9 viewPort;

mouseToViewX    = (mouseX - viewPort.X)*2 / viewPort.Width;

mouseToViewY    = -(mouseY - viewPort.Y)*2 / viewPort.Height;

mouseToViewZ    = 1.0f        ///farZ

2. Projection 행렬을 얻어와 언프로젝션

projMatrix;

unprojX    = (mouseToViewX - projMatrix[2][0]) / projMatrix[0][0] * mouseToViewZ;

unprojY    = (mouseToViewY - projMatrix[2][1]) / projMatrix[1][1] * mouseToViewZ;


3. 광선의 시작과 방향셋(뷰 변환이 된 상태에서의 좌표계임)

vectorOrigin    = 0, 0, 0;

vectorDir        = unprojX, unprojY, mouseToView;

viewInverseMatrix;

worldOrigin    = Transform vectorOrigin using viewInverseMatrix;

worldDir        = Transform vectorDir     using viewInverseMatrix;


4. 월드 상에서의 광선이 구해진 상태

이후에는 충돌처리할 폴리곤과, 월드든 로컬이든 좌표계를 맞춰준 후 충돌처리하시오~




'20130827이전 > DX' 카테고리의 다른 글

생각난김에 스카이 박스 정리  (0) 2013.04.30
3D 피킹 정리  (0) 2013.04.30
3D Picking  (0) 2013.04.07
짐벌락과 그 해결.  (0) 2013.04.03
월드 좌표계로의 변환  (0) 2013.04.01
D3DXMATRIX 와 D3DXMATRIXA16  (0) 2013.03.25
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함