피킹
네컨에서는 공간을 확보해놓는 작업만한다.
m_pVerticePos
정점의 정보를 보관해두기위해 정점의 갯수만큼 동적할당해 놓는다.
부모에서 한번해 할려고했는데 순서가 안맞는다.
그냥 값 채울때 m_pVerticePos와 m_pIndices에 값 채워넣어주자.
Get_PolygonVertexPositions
n번째 삼각형을 얻고싶다는것을 인자로 받아서
해당하는 m_pIndices의 값을 찾는다.
iIndex에 폴리곤인덱스 * 3을 저장하고 인덱스로 접근하면 3개씩 넘어가며 접근할수있다.
인덱스 버퍼는 어떤 정점을 써야하는지 가지고있으니 이것을 바로 m_pVerticesPos로 접근한다.
m_pIndices가 void이다.
m_iOneIndexSize==2 이면 m_pIndices를 _ushort형으로 캐스팅해서 m_pVerticesPos의 인덱스로 사용하자.
m_iOneIndexSize==4 이면 _ulong*로 캐스팅하자.
다음 인자로 받은 pPoints에 값을 채워주자.
플레이어에서 피킹호출해주자.
파이프라인 클래스에서 생성자에서 항등행렬로 채워주자.
얻어왔으니 충돌해주자.
fu,fv,fdist 밑 함수의 아웃풋 값이다.
포인트 1과 2사이를 1로봤을때 가로로 얼마나 떨어져있는지가 u이다.
포인트 1과 2사이를 1로봤을때 얼마나 떨어져 있는지가 v이다.
그래서 123이 아닌 231로 넣어서 위치를 구할수도 있다.
dis는 레이부터 점사이의 거리이다.
점에서 -피봇을 빼서 방향벡터를 구하고 정규화후 dist만큼 곱햇 더해주면 클릭한 점을 구할수도있다.
D3DXIntersecTri(포인트 1,2,3, 피봇,래이,fu,fv,fdist);
플레이어에서 키입력을 받았을때 Compute를 호출해주자.
정리
Comtpute_mouseCursorposInWorld-마우스커서의 위치를 구해서 월드 행렬의 위치로 변환한다.
{
윈도우상에 마우스 좌표를 구하고
투영 스페이스 상에 좌표로 옮기고
나누었던 w(뷰스페이스상의 z) 값을 다시 곱해준다. D3DXVec4Transform 함수는 w나누기를해주고 여기서 역행렬을 인자로 넣어주면 1/w로 들어가니 w를 곱해주는것과 같다.
우리가 구한 좌표는 뷰스페이스상의 니어좌표이다.
실제 레일을 구하기위해서는 마우스위치에서 - 니어좌표를 빼줘여한다,
(pivot - 카메라위치)
m_vMouseRay(마우스좌표 - 피봇)
(충돌할때 위 두개를 요구함)
뷰 상의 레이와 피봇을 월드 상으로 변환한다.
뷰변환의 역행렬을 곱해주자.
(피봇은 위치이니 coord로 레이는벡터이니 노말로)
이함수를 mainapp에서 호출한다 (특정개체를 요궇지않는다. 미리 한번 구해놓으면 편하다.)
}
다음
플레이어에서 키를 누르면 PickingCom->Compute_PickingPoint(지형의 버퍼,지역의 월드행렬)를 호춤
{
위에서 피봇과 레이가 구해져있는 상태에서
인자로 받은 월드행렬의 역행렬을 이용해
지형의 로컬로 이동시켜준다.
Get_PolyGonVertexPositions()를통해 생성될떄 미리 저장해둔 인덱스와 버텍스버퍼를 통해 점 3개를 받아옴 (Lock 함수로해도 되지만 프레임드랍이 심함)
VI버퍼의 생성시점에서 미리 인덱스,버텍스 버퍼를 할당해놓고 실제 채워주는시점에서 여기에도 채워줌
}
D3DXIntersectTri가 true를 반환해서 충돌한시점
알고있는 레이를 정규화해서 길이를 1로만들고 fDist를 구하고 이를 내피봇에 더한다
이게바로 충돌한 위치이다.
이를 vResultPos에 담아서 반환해주자.
트랜스폼 클래스의 Chase_Target()을 오버라이딩해주자.
LookAt_Target함수도 오버라이딩 해주자.
트랜스폼 클래스안에 m_isMoving을 만들어주고
플레이어서 눌렀을때 계속움직이도록 변경해주자.