/** * Returns a new indentity Matrix. */ public static BabylonMatrix Identity() { var matrix = new BabylonMatrix(); BabylonMatrix.FromValuesToRef( 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, matrix); return(matrix); }
/** * Update a Matrix with values composed by the passed scale (vector3), rotation (quaternion) and translation (vector3). */ public static void ComposeToRef(BabylonVector3 scale, BabylonQuaternion rotation, BabylonVector3 translation, BabylonMatrix result) { var matrix1 = new BabylonMatrix(); BabylonMatrix.FromValuesToRef(scale.X, 0, 0, 0, 0, scale.Y, 0, 0, 0, 0, scale.Z, 0, 0, 0, 0, 1, matrix1); var matrix0 = new BabylonMatrix(); rotation.toRotationMatrix(matrix0); matrix1.multiplyToRef(matrix0, result); result.setTranslation(translation); }
/** * Decomposes the current Matrix into : * - a scale vector3 passed as a reference to update, * - a rotation quaternion passed as a reference to update, * - a translation vector3 passed as a reference to update. * Returns the boolean `true`. */ public bool decompose(BabylonVector3 scale, BabylonQuaternion rotation, BabylonVector3 translation) { translation.X = this.m[12]; translation.Y = this.m[13]; translation.Z = this.m[14]; scale.X = (float)Math.Sqrt(this.m[0] * this.m[0] + this.m[1] * this.m[1] + this.m[2] * this.m[2]); scale.Y = (float)Math.Sqrt(this.m[4] * this.m[4] + this.m[5] * this.m[5] + this.m[6] * this.m[6]); scale.Z = (float)Math.Sqrt(this.m[8] * this.m[8] + this.m[9] * this.m[9] + this.m[10] * this.m[10]); if (this.determinant() <= 0) { scale.Y *= -1; } if (scale.X == 0 || scale.Y == 0 || scale.Z == 0) { rotation.X = 0; rotation.Y = 0; rotation.Z = 0; rotation.W = 1; return(false); } var matrix = new BabylonMatrix(); BabylonMatrix.FromValuesToRef( this.m[0] / scale.X, this.m[1] / scale.X, this.m[2] / scale.X, 0, this.m[4] / scale.Y, this.m[5] / scale.Y, this.m[6] / scale.Y, 0, this.m[8] / scale.Z, this.m[9] / scale.Z, this.m[10] / scale.Z, 0, 0, 0, 0, 1, matrix); BabylonQuaternion.FromRotationMatrixToRef(matrix, rotation); return(true); }