OpenGL鼠标拾取策略
Posted
技术标签:
【中文标题】OpenGL鼠标拾取策略【英文标题】:OpenGL Mouse Picking Strategy 【发布时间】:2011-04-04 19:33:49 【问题描述】:我正在使用 OpenGL 渲染在给定平面上旋转对称的对象模型,并且我希望用户能够滚动模型(可能在旋转、缩放等之后)并确定什么鼠标当前指向的模型上的世界坐标。
我提到对称性的原因是我使用单个组件的VBOs 构建模型以便于使用。与我正在做的事情的类比是自行车车轮 - 我有一个 VBO 用于辐条,一个用于轮毂,一个用于车轮/轮胎,我会多次重复使用辐条 VBO(之后合适的平移和旋转)。我的第一个问题是,这种安排是否有利于我尝试进行的那种挑选?例如,我希望生成的模型中的每个人都可以“挑选”。 我是否需要为网格中的每个四边形/三角形使用单独的 VBO 来进行我想要做的那种选择?我真的希望不是这样......
另外,最好的挑选算法是什么?我只听说过关于 OpenGL 的内置选择模式的负面消息。提前致谢!
【问题讨论】:
Implementing Ray Picking的可能重复 【参考方案1】:关于您关于 VBO 的问题,拥有少量 VBO 并重复使用它们并没有错。事实上,您可以在一个 VBO 中拥有所有内容,并且只对其进行索引。对于您的自行车车轮类比,辐条顶点之后可以是轮胎顶点,并且您可以多次绘制辐条的顶点(甚至可以使用实例化,请参阅glMultiDrawElements
),然后从同一个 VBO 绘制,但从另一个指标,轮胎。
关于您的选择问题,获取鼠标下模型上点的世界坐标的一种简单方法是读回深度值(glReadPixels
在 1x1 矩形上,最好在最后一帧的数据,这样你就可以隐藏传输延迟)。然后调用gluUnproject
获取世界坐标。
【讨论】:
以上是关于OpenGL鼠标拾取策略的主要内容,如果未能解决你的问题,请参考以下文章
深入理解OpenGL拾取模式(OpenGL Picking)
OpenGL C++ 鼠标光线拾取 glm:unproject