1

假设我有一个实体的全局(世界)坐标vQVector3D)。然后我进行坐标变换:

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

whereprojectionMatrix()viewMatrix()areQMatrix4x4实例。我实际上得到了什么,这与小部件坐标有什么关系?

4

1 回答 1

1

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

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

更进一步,您(或者更确切地说是您的图形 API)会进行透视划分。然后你在标准化设备空间——基本上在这里你从 3D 到 2D,这样你就知道在你的渲染画布中你的像素必须用你使用的任何照明计算进行着色。这幅画布是边长为 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也是如此。我没有检查过这个)。

于 2018-03-13T16:03:05.370 回答