将鼠标位置转换为世界坐标OpenGL

13

嘿,我正在为我的游戏制作地图编辑器,并尝试将鼠标位置转换为游戏世界中的位置,视图使用 gluPerspective 进行设置。

2个回答

7
一个好的起点是使用函数gluUnProject,它可以获取鼠标坐标并计算物体空间坐标。可以参考http://nehe.gamedev.net/data/articles/article.asp?article=13中的基础教程。
更新:
在该文章中的代码能够正常工作前,您必须启用深度缓冲。鼠标坐标的Z值是根据该点深度缓冲区中的值确定的。
在初始化代码中,请确保执行以下操作:
glEnable(GL_DEPTH);

我正在绘制一个长度为1单位的四边形,位置在0, 0, 0。但是当我将鼠标悬停在其上时,它给出了一个荒谬的位置,即17,-344,-177。有什么办法可以解决吗?相机的Y坐标为10。 - user187418
你启用了深度缓冲吗? - user269597
我不太确定如何启用它,但我相当确定这是因为我正在调用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)。 - user187418

4

屏幕上的一个点代表了3D空间中的整条线(无限多个点)。

大多数和您类似的问题都是想要通过点击选择一个对象。如果是这样,OpenGL提供了一种选择模式,通常比尝试将屏幕坐标转换为真实世界坐标更有效。

使用选择模式(通常)很简单:您可以从gluPickMatrix开始,用它来指定点击点周围的一个小框。然后在选择模式下绘制场景。完成后,它不会实际绘制任何内容,而是返回在您指定的框中将要绘制的记录。如果我没记错的话,这些记录是按Z顺序排列的,因此列表中的第一个记录是最前面显示的(即通常想要的那个记录)。


我也想指出选择模式。在这种情况下,我看到的一个问题是程序似乎应该实时跟随鼠标光标。因此,选择模式可能会变得太卡顿。 - ypnos
@ypnos:这当然不是唯一可能的答案——但除非有一个真正好的理由去做其他事情,否则我会从这里开始,并且只有在/如果性能成为真正的问题时才会考虑其他方案。 - Jerry Coffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接