是否有"标准" 3D采摘方法?大多数游戏公司做什么? (准确挑选)
我认为最快的方法是使用gpu并使用"颜色索引"渲染每个对象,然后使用glReadPixels()
,但后来我听说它已被考虑由于glFlush()
,glFinish()
来电,因此速度很慢。
还有这种光线投射方法,由于球体/ AABB近似,这种方法很好但不准确。
答案 0 :(得分:2)
有关什么是"标准"可能会引用一些固执的回答,但我会建议最接近"标准"这是光线投射。
采用防水光线/三角形交叉功能,测试从鼠标光标位置未投影的光线对着场景中的三角形。
通常这会很慢,需要线性复杂性。因此,下一步是将其加速到更好的状态,如对数时间。这通常通过诸如八叉树,BVH,K-D树或BSP的数据结构来实现。有时候人们会跳过这一步,只是尝试让ray / tri交叉点非常快且非常平行,甚至可能使用GPGPU。
预先比基于帧缓冲的解决方案需要更多的工作,但复杂的应用程序倾向于采用这种方式可能是因为:
还有这种光线投射方法,这很好但不是 因球体/ AABB近似而准确。
使用AABB或边界球体加速目的应该没有什么不准确之处。这些纯粹是为了加速测试并迅速减少需要通过进行更便宜的测试而需要发生的更昂贵的射线/三角形交叉点的数量,以及消除大批量三角形以进行批量检查的数量。通常它们应该被构造成包含场景中的元素。如果您首先进行射线/ AABB交叉,例如,如果击中,则测试AABB中包含的元素。任何加速结构在没有加速器的情况下都没有给出相同的结果,这通常是一个小问题。
例如,一种非常基本的加速形式只是在场景中的一个网格元素周围放置一个边界框,就像一个角色一样,有时这种基本形式不涉及一个完整的加速器可能对于非常动态的元素有用。场景(避免不断更新加速器的成本)。如果光线与角色的边界框相交,则检查构成角色的所有三角形。只要你之后检查AABB中的三角形,它就变成了加速度而不是近似值。当然,如果你只检查了AABB而没有别的,那么这将是一个粗略的近似值。