OpenGL中的三维拾取
是否有3d拾取的“标准”方法?大多数游戏公司都做什么?(用于精确拾取) 我认为最快的方法是使用gpu并使用“颜色索引”渲染每个对象,然后使用OpenGL中的三维拾取,opengl,graphics,Opengl,Graphics,是否有3d拾取的“标准”方法?大多数游戏公司都做什么?(用于精确拾取) 我认为最快的方法是使用gpu并使用“颜色索引”渲染每个对象,然后使用glReadPixels(),但后来我听说由于glFlush(),glFinish()调用,它被认为速度很慢 还有一种光线投射方法,这种方法很好,但由于球体/AABBs近似,并不准确。任何关于什么是“标准”的问题都可能会引起一些自以为是的反应,但我认为最接近“标准”的是光线投射 使用水密光线/三角形相交函数,并针对场景中的三角形测试从鼠标光标位置未投影的光线
glReadPixels()
,但后来我听说由于glFlush()
,glFinish()
调用,它被认为速度很慢
还有一种光线投射方法,这种方法很好,但由于球体/AABBs近似,并不准确。任何关于什么是“标准”的问题都可能会引起一些自以为是的反应,但我认为最接近“标准”的是光线投射 使用水密光线/三角形相交函数,并针对场景中的三角形测试从鼠标光标位置未投影的光线 通常情况下,这将非常缓慢,需要线性复杂度。所以下一步是把它加速到更好的速度,比如对数时间。这通常通过八叉树、BVH、K-D树或BSP等数据结构实现。有时,人们跳过这一步,只是试图使光线/三线相交非常快,非常平行,甚至可能使用GPU 与基于帧缓冲区的解决方案相比,它需要更多的前期工作,但复杂的应用程序往往会走这条路,这可能是因为:
例如,一种非常基本的加速形式就是在场景中的一个网格元素(如角色)周围放置一个边界框,有时这种基本形式不涉及成熟的加速器可能对场景中非常动态的元素有用(以避免不断更新加速器的成本)。如果光线与角色的边界框相交,则检查组成角色的所有三角形。只要随后检查AABB中的三角形,它就变成了加速度而不是近似值。当然,如果只检查AABB而不检查其他内容,那么这将是一个粗略的近似值。光线投射是标准方法。如果仅将边界体积用于加速比,而非最终交叉口结果,则不一定不准确。您所说的“仅用于加速比,而非最终交叉口结果”是什么意思?你能解释更多吗?好吧,在整个三角形网格上进行三角形光线相交测试(可能通过进一步的预计算数据结构加速),以便找到准确的相交点。一种“快速而肮脏”的方法是使用“拾取渲染”,在其中用不同的颜色绘制每个对象,没有纹理或类似的东西(不需要交换缓冲区)并获取像素下的颜色。@Robinson它需要单独的帧缓冲区吗?从未收到通知。。奇怪的谢谢