2014-10-01 80 views
0

我嘗試過4種方法,所有這些方法都無效。我的代碼在其他地方工作,相機正常移動,物體正常移動。將3D點投影到2D屏幕位置問題

我使用SharpDX,我的投影矩陣是一個透視投影矩陣。

我想獲得一個3d點的屏幕位置,以便將光標定位在該點。

這些都是4種方法我都試過:

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位置我得到的是關閉的,往往幅度較大。我究竟做錯了什麼?

回答

0

原來第四種方法是正確的,它所缺少的只是檢索Vector3.Project()返回的值。

其他3種方法仍然給出了顯着不同的結果,我仍然不知道爲什麼他們不工作。如果有人知道,我很樂意知道。