OpenGL中的三维拾取

OpenGL中的三维拾取,opengl,graphics,Opengl,Graphics,是否有3d拾取的“标准”方法?大多数游戏公司都做什么?(用于精确拾取) 我认为最快的方法是使用gpu并使用“颜色索引”渲染每个对象,然后使用glReadPixels(),但后来我听说由于glFlush(),glFinish()调用,它被认为速度很慢 还有一种光线投射方法,这种方法很好,但由于球体/AABBs近似,并不准确。任何关于什么是“标准”的问题都可能会引起一些自以为是的反应,但我认为最接近“标准”的是光线投射 使用水密光线/三角形相交函数,并针对场景中的三角形测试从鼠标光标位置未投影的光线

是否有3d拾取的“标准”方法?大多数游戏公司都做什么?(用于精确拾取)

我认为最快的方法是使用gpu并使用“颜色索引”渲染每个对象,然后使用
glReadPixels()
,但后来我听说由于
glFlush()
glFinish()
调用,它被认为速度很慢


还有一种光线投射方法,这种方法很好,但由于球体/AABBs近似,并不准确。

任何关于什么是“标准”的问题都可能会引起一些自以为是的反应,但我认为最接近“标准”的是光线投射

使用水密光线/三角形相交函数,并针对场景中的三角形测试从鼠标光标位置未投影的光线

通常情况下,这将非常缓慢,需要线性复杂度。所以下一步是把它加速到更好的速度,比如对数时间。这通常通过八叉树、BVH、K-D树或BSP等数据结构实现。有时,人们跳过这一步,只是试图使光线/三线相交非常快,非常平行,甚至可能使用GPU

与基于帧缓冲区的解决方案相比,它需要更多的前期工作,但复杂的应用程序往往会走这条路,这可能是因为:

  • 可移植性:它与渲染引擎分离。例如,它不必与OpenGL或DirectX绑定,这提高了可移植性
  • 一般性:通常,其他事情需要加速器和相关查询。例如,FPS游戏可能会让玩家和敌人不断地相互射击。要弄清楚什么样的射弹击中了什么,往往需要不断地进行此类相交查询,而不仅仅是从一个统一的视角
  • 简单性:开发人员可以承担额外的前期工作,以简化以后的工作
  • 还有一种光线投射方法,很好,但不是 由于球体/AABBs近似,因此准确

    使用AABBs或边界球体进行加速时,不应存在任何不准确的地方。这些测试纯粹是为了加速测试,并通过执行更便宜的测试和消除大量三角形以批量检查的测试,快速减少需要发生的更昂贵的光线/三角形交点的数量。通常,它们的构造应包含场景中的元素。如果首先进行光线/AABB相交,例如,如果相交,则测试AABB中包含的元素。如果没有加速器,任何加速度结构都不会给出相同的结果,那么它通常是一个故障结构


    例如,一种非常基本的加速形式就是在场景中的一个网格元素(如角色)周围放置一个边界框,有时这种基本形式不涉及成熟的加速器可能对场景中非常动态的元素有用(以避免不断更新加速器的成本)。如果光线与角色的边界框相交,则检查组成角色的所有三角形。只要随后检查AABB中的三角形,它就变成了加速度而不是近似值。当然,如果只检查AABB而不检查其他内容,那么这将是一个粗略的近似值。

    光线投射是标准方法。如果仅将边界体积用于加速比,而非最终交叉口结果,则不一定不准确。您所说的“仅用于加速比,而非最终交叉口结果”是什么意思?你能解释更多吗?好吧,在整个三角形网格上进行三角形光线相交测试(可能通过进一步的预计算数据结构加速),以便找到准确的相交点。一种“快速而肮脏”的方法是使用“拾取渲染”,在其中用不同的颜色绘制每个对象,没有纹理或类似的东西(不需要交换缓冲区)并获取像素下的颜色。@Robinson它需要单独的帧缓冲区吗?从未收到通知。。奇怪的谢谢