public override void Update() { if (isDirty) { if (parent != null) { position = parent.localPosition + parent.localRotation * (localPosition * parent.localScale); rotation = parent.localRotation * localRotation; scale = parent.localScale * localScale; localEulerAngles = Core.Quaternion.EulerAngles(localRotation); eulerAngles = Core.Quaternion.EulerAngles(rotation); } else { position = localPosition; rotation = localRotation; scale = localScale; localEulerAngles = Core.Quaternion.EulerAngles(localRotation); eulerAngles = localEulerAngles; } isDirty = false; } }
public void Rotate(Core.Vector3 eulerAngles, SpaceType relativeTo = SpaceType.Local) { switch (relativeTo) { case SpaceType.Local: { localRotation *= Core.Quaternion.EulerAngles(eulerAngles); } break; case SpaceType.World: { if (parent != null) { Core.Quaternion scaleAdjust = new Core.Quaternion(parent.localScale.Y * parent.localScale.Z, parent.localScale.X * parent.localScale.Z, parent.localScale.X * parent.localScale.Y, 0f); localRotation *= (parent.localRotation.conjugate * Core.Quaternion.EulerAngles(eulerAngles)) * scaleAdjust; } else { localRotation *= Core.Quaternion.EulerAngles(eulerAngles); } } break; } isDirty = true; }
/// <summary> /// Converts a Fox Engine Quaternion to a Unity Quaternion. /// </summary> /// <param name="foxQuat">The Fox Engine Quaternion.</param> /// <returns>The Unity Quaternion.</returns> public static Quaternion FoxToUnity(Core.Quaternion foxQuat) { var angle = 0.0f; var axis = Vector3.zero; var unityQuaternion = new Quaternion(foxQuat.X, foxQuat.Y, foxQuat.Z, foxQuat.W); unityQuaternion.ToAngleAxis(out angle, out axis); axis.x = -axis.x; var newQuat = Quaternion.AngleAxis(-angle, axis); return(new Quaternion(newQuat.x, newQuat.y, newQuat.z, newQuat.w)); }
void SetGlobalRotation(Core.Quaternion value) { if (parent != null) { Core.Quaternion scaleAdjust = new Core.Quaternion(parent.localScale.Y * parent.localScale.Z, parent.localScale.X * parent.localScale.Z, parent.localScale.X * parent.localScale.Y, 0f); localRotation = (parent.localRotation.conjugate * value) * scaleAdjust; } else { localRotation = value; } isDirty = true; }