世界屏幕功能C#
谁能给我解释一下屏幕功能(c#)的世界吗? 我想了解它的功能,如何使用它以及我需要使用它的内容。 到目前为止,我知道,它将3d向量转换为2d向量,然后可以在监视器上显示。 现在我想知道在屏幕上以图形形式显示3d点所需的步骤。世界屏幕功能C#,c#,vector,C#,Vector,谁能给我解释一下屏幕功能(c#)的世界吗? 我想了解它的功能,如何使用它以及我需要使用它的内容。 到目前为止,我知道,它将3d向量转换为2d向量,然后可以在监视器上显示。 现在我想知道在屏幕上以图形形式显示3d点所需的步骤。 Thx预先:)我将假设您想要的屏幕空间从上到下运行,因此{0,0}是左上角,{screenWidth,screenHeight}是右下角。我还要假设标准化的设备坐标在[{-1,-1,0},{1,1,1}]的范围内 首先要做的是将3D世界坐标转换为标准化设备坐标(简称NDC
Thx预先:)我将假设您想要的屏幕空间从上到下运行,因此{0,0}是左上角,{screenWidth,screenHeight}是右下角。我还要假设标准化的设备坐标在[{-1,-1,0},{1,1,1}]的范围内
首先要做的是将3D世界坐标转换为标准化设备坐标(简称NDC)。这是简化屏幕空间映射的中间步骤 标准化设备坐标用于测量监视器上的相对位置。这些不是像素坐标。屏幕的中心始终为0,顶部始终为1,底部始终为-1。左侧始终为-1,右侧始终为1 了解视图和投影矩阵后,转换如下:
Vector3 pointInNdc=Vector3.Transform(pointInWorld,view*projection)代码>
为了理解这种转换是如何工作的,您可以看一个例子
坐标标准化后,您希望将其映射到屏幕空间:
要查找X坐标,请将其从范围[-1,1]->[0,2]移动,方法是将其添加1,然后将其除以2,将其从范围[0,2]->[0,1]移动。乘以屏幕宽度,就得到了屏幕空间的X坐标
float screenX=(pointInNdc.X+1)/2f*屏幕宽度代码>
查找Y坐标是类似的,但不是添加1,而是需要从1中减去pointInNdc.Y以倒置坐标(从Y运行底部到顶部到Y运行顶部到底部)
float screenY=(1-pointInNdc.Y)/2f*屏幕高度代码>
这里有屏幕空间的X和Y坐标。有很多很棒的文章()描述了完全相同的过程,以及如何从ScreenToWorld返回
以下是WorldToScreen的完整列表:
Vector2 WorldToScreen(Vector3 pointInWorld, Matrix view, Matrix projection, int screenWidth, int screenHeight)
{
Vector3 pointInNdc = Vector3.Transform(pointInWorld, view * projection);
float screenX = (pointInNdc.X + 1) / 2f * screenWidth;
float screenY = (1 - pointInNdc.Y) / 2f * screenHeight;
return new Vector2(screenX, screenY);
}
您是否考虑过任何特定的框架/引擎(MonoGame、SharpDX、Unity3d等),您希望在哪种情况下理解这一点?我问这个的原因是因为有不同的方法,这取决于不同的参考框架是如何定义的。我想为突击立方体做一个简单的覆盖,它在玩家周围画矩形。