2013-07-19 485 views
2

我知道其他人已經問過這個問題,但我想知道是否有一個非常好的函數可用於將3D點轉換爲2D點。我自己試了一下,但沒有奏效。我用過:Xna將3D座標轉換爲2D屏幕座標

protected Vector2 ScreenCoords(Vector3 v, Matrix viewMatrix, Matrix projectionMatrix) 
{ 
    Matrix viewProj = viewMatrix * projectionMatrix; 
    float w = viewProj.M14 * v.X + viewProj.M24 * v.Y + viewProj.M34 * v.Z + viewProj.M44; 
    return new Vector2(
      (viewProj.M11 * v.X + viewProj.M21 * v.Y + viewProj.M31 * v.Z + viewProj.M41)/w, 
      (viewProj.M12 * v.X + viewProj.M22 * v.Y + viewProj.M32 * v.Z + viewProj.M42)/w);   
} 

這是正確的嗎?難道我做錯了什麼?我嘗試在原點放置一個方塊,並將相機放在(10,10,10)並指向(0,0,0),但方塊沒有出現。

回答

1

XNA有一個內置的函數來處理,對你:

  graphics.GraphicsDevice.Viewport.Unproject(MyVector3Location, camera.ProjectionMatrix, camera.ViewMatrix, camera.WorldMatrix); 
+0

但這只是給我出的Vector3。如果可能的話,我需要採用3D座標並將其轉換爲2D座標(Vector3轉換爲Vector2)。 – pjrader1

+0

@cakeisajoke - 這是2D屏幕座標,我不知道它爲什麼會返回爲Vector3。就像'Vector3 myVec = ..Unproject(..);'和'Vector2 Location = new Vector2(myVec.X,myVec.Y);' – mcmonkey4eva

+0

第三個變量用於存儲深度,這就是3D引擎所做的,使用此信息對樣品進行分類。但是,如果你放棄了2d的價值。 – joojaa

相關問題