惯性张量是一3*3的矩阵,如图所示
在Unity的Rigidbody组件中为了减少变量的数目,简化为用Inertial Tensor(3个变量,三维向量)和Inertial Tensor Rotation(4个变量,四元数)来表示,
从Inertial Tensor和Inertial Tensor Rotation转换到惯性张量(取最终结果InertiaTensor的前三行前三列)的代码如下:
public Rigidbody rigidbody;
private void Start()
{
Vector3 Inertia = rigidbody.inertiaTensorRotation * new Vector3(rigidbody.inertiaTensor.x > 0 ? rigidbody.inertiaTensor.x : 0,rigidbody.inertiaTensor.y > 0 ? rigidbody.inertiaTensor.y : 0,rigidbody.inertiaTensor.z > 0 ? rigidbody.inertiaTensor.z : 0);
Matrix4x4 InertiaTensor= Matrix4x4.zero;
Matrix4x4 r = Matrix4x4.Rotate(rigidbody.rotation);
InertiaTensor[0, 0] = Inertia.x;
InertiaTensor[1, 1] = Inertia.y;
InertiaTensor[2, 2] = Inertia.z;
InertiaTensor[3, 3] = 1;
InertiaTensor = r * InertiaTensor * r.transpose;
Debug.Log(InertiaTensor);
}