2014-10-01 2 views
0

4 가지 방법을 시도했지만 모두 작동하지 않았습니다. 다른 곳에서는 내 코드가 작동하고 카메라가 제대로 움직이며 물체가 제대로 움직입니다.2D 화면 위치 문제로 3D 점 투영

저는 SharpDX를 사용하고 있습니다. 제 프로젝션 매트릭스는 원근 투영 매트릭스입니다.

나는 그 지점에서 커서를 위치시키기 위해 3d 점의 화면 위치를 얻으려고합니다. (모두가 서로 다른 결과를) 네 가지 방법에서

public Vector2 WorldPosToScreenPos1(Vector3 p) 
{ 
    Vector3.Transform(ref p, ref View, out p); 
    Vector3.Transform(ref p, ref Projection, out p); 

    return new Vector2(
     RenderForm.ClientSize.Width * (p.X + 1)/2, 
     RenderForm.ClientSize.Height * (1 - (p.Y + 1)/2) 
     ); 
} 

public Vector2 WorldPosToScreenPos2(Vector3 p) 
{ 
    Vector3.Transform(ref p, ref View, out p); 
    Vector3.Transform(ref p, ref Projection, out p); 
    p.X /= p.Z; 
    p.Y /= p.Z; 
    p.X = (p.X + 1) * RenderForm.ClientSize.Width/2; 
    p.Y = (p.Y + 1) * RenderForm.ClientSize.Height/2; 

    return new Vector2(p.X, p.Y); 
} 

public Vector2 WorldPosToScreenPos3(Vector3 p) 
{ 
    Viewport viewport = new Viewport(0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height); 
    viewport.Project(ref p, ref ViewProj, out p); 

    return new Vector2(p.X, p.Y); 
} 

public Vector2 WorldPosToScreenPos4(Vector3 p) 
{ 
    Vector3.Project(p, 0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height, 1, 10000, ViewProj); 
    return new Vector2(p.X, p.Y); 
} 

내가 얻을 2D 위치는 종종 큰 차이로 꺼져 :

은 내가 시도 4 개 방법이 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

네 번째 방법이 옳았으므로 Vector3.Project()에서 반환 한 값을 검색하지 못했습니다.

다른 3 가지 방법은 여전히 ​​현저하게 다른 결과를 보여 주었고 여전히 작동하지 않는 이유는 여전히 알 수 없습니다. 누군가가 알고 있으면, 나는 알기를 바랍니다.