2D 점 (x, y)을 가지고 있으며이를 벡터에 투영하여 광선 추적을 수행 할 수 있습니다. 사용자가 3D 객체를 클릭했는지 확인하기 위해 추적합니다. 다른 모든 코드를 작성했습니다. 마우스의 xy 코드에서 Vector를 가져 오는 함수로 돌아 왔을 때를 제외하고는 Field-Of-View를 고려하지 않았습니다. '부두 (voodoo)'픽스는 라이브러리에 좋은 아이디어가 아니기 때문에 그 요인이 무엇인지 추측하고 싶지는 않습니다. 어떤 수학 마술사도 도와주고 싶어? :-).어떻게 2D 점을 찍고 그것을 원근 카메라로 3D 벡터에 투영합니까?
Heres는 카메라의 FOV를 필요로 내 현재 코드는 적용 :
sf::Vector3<float> Camera::Get3DVector(int Posx, int Posy, sf::Vector2<int> ScreenSize){
//not using a "wide lens", and will maintain the aspect ratio of the viewport
int window_x = Posx - ScreenSize.x/2;
int window_y = (ScreenSize.y - Posy) - ScreenSize.y/2;
float Ray_x = float(window_x)/float(ScreenSize.x/2);
float Ray_y = float(window_y)/float(ScreenSize.y/2);
sf::Vector3<float> Vector(Ray_x,Ray_y, -_zNear);
// to global cords
return MultiplyByMatrix((Vector/LengthOfVector(Vector)), _XMatrix, _YMatrix, _ZMatrix);
}
, 내가 생각? 저는 Vector3 :: TransformCoordinate에 익숙하지 않습니다. 벡터를 4x4에 곱하는 함수입니까? 내 캐머의 현재 행렬과 FOV, zNear, zFar 평면 및 종횡비에서 투영 행렬을 얻는 방법은 무엇입니까? OpenGL을 사용하여 열기 –
예. 투영에 4x4 매트릭스를 사용합니다. TransformCoordinate는 위치를 변환 (기술적으로는 마지막 구성 요소를 1로 설정하여 vector4로 변환 함)하고 w를 제거합니다. 영사 매트릭스를 얻으려면 (GL 친절, https://github.com/cinder/Cinder/blob/master/include/cinder/Matrix44.h 또는 http://nopper.tv/glus.html, dx 버전 : http : /msdn.microsoft.com/en-us/library/windows/desktop/bb281727(v=vs.85).aspx). 가장 좋은 방법은 카메라 (보기)를 별도로 유지 한 다음 fov/near/far에서 투영법을 작성하고 두 행렬을 곱하는 것입니다 (다른 작업에 자주 필요하기 때문에). – catflier