惯性张量 是一个描述刚体惯性特性的张量,用于计算刚体的旋转运动。在物理引擎中,通常通过以下步骤来计算刚体的惯性张量:
- 将刚体分解为若干个质点,并计算每个质点相对于刚体质心的位置向量r_i。
- 对于每个质点,计算其相对于刚体质心的质量m_i。
- 根据每个质点的位置向量和质量,计算惯性张量的九个分量。假设惯性张量表示为一个3x3的矩阵I,那么每个分量的计算公式如下:
Ixx = ∑(m_i * (y_i^2 + z_i^2))
Ixy = Iyx = -∑(m_i * x_i * y_i)
Ixz = Izx = -∑(m_i * x_i * z_i)
Iyy = ∑(m_i * (x_i^2 + z_i^2))
Iyz = Izy = -∑(m_i * y_i * z_i)
Izz = ∑(m_i * (x_i^2 + y_i^2))
其中,x_i、y_i、z_i表示第i个质点相对于质心的位置向量的x、y、z分量,∑表示对所有质点求和。 - 将计算得到的九个分量填充到惯性张量的矩阵中。
def compute_inertia_tensor(vertices, faces, density):
# 计算刚体的质心
center_of_mass = compute_center_of_mass(vertices, faces)
# 计算每个质点相对于质心的位置向量和质量
r = vertices - center_of_mass
m = compute_vertex_mass(vertices, faces, density)
# 计算惯性张量的九个分量
Ixx = np.sum(m * (r[:,1]**2 + r[:,2]**2))
Ixy = Iyx = -np.sum(m