我正在开发一个非常简单的物理引擎。它中唯一的非静态对象将是圆形,我将执行的唯一碰撞检测是在圆形和线条之间。
出于此目的,我正在使用Advanced Character Physics中描述的原则。也就是说,我使用一个简单的Verlet集成器进行集成。我只是通过计算圆和线条之间的距离来执行碰撞检测和响应,如果距离小于圆周半径,我将圆圈投射出线条。
这非常有效,结果是一个几乎完美的移动圈。可以在此处看到引擎的当前状态:http://jsfiddle.net/8K4Wj/。然而,这也显示了我面临的一个主要问题:圆圈根本不旋转。
据我所知,有三种不同的碰撞案例需要单独处理:
这是我最接近解决问题的方法:http://jsfiddle.net/vYjzt/。但是,正如演示所示,它可能无法处理边缘情况。
我在网上搜索了一个解决方案,但我找不到任何具体处理特定问题的材料(正如我所说的物理引擎相对简单,我不想打扰复杂的物理模拟概念)。
答案 0 :(得分:1)
您的演示中出现的错误是您在确定动作时没有考虑角度力矩和能量。
对于简单的情况,当你的演示中车轮落到地板上时,它会在自由落体时停止旋转。角动量应该继续保持下去。
更复杂的情况是当车轮最终落在地板上时,它以与撞击地板之前相同的水平速度移动。如果它不滚动,这将是正确的,但由于它正在滚动,一些动能将不得不进入旋转运动,这应该减慢它。作为一个更明显的例子,考虑相反的情况,即车轮快速旋转但没有线性动量。当这个轮子放在地板上时,它应该起飞并且旋转应该减慢。此外,例如,当车轮在山坡上滚下时,它会加速更慢,因为能量需要进入线性和圆周运动。
它并不难做,但是为了以直观正确的方式显示滚动物体,我认为你需要考虑与滚动相关的动能和角动量。通过"不太难",我的意思是你的所有方程式基本上只有两倍长,一个用于线性运动,另一个用于角度运动。我不会背诵所有的方程式,它基本上只是来自任何物理文本的旋转运动章节。
(很好的演示,顺便说一句!)