如何在缩放投影矩阵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.xworld.y 包含正确的世界坐标

【讨论】:

【参考方案2】:

JOML 提供 GLU 的“unproject”功能和一个额外的“unprojectRay”。

【讨论】:

以上是关于如何在缩放投影矩阵Opengl的同时平移光标位置的主要内容,如果未能解决你的问题,请参考以下文章

缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵

GLM 中的模型矩阵

如何使用现代 OpenGL 的 GLM 或 JOML 矩阵正确转换(平移、旋转、缩放)对象

Android OpenGLES2.0——OpenGL中的平移旋转缩放

OpenGL投影缩放

OpenGL:组合平移/旋转/缩放矩阵或将它们分开?