2013-01-18 3 views
1

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); 
} 

답변

1

당신이 너무 떨어져 방귀하지 않는 한 가지가 마우스 -1 1 개 공간 (안 0으로되어 있는지 확인하는 것입니다 당신은 또한 당신이 세계의 공간을 원하는 경우

Matrix ivp = Matrix::Invert(Projection) 
) 당신의 관점 tranform의 역 (또는 viewprojection를 사용할 필요가

Vector3 orig = Vector3(mouse.X,mouse.Y,0.0f); 
Vector3 far = Vector3(mouse.X,mouse.Y,1.0f); 

: ) 1 그럼 당신은 두 벡터를 만들 그런 다음

당신이 할 :

Vector3 rayorigin = Vector3::TransformCoordinate(orig,ivp); 
Vector3 rayfar = Vector3::TransformCoordinate(far,ivp); 

당신이 선을 원하는 경우에, 당신은 또한 단순히 인 방향이 필요합니다 : 당신은 투사의 4 × 4 행렬을 사용하는

Vector3 raydir = Normalize(rayfar-rayorigin); 
+0

, 내가 생각? 저는 Vector3 :: TransformCoordinate에 익숙하지 않습니다. 벡터를 4x4에 곱하는 함수입니까? 내 캐머의 현재 행렬과 FOV, zNear, zFar 평면 및 종횡비에서 투영 행렬을 얻는 방법은 무엇입니까? OpenGL을 사용하여 열기 –

+0

예. 투영에 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

관련 문제