如何在缩放投影矩阵Opengl的同时平移光标位置
Posted
技术标签:
【中文标题】如何在缩放投影矩阵Opengl的同时平移光标位置【英文标题】:How to translate the cursor position alongside scaling the projection matrix Opengl 【发布时间】:2017-04-18 17:03:24 【问题描述】:我正在使用 LWJGL,我希望在缩放投影矩阵后选择图块,但我不确定如何。我将 JOML 用于线性代数库。投影矩阵首先应用正交变换,然后将其转换为玩家的位置,最后对其进行缩放。当我缩放投影矩阵时,因为一切都在放大鼠标不再选择正确的瓷砖。这是我尝试修正鼠标位置:
float cursorX = input.getCursorPosX() + getX();
float cursorY = input.getCursorPosY(true) + getY();
cursorX *= (1/cameraScalar);
cursorY *= (1/cameraScalar);
前两行从 GLFW 获取光标并将玩家位置添加到其中。第三和第四行只是乘以相机比例的倒数。
【问题讨论】:
【参考方案1】:我不熟悉 JOML,但您想要做的一般方法是这样的:
将真实屏幕坐标(以像素为单位)转换为 OpenGL 屏幕坐标系,这是一个位于 (0,0,0) 的立方体,边长为 2(您可能需要反转 Y 轴):
float screenX = 2.0f * mouseX / screenWidth - 1.0f;
float screenY = 1.0f - 2.0f * mouseY / screenHeight;
使用投影矩阵的逆矩阵 (proj
) 将坐标 (screenX, screenY, 1) 的屏幕矢量投影到世界:
Vector3 screen = new Vector3(screenX, screenY, 1);
Vector3 world = proj.inverse().mul(screen);
现在world.x
和world.y
包含正确的世界坐标
【讨论】:
【参考方案2】:JOML 提供 GLU 的“unproject”功能和一个额外的“unprojectRay”。
【讨论】:
以上是关于如何在缩放投影矩阵Opengl的同时平移光标位置的主要内容,如果未能解决你的问题,请参考以下文章
缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵
如何使用现代 OpenGL 的 GLM 或 JOML 矩阵正确转换(平移、旋转、缩放)对象