屏幕坐标系和世界坐标系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屏幕坐标系和世界坐标系相关的知识,希望对你有一定的参考价值。
参考技术A 我们电脑上通常看到别人说的距离多少px,其实大部分指的是屏幕坐标系,而屏幕坐标系和世界坐标系是不一样的,世界坐标系就是我们数学中的坐标,X轴和Y轴。世界坐标系
屏幕坐标系
屏幕坐标系,主要有两种,
第一种:以左上角为原点。代表的操作系统有Windows,android,Symbian,ios 的Core Graphics。
第二种:以左下角为原点。比如iOS的CGContextDrawImage。
屏幕坐标系中大部分还是用的第一种,以左上角为原点(0,0)的。
所以很多时候,数学其实还是挺重要的,在很多问题上,有数学基础的话,很多东西就很容易想通的。
如何从世界坐标获取屏幕(小部件)坐标
【中文标题】如何从世界坐标获取屏幕(小部件)坐标【英文标题】:How to get screen (widget) coordinates from world coordinates 【发布时间】:2018-03-13 14:57:46 【问题描述】:假设我有一个实体的全局(世界)坐标v
(QVector3D
)。然后我进行坐标变换:
pos = camera.projectionMatrix() * camera.viewMatrix() * v
其中projectionMatrix()
和viewMatrix()
是QMatrix4x4
实例。我实际上得到了什么,这与小部件坐标有什么关系?
【问题讨论】:
【参考方案1】:以下值适用于 OpenGL。它们在其他图形 API 中可能有所不同
您获得剪辑空间坐标。想象一个边长为 2 的立方体(即所有轴上的 -1 到 1 -w 到 w1)。你改变你的世界,让你用相机看到的一切都在这个立方体中,这样显卡就可以丢弃立方体之外的一切(因为你看不到它,它不需要渲染。这是出于性能原因)。
更进一步,您(或者更确切地说是您的图形 API)会进行透视划分。然后你在标准化设备空间——基本上在这里你从 3D 到 2D,这样你就知道在你的渲染画布中你的像素必须用你使用的任何照明计算来着色。这个画布是边长为 1 的四边形(我相信)。
之后,您可以使用小部件的宽度和高度来拉伸这些标准化设备坐标,这样您就可以知道彩色像素在小部件中的位置(在 OpenGL 中定义为您的视口)。
您所看到的小部件坐标可能是小部件在屏幕上的坐标(通常指定左上角)。因此,如果您的小部件坐标为 (10, 10),并且您的视口转换中有一个渲染像素位于 (10, 10),那么在屏幕上您渲染的像素将位于 (10+10, 10+10)。
1在与 derhass(参见 cmets)讨论之后,很多图形编程书籍都谈到 [-1, -1, -1] x [1, 1, 1]作为裁剪量。但是,OpenGL 4.6 Core Spec 声明它实际上是 [-w, -w, -w] x [w, w, w] (根据derhass,其他API也是如此。我没有检查过这个)。
【讨论】:
我不完全同意你的描述,你特别混合了剪辑空间和 NDC。在剪辑空间中,查看体积不是 [-1,1] 立方体,而是 [-w,w]。 NDC 也不是从 3D 到 2D,它是从 4D 均匀到标准 3D,并且 NDC 和所有后续空间仍然是 3D,具有有意义的 z 坐标。深度测试依赖它。 它是一个带有 [-1, 1] 的立方体。您将 z 坐标转换为一个点的 w 坐标,但剪裁立方体仍在 z 轴上的 [-1, 1] 中(例如,请参见实时渲染第 3 页,第 18 页)。在一个合乎逻辑的论点上,立方体的范围对于任何点都是不同的(如果它是 [-w, w],这是没有意义的,因为你想有效地剪辑(即在 -1 和 1)。关于 4D ->3D,您的转换是使用 4x4 矩阵完成的,是的,但您的世界仍然只是 3D。您的世界中没有第 4 维度,只是因为您使用它进行平移。 你说的根本不是真的。观看量实际上是 [-w,w] 在剪辑空间中,并且每个点都不同,这正是这个想法。这是因为第四维w
不仅用于平移,还用于非仿射透视。将立方体按 z 距离缩放恰好会首先创建棱锥体。
请参考实时渲染第 3 页。 18f.:“着色后,渲染系统执行投影,将视图体积转换为一个单位立方体,其极值点位于 (-1, -1, -1) 和 (1, 1, 1) ). [...] 使用投影矩阵意味着转换后的图元被剪裁在单位立方体上。在剪裁之前执行视图变换和投影的优点是它使剪裁问题保持一致;图元总是被剪裁到单位立方体。”
@Tare: 嗯,[-1,1]
的观看量并不是说不正确,只是这是在规范化设备空间中定义的,这是在透视划分之后由w
申请。然而,在除法之后进行剪辑会带来很多问题(例如参见my answer here),更聪明的解决方案是在除法之前进行剪辑(因此得名“剪辑空间”),其中观看量将为w*[-1,1]
。以上是关于屏幕坐标系和世界坐标系的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D之笛卡尔坐标系转换——屏幕坐标转换世界坐标,世界坐标转换相机坐标工具