WorldToScreen function C#

本文关键字:function WorldToScreen | 更新日期: 2023-09-27 17:55:40

谁能向我解释屏幕功能(c#)的世界?我想了解它的作用,如何使用它以及我需要使用它。到目前为止,我知道它将 3d 矢量转换为 2d 矢量,然后可以在显示器上显示。现在我想知道在屏幕上将 3d 点显示为绘图所需的步骤。提前:)感谢

WorldToScreen function C#

我将假设您想要的屏幕空间从上到下运行,因此{0,0}是左上角,{screenWidth,screenHeight}是右下角。我还将假设规范化设备坐标在 [{-1, -1, 0}, {1, 1, 1}] 范围内。


您要做的第一件事是将 3D 世界坐标转换为所谓的规范化设备坐标(简称 NDC)。这是一个中间步骤,简化了到屏幕空间的映射。

规范化设备坐标用于测量监视器上的相对位置。这些不是像素坐标。屏幕中心始终为 0,顶部始终为 1,底部始终为 -1。左侧始终为 -1,右侧始终为 1。

了解视图和投影矩阵后,转换如下:

Vector3 pointInNdc = Vector3.Transform(pointInWorld, view * projection);

要了解这种转换是如何工作的,你可以看看Paradox Game Engine的源代码。

坐标进行规范化后,您希望将其映射到屏幕空间:

    要找到 X 坐标,请将其从范围 [-1,1] -> [0,2] 移动,方法是将它
  1. 加 1 并除以 2 以将其从范围 [0,2] -> [0,1] 移动。将其乘以屏幕宽度,屏幕空间中就有 X 坐标。

float screenX = (pointInNdc.X + 1) / 2f * screenWidth;

  1. 查找 Y 坐标类似,但不是加 1,而是需要从 1 中减去 pointInNdc.Y 以颠倒坐标(从 Y 从底部到顶部移动到 Y 从上到下运行)

float screenY = (1 - pointInNdc.Y) / 2f * screenHeight;

在那里,您有屏幕空间的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);
}