世界屏幕功能C#

世界屏幕功能C#,c#,vector,C#,Vector,谁能给我解释一下屏幕功能(c#)的世界吗? 我想了解它的功能,如何使用它以及我需要使用它的内容。 到目前为止,我知道,它将3d向量转换为2d向量,然后可以在监视器上显示。 现在我想知道在屏幕上以图形形式显示3d点所需的步骤。 Thx预先:)我将假设您想要的屏幕空间从上到下运行,因此{0,0}是左上角,{screenWidth,screenHeight}是右下角。我还要假设标准化的设备坐标在[{-1,-1,0},{1,1,1}]的范围内 首先要做的是将3D世界坐标转换为标准化设备坐标(简称NDC

谁能给我解释一下屏幕功能(c#)的世界吗? 我想了解它的功能,如何使用它以及我需要使用它的内容。 到目前为止,我知道,它将3d向量转换为2d向量,然后可以在监视器上显示。 现在我想知道在屏幕上以图形形式显示3d点所需的步骤。
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等),您希望在哪种情况下理解这一点?我问这个的原因是因为有不同的方法,这取决于不同的参考框架是如何定义的。我想为突击立方体做一个简单的覆盖,它在玩家周围画矩形。