-1

我正在读一本关于构建物理引擎的书。我目前停留在非线性投影上,这是解决刚体之间穿透的一种方法,因为我不完全理解代码。

这是我所理解的简要说明。非线性投影比线性投影更可信,因为它为线性投影增加了旋转。本书使用了这个算法:

  1. 计算总惯性。有线性惯性,这是物体的反质量,还有角惯性,它是根据物体的转动惯量计算的。
  2. 沿与线性惯性成比例的接触法线(矢量)线性移动每个对象。那将是[接触法向矢量] * 穿透 * ( 线性惯性 ) / ( 总惯性 )
  3. 与角惯性成比例地旋转每个对象。那将是 [某个旋转方向] * 穿透 * ( 角惯性 ) / ( 总惯性 )

线性惯性:我完全理解线性惯性部分。

角惯性:这本书使用以下算法计算物体的角惯性,我不明白,因为它没有给出任何解释,并且将每一步都分配给同一个变量 angularInertiaWorld。

  1. 确定相对接触位置,即接触位置(作为矢量)减去物体的质心位置(另一个矢量)或位置。因此,相对接触位置是相对于物体的。
  2. 做这个数学:(相对接触位置)(叉积)(接触法线)。接触法线是垂直于接触表面的矢量。
  3. 通过对象的逆惯性张量将您在步骤 2 中得到的内容转换为将步骤 2 的结果转换为世界坐标
  4. 做这个数学:(步骤 3 的结果)(叉积)(相对接触位置)
  5. 做这个数学:(第 4 步的结果)(点积)(接触正常)

我想知道算法的每一步发生了什么。我能弄清楚的是你从一些值开始,你最终得到一个应该是物体的角惯性的值。

线性投影:我完全理解非线性投影算法的线性部分。

角度旋转:本书使用这个算法来计算物体旋转了多少。这里还有一些更有意义的变量名,这有助于我更多地理解事物。

  1. 计算一个脉冲扭矩,我相信它是单位脉冲产生的旋转量。这是通过做(相对接触位置)(叉积)(接触法线)计算的
  2. 计算 1 个单位运动所需的冲量。这是通过用逆惯性张量转换脉冲扭矩来完成的。
  3. 计算每单位运动的旋转量。这是通过将每单位运动的冲量除以角惯性来完成的。
  4. 计算要旋转身体的量。这是通过将每单位运动的旋转量(向量)乘以(穿透量)*(角惯性)/(总惯性)来完成的。
  5. 旋转的量被添加到四元数中,我已经理解了。

我得到了所有的单位分析和这本书为达到旋转量所做的冲动。我不太了解的是逆惯性张量的用法。

也许我还没有完全理解这一点。我原本以为它就像一个物体的标量惯性矩,用在扭矩 = I * alpha 中,其中 I 是惯性矩,alpha 是角加速度。然后,当您施加扭矩时,您会得到 alpha = 扭矩 / I,因此将扭矩乘以反惯性矩会得到 alpha。结果,我认为这就是逆惯性张量的用途。

如果有人能向我解释它是如何在这里使用的,我将不胜感激。


最后,感谢您花时间阅读所有内容。我真的很感激关于角惯性和/或角旋转部分的任何解释。

4

1 回答 1

0

关于角惯性:

在此算法中,您计算​​速度变化作为对垂直于对象表面的力的响应(接触法向量是法向力向量):

步骤2:(相对接触位置)x(接触法向[力])=(转动惯量)

第 3 步:(逆惯性张量)应用于(惯性矩)=(角速度)

第四步:(角速度)x(相对接触位置)=(线速度)

第 5 步:(线速度)*(接触法线 [力])= 施加力方向上的速度变化

于 2013-07-28T07:49:29.187 回答