从视口坐标转换为 [-1,1]^2 顶点 [OpenGL]

Posted

技术标签:

【中文标题】从视口坐标转换为 [-1,1]^2 顶点 [OpenGL]【英文标题】:Converting from Viewport Coordinates to [-1,1]^2 Vertex [OpenGL] 【发布时间】:2015-11-09 08:31:47 【问题描述】:

生日快乐!

假设我在窗口中有一个由整数值表示的鼠标点击(窗口可调整大小),所以它的域将是 (0,0) - > (current_width, current_height)。是否有一种简单的方法可以“规范化”或将此鼠标单击位置转换为 OpenGL 领域中的顶点?即 R^2 中具有域 [-1,1]^2 的点?

例如:如果窗口的当前宽度和高度分别为 400 和 600,并且我点击了 400,600,我想轻松地将其转换为 [1,-1]。

此功能是否存在于 OpenGL 中,还是我必须自己编写该功能?

干杯。

【问题讨论】:

【参考方案1】:

您必须自己编写函数,但这很简单:

x_ogl = 2.0 * (x_mouse - width / 2) / width
y_ogl = -2.0 * (y_mouse - height / 2) / height

第二个公式中的否定是将鼠标/屏幕坐标中的“+ve Y down”转换为“+ve Y up”的更正常的笛卡尔。

此外,在 X 和 Y 坐标之间保持 1:1 的纵横比会更常规,其中较大的轴保持范围 [-1, 1],而较小的轴具有较小的范围。

如果这是您真正喜欢的,则在上面的两个表达式中将外部除法的右侧替换为 max(width, height),而不是如图所示。

【讨论】:

我认为它最终必须有所不同。我最终得到:x_ogl = 1+ (x_mouse-width)*2/widthy_ogl =-1* ( (y_mouse-height)*2/height)+1) 不过谢谢。您的建议促使我解决了这个问题。 @AggressiveSneeze。我给出的方程式应该没问题 - 请参阅 jsfiddle.net/8onndhuw/2 以获得(javascript)演示

以上是关于从视口坐标转换为 [-1,1]^2 顶点 [OpenGL]的主要内容,如果未能解决你的问题,请参考以下文章

窗口调整大小后将鼠标位置转换为 2D openGL 中的世界坐标

在视口和变换后的矩形之间变换坐标的矩阵

我的OpenGL学习进阶之旅介绍一下OpenGL ES的图元装配:坐标系统透视分割视口变化

我的OpenGL学习进阶之旅介绍一下OpenGL ES的图元装配:坐标系统透视分割视口变化

Unity之坐标转换

openGL中的坐标系