public Fix64Vec3 EulerAngles() { Fix64 xDegree = Fix64.RadToDeg(GetXAngle()); Fix64 yDegree = Fix64.RadToDeg(GetYAngle()); Fix64 zDegree = Fix64.RadToDeg(GetZAngle()); return(new Fix64Vec3(xDegree, yDegree, zDegree)); }
//https://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/ public Fix64Vec3 EulerAngles1() { Fix64 sqw = w * w; Fix64 sqx = x * x; Fix64 sqy = y * y; Fix64 sqz = z * z; Fix64 unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor Fix64 test = x * y + z * w; Fix64 _x = Fix64.zero; Fix64 _y = Fix64.zero; Fix64 _z = Fix64.zero; Fix64 cutoff = Fix64.FromDivision(499, 1000) * unit; _z = Fix64.Atan2((Fix64)2 * y * w - (Fix64)2 * x * z, sqx - sqy - sqz + sqw); _y = Fix64.Asin((Fix64)2 * test / unit); _x = Fix64.Atan2((Fix64)2 * x * w - (Fix64)2 * y * z, -sqx + sqy - sqz + sqw); //if (test >= cutoff) //{ // singularity at north pole // _z = (Fix64)2 * Fix64.Atan2(x, w); // _y = Fix64.halfPi; // _x = Fix64.zero; //} //else if (test < -cutoff) //{ // singularity at south pole // _z = -(Fix64)2 * Fix64.Atan2(x, w); // _y = -Fix64.halfPi; // _x = Fix64.zero; //} //else //{ // _z = Fix64.Atan2((Fix64)2 * y * w - (Fix64)2 * x * z, sqx - sqy - sqz + sqw); // _y = Fix64.Asin((Fix64)2 * test / unit); // _x = Fix64.Atan2((Fix64)2 * x * w - (Fix64)2 * y * z, -sqx + sqy - sqz + sqw); //} Fix64 xDegree = Fix64.RadToDeg(_x); Fix64 yDegree = Fix64.RadToDeg(_y); Fix64 zDegree = Fix64.RadToDeg(_z); return(new Fix64Vec3(xDegree, zDegree, yDegree)); }
public bool Load(uint step) { bool result = _body2D.LoadSavedExport(step); pTransform._internal_WriteTranform((Fix64Vec3)_body2D.position, new Fix64Vec3(Fix64.zero, Fix64.zero, Fix64.RadToDeg(_body2D.angle))); return(result); }
public void OnTransformUpdated() { pTransform._internal_WriteTranform((Fix64Vec3)_body2D.position, new Fix64Vec3(Fix64.zero, Fix64.zero, Fix64.RadToDeg(_body2D.angle))); }