2013-07-19 300 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

相关问题