我正在读一本关于构建物理引擎的书。我目前停留在非线性投影上,这是解决刚体之间穿透的一种方法,因为我不完全理解代码。
这是我所理解的简要说明。非线性投影比线性投影更可信,因为它为线性投影增加了旋转。本书使用了这个算法:
- 计算总惯性。有线性惯性,这是物体的反质量,还有角惯性,它是根据物体的转动惯量计算的。
- 沿与线性惯性成比例的接触法线(矢量)线性移动每个对象。那将是[接触法向矢量] * 穿透 * ( 线性惯性 ) / ( 总惯性 )
- 与角惯性成比例地旋转每个对象。那将是 [某个旋转方向] * 穿透 * ( 角惯性 ) / ( 总惯性 )
线性惯性:我完全理解线性惯性部分。
角惯性:这本书使用以下算法计算物体的角惯性,我不明白,因为它没有给出任何解释,并且将每一步都分配给同一个变量 angularInertiaWorld。
- 确定相对接触位置,即接触位置(作为矢量)减去物体的质心位置(另一个矢量)或位置。因此,相对接触位置是相对于物体的。
- 做这个数学:(相对接触位置)(叉积)(接触法线)。接触法线是垂直于接触表面的矢量。
- 通过对象的逆惯性张量将您在步骤 2 中得到的内容转换为将步骤 2 的结果转换为世界坐标
- 做这个数学:(步骤 3 的结果)(叉积)(相对接触位置)
- 做这个数学:(第 4 步的结果)(点积)(接触正常)
我想知道算法的每一步发生了什么。我能弄清楚的是你从一些值开始,你最终得到一个应该是物体的角惯性的值。
线性投影:我完全理解非线性投影算法的线性部分。
角度旋转:本书使用这个算法来计算物体旋转了多少。这里还有一些更有意义的变量名,这有助于我更多地理解事物。
- 计算一个脉冲扭矩,我相信它是单位脉冲产生的旋转量。这是通过做(相对接触位置)(叉积)(接触法线)计算的
- 计算 1 个单位运动所需的冲量。这是通过用逆惯性张量转换脉冲扭矩来完成的。
- 计算每单位运动的旋转量。这是通过将每单位运动的冲量除以角惯性来完成的。
- 计算要旋转身体的量。这是通过将每单位运动的旋转量(向量)乘以(穿透量)*(角惯性)/(总惯性)来完成的。
- 旋转的量被添加到四元数中,我已经理解了。
我得到了所有的单位分析和这本书为达到旋转量所做的冲动。我不太了解的是逆惯性张量的用法。
也许我还没有完全理解这一点。我原本以为它就像一个物体的标量惯性矩,用在扭矩 = I * alpha 中,其中 I 是惯性矩,alpha 是角加速度。然后,当您施加扭矩时,您会得到 alpha = 扭矩 / I,因此将扭矩乘以反惯性矩会得到 alpha。结果,我认为这就是逆惯性张量的用途。
如果有人能向我解释它是如何在这里使用的,我将不胜感激。
最后,感谢您花时间阅读所有内容。我真的很感激关于角惯性和/或角旋转部分的任何解释。