public static FixedQuaternion Normalize(FixedQuaternion q) { FixedQuaternion result; Normalize(ref q, out result); return(result); }
public static FixedQuaternion Inverse(FixedQuaternion rotation) { long lengthSq = rotation.lengthSquared; if (lengthSq != 0) { long i = FixedMath.One.Div(lengthSq); return(new FixedQuaternion(rotation.x.Mul(-i), rotation.y.Mul(-i), rotation.z.Mul(-i), rotation.w.Mul(i))); } return(rotation); }
public static bool PositionIsInFan(Vector3d basePosi, long radius, int angle, FixedQuaternion baseQuaternion, Vector3d posi) { #if UNITY_EDITOR var p1_sin = FixedMath.Trig.Sin(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(angle / 2)); var p1_cos = FixedMath.Trig.Cos(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(angle / 2)); var p1 = new Vector3d(p1_sin.Mul(radius), 0, p1_cos.Mul(radius)); var worldP1 = baseQuaternion * p1 + basePosi; var p2_sin = FixedMath.Trig.Sin(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(-angle / 2)); var p2_cos = FixedMath.Trig.Cos(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(-angle / 2)); var p2 = new Vector3d(p2_sin.Mul(radius), 0, p2_cos.Mul(radius)); var worldP2 = baseQuaternion * p2 + basePosi; Debug.DrawLine(basePosi.ToVector3(), worldP1.ToVector3(), Color.red, 3); Debug.DrawLine(basePosi.ToVector3(), worldP2.ToVector3(), Color.red, 3); #endif var radiusSqr = radius.Mul(radius); var relativeP = posi - basePosi; if (radiusSqr > relativeP.sqrMagnitude) { var rotateRelativeP = FixedQuaternion.Inverse(baseQuaternion) * relativeP; var cos = Vector3d.Dot(rotateRelativeP.Normalize(), new Vector3d(0, 0, FixedMath.One)); var realCos = FixedMath.Trig.Cos(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(angle / 2)); if (relativeP.z > 0) { if (angle > 180) { return(true); } return(realCos < cos); } else { if (angle < 180) { return(false); } else { return(realCos > cos); } } } else { return(false); } }
public static FixedQuaternion AngleAxis(long angle, Vector3d axis) { FixedQuaternion result = identity; var radians = angle.Mul(degToRad); float v = radians.ToFloat(); radians = radians / 2; float v2 = radians.ToFloat(); axis.Normalize(); axis.Mul(FixedMath.Trig.Sin(radians)); result.x = axis.x; result.y = axis.y; result.z = axis.z; result.w = FixedMath.Trig.Cos(radians); return(Normalize(result)); }
public static bool PositionIsInRect(FixedRect rect, Vector3d basePosition, FixedQuaternion baseQuaternion, Vector3d posi) { #if UNITY_EDITOR Vector3d leftDown = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(-rect.width / 2, 0, -rect.height / 2)) + basePosition; Vector3d rightDown = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(rect.width / 2, 0, -rect.height / 2)) + basePosition; Vector3d leftUp = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(-rect.width / 2, 0, rect.height / 2)) + basePosition; Vector3d rightUp = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(rect.width / 2, 0, rect.height / 2)) + basePosition; Debug.DrawLine(leftDown.ToVector3(), leftUp.ToVector3(), Color.green, 1); Debug.DrawLine(leftUp.ToVector3(), rightUp.ToVector3(), Color.green, 1); Debug.DrawLine(rightUp.ToVector3(), rightDown.ToVector3(), Color.green, 1); Debug.DrawLine(rightDown.ToVector3(), leftDown.ToVector3(), Color.green, 1); #endif var relativeP = posi - basePosition; var rotateRelativeP = FixedQuaternion.Inverse(baseQuaternion) * relativeP; return(rect.ContainsPoint(rotateRelativeP)); }
public override void Execute(SceneObject sender, SceneObject reciever, object data) { var r = FixedMath.Create(Radius) / 100; var q = FixedQuaternion.LookRotation(sender.Forward, Vector3d.up); Utility.List.Clear(); var _battleScene = LogicCore.SP.SceneManager.CurrentScene as BattleScene; _battleScene.FixedQuadTree.Query(sender as IFixedAgent, r, Utility.List); for (int i = 0; i < Utility.List.Count; i++) { if (IsTarget(Utility.List[i])) { if (Utility.PositionIsInFan(sender.Position, FixedMath.Create(Radius) / 100, Angle, q, Utility.List[i].Position)) { EventManager.TriggerEvent(EventId, new RuntimeData(sender, Utility.List[i] as SceneObject, null)); } } } ; base.Execute(sender, reciever, data); }
public override void Execute(SceneObject sender, SceneObject reciever, object data) { var _battleScene = LogicCore.SP.SceneManager.CurrentScene as BattleScene; long fw = FixedMath.Create(Width) / 100; long fh = FixedMath.Create(Height) / 100; long fr = FixedMath.Sqrt((fw / 2).Mul(fw / 2) + fh.Mul(fh)); var center = new Vector2d(0, fh / 2); var q = FixedQuaternion.LookRotation(sender.Forward, Vector3d.up); Utility.FixedRect rect = new Utility.FixedRect(center, fw, fh); Utility.List.Clear(); _battleScene.FixedQuadTree.Query(sender as IFixedAgent, fr, Utility.List); for (int i = 0; i < Utility.List.Count; i++) { if (IsTarget(Utility.List[i])) { if (Utility.PositionIsInRect(rect, sender.Position, q, Utility.List[i].Position)) { EventManager.TriggerEvent(EventId, new RuntimeData(sender, Utility.List[i] as SceneObject, null)); } } } base.Execute(sender, reciever, data); }
public static void Normalize(ref FixedQuaternion q, out FixedQuaternion result) { long scale = FixedMath.One.Div(q.Length); result = new FixedQuaternion(q.x.Mul(scale), q.y.Mul(scale), q.z.Mul(scale), q.w.Mul(scale)); }