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

时间:2018-03-13 14:57:46

标签: python-3.x opengl qt5 qt3d pyside2

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

更进一步,你(或者更确切地说是你的图形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它是相同的。我没有检查过这个) 。