如何从世界坐标获取屏幕(小部件)坐标

How to get screen (widget) coordinates from world coordinates

假设我有一个实体的全球(世界)坐标 v (QVector3D)。然后我做一个坐标变换:

pos = camera.projectionMatrix() * camera.viewMatrix() * v

其中 projectionMatrix()viewMatrix()QMatrix4x4 个实例。我实际上得到了什么,这与小部件坐标有什么关系?

以下值适用于 OpenGL。它们在其他图形中可能有所不同 APIs

你得到 Clip Space 坐标。想象一个边长为 2 的立方体(即 -1 到 1 -w 到 w 在所有轴上 1)。你改变你的世界,让你在这个立方体中看到你用相机看到的一切,这样显卡就可以丢弃立方体之外的一切(因为你看不到它,它不需要渲染。这是出于性能原因)。

更进一步,您(或者更确切地说是您的图形 API)会进行透视划分。然后你在规范化设备 Space - 基本上在这里你从 3D 到 2D,这样你就知道在你的渲染中的什么地方 canvas 你的像素必须用你使用的任何光照计算来着色。这个 canvas 是边长为 1 的四边形(我相信)。

之后,您将使用小部件的任何宽度和高度拉伸这些标准化的设备坐标,这样您就知道彩色像素在小部件中的位置(在 OpenGL 中定义为视口)。

您看到的小部件坐标可能您的小部件在屏幕上的坐标(通常是指定的左上角)。因此,如果您的小部件坐标是 (10, 10) 并且您在视口变换中的渲染像素位于 (10, 10),那么在屏幕上您的渲染像素将位于 (10+10, 10+10)。


1在与 derhass 讨论后(见评论),很多图形编程书籍都谈到 [-1, -1, -1] x [1 , 1, 1] 作为剪裁量。然而 OpenGL 4.6 Core Spec 声明它实际上是 [-w, -w, -w] x [w, w, w] (根据 derhass 的说法,其他 API 也是一样的。我没有检查过这个)。