微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 glm::perspective 时,如何将鼠标的实际像素位置映射到标准化位置?

如何解决使用 glm::perspective 时,如何将鼠标的实际像素位置映射到标准化位置?

我正在使用 OpenGL 绘制 2D tilemap,我希望能够知道鼠标的位置对应于我的场景的位置。这是我目前拥有的:

The 2D tilemap I'm drawing

为了绘制这个屏幕,使用了这个投影

glm::mat4 projection = glm::perspective(
  glm::radians(45.0f),(float)screenWidth / (float)screenHeight,1.0f,100.0f
);

然后这个相机用来移动和缩放tilemap

glm::vec3 camera(0.0f,0.0f,-1.00f);

然后转换为相机视图

glm::mat4 cameraview = glm::translate(state.projection,camera);

最终通过一个uniform传递给顶点着色器

#version 330 core

layout(location = 0) in vec2 aPosition;

uniform mat4 uCameraview;

void main() {
  gl_Position = uCameraview * vec4(aPosition.x,aPosition.y,1.0f);
}

这个着色器接收一个归一化的顶点,这意味着我永远不知道我的屏幕上有多少像素。

现在我试图以某种方式计算鼠标在我的场景中的位置,如果它像光线一样投射到瓷砖地图中然后击中它。如果我设法获得碰撞的位置,我将能够知道鼠标悬停在哪个图块上。

找到此坐标的最佳方法是什么?

解决方法

最后我找到了这个将鼠标像素坐标映射到透视图的解决方案:

glm::vec4 tile = glm::translate(projection,glm::vec3(0.0f,0.0f,camera.z)) *
  glm::vec4(size.tile.regular,size.tile.regular,camera.z,1.0f);
glm::vec3 ndcTile =
  glm::vec3(tile.x / tile.w,tile.y / tile.w,tile.z / tile.w);

float pixelUnit = windowWidth * ndcTile.x;

float pixelCameraX = (camera.x / size.tile.regular) * pixelUnit;
float pixelCameraY = (camera.y / size.tile.regular) * pixelUnit;

float originX = (windowWidth / 2.0f) + pixelCameraX;
float originY = (windowHeight / 2.0f) - pixelCameraY;

float tileX = (state.input.pixelCursorX - originX) / pixelUnit;
float tileY = (state.input.pixelCursorY - originY) / pixelUnit;

selectedTileX = tileX > 0 ? tileX : tileX - 1;
selectedTileY = tileY > 0 ? tileY : tileY - 1;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?