Beispiel #1
0
    public static FixedQuaternion Normalize(FixedQuaternion q)
    {
        FixedQuaternion result;

        Normalize(ref q, out result);
        return(result);
    }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    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);
        }
    }
Beispiel #4
0
    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));
    }
Beispiel #5
0
    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));
    }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
    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));
    }