使用物理引擎投掷球并估计其path

问题 :玩家实体希望以已知的初始速度从已知位置掷出一个球。 周围环境包含可以改变球的轨迹的物理物体。 这条轨迹如何尽可能精确地呈现?

一个解决scheme :执行小步骤,模拟抛球。 在每一个小步骤中,对世界进行光线投射以find潜在的碰撞体。 如果发生碰撞,必须相应处理。 球的中间位置将被保存在一个arrays中,轨迹应该由这些点的连续来描述。

虽然这个解决scheme的工作原理(经过testing,几乎从不失败:)),是否有任何解决方法或可能的优化,可以避免频繁执行光线广播查询? 如果有一个抛物线连铸机而不是线性射线连铸机那将是很好的。 你是否知道现有的解决scheme比我刚刚描述的解决scheme更好?(要么避免那么多的光线投射,要么执行更聪明的查询来减less中间步骤的数量,用抛物线段代替实际的线段)?

那么我认为有可能解决抛物线/形状交点方程。 但首先问题是, 我认为要解决更复杂的形状将会非常棘手,我怀疑交叉algorithm的性能不会那么好。 (其实这在评论中提供的链接@IcyDefiance中是非常明显的)。

其次还有一个更重要的问题是,抛物线脚轮不能利用空间数据结构,当你假设光线是直线的时候,遍历空间数据结构是非常简单的,弯曲的path和大部分的遍历假设再也没有了。 例如,更快的射线八叉树相交algorithm实际上利用射线和八叉树分析属性,例如假设射线是否在某个单元中,它只能通过其他邻居单元。 添加一个抛物线的形状,这些假设将消失。

我的建议

坚持光线投射技术与记忆一致的空间数据结构。

无论如何,为场景中的每个对象testing交叉是没有意义的,使用空间数据结构是必须的。 我也怀疑,如果数据结构是caching友好的,那么光线投射现场的要求要低得多。

最后的注意

我刚刚想过但从来没有testing过的东西是使用asynchronous铸造。 含义; 而不是每次只做一步,你可以asynchronous地做4到16步,说实话我从来没有尝试过,也不知道performance会不会好或坏。 您只需先生成样本,然后进行asynchronoustesting,这与人们在光线追踪中所做的相似,不同之处在于样本将用于抛物线而不是图像。

除非你处于需要优化的状态,否则不要浪费时间。 避免不必要的过早的悲观主义和过早的优化。

为了提出一些想法,我已经拿到了。

根据您对系统的多less控制,更准确的版本将是模拟一个单独的“隔间”中的对象,并跟踪path。 这将需要您维护一个可以与之交互的对象的镜像子集,以及在不同的时间步骤进行模拟。

PhysX(最后我知道)对基于隔间的模拟的本地支持,尽管我不知道它是否允许对不同隔间单独的时间步长。 这绝对是你做到这一点的最准确的方式,但与此相关的开销可能是相当不可接受的。

另一种方法是计算投影对象独立于物理模拟的path。 如果你有重力影响球以外的力量,这可能会变得复杂。 在绘制这条path之后,可以从path中拉出最小的一组切线来代表一组有效的光线投射。 这种方法需要迭代,并且可能招致较高的计算损失,而以前的方法具有较高的数据损失。

对于一个游戏,抛物线路的分段线性近似是好的,不要浪费时间超过这个。

另外,使用别人经过充分testing,优化的物理和碰撞引擎。