コード例 #1
0
        public static void SetInertia(this Link.Inertial.Inertia inertia, Rigidbody rigidbody)
        {
            Evd <float> Evd = inertia.Unity3DCoordTrafo().ToMatrix().Evd(Symmetricity.Symmetric);

            rigidbody.inertiaTensor         = Evd.EigenValues.GetReal().ToVector3().FixMinInertia(); // optionally check vector for imaginary part = 0
            rigidbody.inertiaTensorRotation = Evd.EigenVectors.ToQuaternion();                       // optionally check matrix for determinant = 1
        }
コード例 #2
0
 private static Matrix ToMatrix(this Link.Inertial.Inertia inertia)
 {
     return(DenseMatrix.OfArray(
                new float[, ] {
         { (float)inertia.ixx, (float)inertia.ixy, (float)inertia.ixz },
         { (float)inertia.ixy, (float)inertia.iyy, (float)inertia.iyz },
         { (float)inertia.ixz, (float)inertia.iyz, (float)inertia.izz }
     }
                ));
 }
コード例 #3
0
        public static void SetInertia(this Link.Inertial.Inertia inertia, Rigidbody rigidbody)
        {
            // todo: diagonalize matrix and convert transform matrix (i.e. rotation matrix) to quaternion
            float ixx = (float)((inertia.ixx > imin) ? inertia.ixx : imin);
            float iyy = (float)((inertia.iyy > imin) ? inertia.iyy : imin);
            float izz = (float)((inertia.izz > imin) ? inertia.izz : imin);

            rigidbody.inertiaTensor = new Vector3(ixx, iyy, izz);
            // rigidbody.inertiaTensorRotation // todo: set inertiaRotation here
        }
コード例 #4
0
        private static Link.Inertial.Inertia Unity3DCoordTrafo(this Link.Inertial.Inertia inertia)
        {
            Link.Inertial.Inertia unity3DInertia = inertia;
            unity3DInertia.ixx = inertia.iyy;
            unity3DInertia.iyy = inertia.izz;
            unity3DInertia.izz = inertia.ixx;

            unity3DInertia.ixy = inertia.iyz;
            unity3DInertia.ixz = inertia.ixy;
            unity3DInertia.iyz = inertia.ixz;
            return(unity3DInertia);
        }