/// <summary> /// Extract a point that represents the scale associated with each row /// </summary> /// <returns></returns> public Vector3D ExtractScale() { Matrix3D mTemp = new Matrix3D(this); // undo translation mTemp._elements[12] = 0; mTemp._elements[13] = 0; mTemp._elements[14] = 0; // undo rotation Quaternion quat = Quaternion.FromTransform(this); Quaternion quatInverse = quat.GetInverse(); mTemp.Rotate(quatInverse); // all that's left is scale? return(Vector3D.FromXYZ(mTemp._elements[0], mTemp._elements[5], mTemp._elements[10])); }
/// <summary> /// Extract a quaternion that represents the matrix' current rotation /// </summary> /// <returns></returns> public Quaternion ExtractRotation() { return(Quaternion.FromTransform(this)); }
// ================================================================================ /// <summary> /// Extract the matrix' current rotation as an axis and a rotation /// </summary> /// <param name="axis"></param> /// <param name="radians"></param> public void ExtractAxisAngle(out Vector3D axis, out float radians) { Quaternion quat = Quaternion.FromTransform(this); quat.GetAxisAngle(out axis, out radians); }