픽킹 문시몬
픽킹이란? 2차원인 모니터공간을 클릭하였을때 좌표와 방향을 이용하여 3차원 공간의 클릭으로 변환 하는 기술
픽킹의 원리와 이용 클릭한 마우스의 좌표를 받아 와 그 방향으로 레이(광선) 를 쏜다 그 레이를 이용해 교차판정을 해서 레이와 충돌 된 오브젝트를 찾아낸다 교차판정시 레이의 시작점과 충돌한 오브젝트의 거리를 계산하여 충돌 레벨을 조절 할 수 있다. ★ 충돌 검출을 위해서는 레이와 오브젝트가 같은 차원 안에 있어야 한다!
픽킹 코드 분석 1 레이의 방향 레이의 시작점 마우스의 좌표를 받아온다 스크린 좌표에서 클라이언트 좌표로 변환 마우스가 클라이언트 영역 밖에 있을때는 return false를 해준다. D3DXVECTOR3 vPickRayDir; D3DXVECTOR3 vPickRayOrig; RECT rcClient; POINT ptCursor; GetClientRect(g_hWnd,&rcClient); GetCursorPos(&ptCursor); ScreenToClient(g_hWnd,&ptCursor); if( ptCursor.x < 0 || rcClient.right < ptCursor.x || ptCursor.y < 0 || rcClient.bottom < ptCursor.y) return false;
픽킹 코드 분석 2 카메라의 투영 행렬을 받아온다 이 식은 그냥 외우자! 시야각에 따른 굴절을 계산 해준다. rcClient 는 뷰 포트영역의 길이 카메라의 뷰 행렬을 받아온다 뷰 행렬을 Inverse해준다 레이의 방향을 계산한다 D3DXMATRIX* pmatProj = m_pCam->GetProjMatrix(); D3DXVECTOR3 v; v.x = ( ( ( 2.0f * ptCursor.x ) / rcClient.right ) - 1 ) / pmatProj->_11; v.y =-( ( ( 2.0f * ptCursor.y ) / rcClient.bottom) - 1 ) / pmatProj->_22; v.z = 1.0f; D3DXMATRIXA16 matView,m; matView = *m_pCam->GetViewMatrix(); D3DXMatrixInverse(&m,NULL,&matView); vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31; vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32; vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
픽킹 코드 분석 3 이 소스는 터레인과의 충돌 검출이다 터레인의 인덱스버퍼 카운트를 받아온다 앞의 변수명을 보고 어떤 정보를 받아오는지 알 수 있다 삼각형의 세 점을 저장한다 충돌 검출 부분 IntersectTriangle함수는 DX 샘플 브라우저에 있는것을 써도 된다 int Count = m_pTerrain->GetIndex(); for( int i = 0;i<Count;i++) { JN_GEO::tagVerNormalTex* pVertex = m_pTerrain->GetVertexInfo(); tagIndex* pIndex = m_pTerrain->GetIndexInfo(); D3DXVECTOR3 v[3]; v[0] = pVertex[pIndex[i].w0].vPos; v[1] = pVertex[pIndex[i].w1].vPos; v[2] = pVertex[pIndex[i].w2].vPos; if(IntersectTriangle( vPickRayOrig,vPickRayDir,v[0],v[1],v[2],&fDist,&fBary1,&fBary2)) }
픽킹 동영상 Click to Play