예제 #1
0
        public override void Update()
        {
            MSceneObject msp        = (MSceneObject)Parent;
            Vector3d     CurrentPos = msp.transform.Position;
            Quaterniond  CurrentRot = msp.transform.Rotation;

            //CurrentPos = Vector3d.Lerp(CurrentPos, TargetPosition, Time.DeltaTime * Speed);
            Start += Time.DeltaTime * Speed;
            if (Start > 1)
            {
                Start = 1;
            }
            CurrentPos = Extensions.SmoothStep(StartPosition, TargetPosition, Start);

            CurrentRot = Quaterniond.Slerp(StartRotation, TargetRotation, Start);
            msp.SetRotation(CurrentRot);
            msp.SetPosition(CurrentPos);

            //msp.LookAt(TargetPosition);
            double distance = Vector3d.Distance(CurrentPos, TargetPosition);

            if (distance < 1)
            {
                TeleportComplete();
            }
        }
예제 #2
0
        public override void Update()
        {
            base.Update();
            if (Target == null)
            {
                return;
            }

            CalcSurfaceDistance();

            if (Target is MAnimatedModel)
            {
                CurrentSpeed = (float)_physics._rigidBody.LinearVelocity.Length;
                //Console.WriteLine("MAvatar.Update:"+CurrentSpeed);
                SyncAnimationToState();
            }

            Controller.Update();

            if (MoveMode == eMoveMode.Walking)
            {
                if (_physics != null)
                {
                    //Quaterniond rot = Quaterniond.Slerp(GetRotation(), TargetRotation, Time.DeltaTime * 15);
                    Quaterniond rot = Quaterniond.Slerp(GetRotation(), TargetRotation, 0.01 * 15);
                    _physics.SetRotation(rot);
                    //_physics.SetRotation(TargetRotation);
                }
            }
            if (MoveMode == eMoveMode.Flying)
            {
                CalcAerodynamics();
            }
        }
예제 #3
0
        public override void Update()
        {
            if (Enabled == false)
            {
                return;
            }
            MSceneObject so = (MSceneObject)Parent;

            if (so != null)
            {
                Quaterniond q = so.transform.Rotation * AngleOffset;
                so.transform.Rotation = Quaterniond.Slerp(so.transform.Rotation, q, Time.DeltaTime * Speed);
            }
            if (_physics != null)
            {
                _physics.SetRotation(so.transform.Rotation);
            }
        }
예제 #4
0
파일: MNPC.cs 프로젝트: BigFun123/Massive
        void TurnToHome()
        {
            //Matrix4d m = Matrix4d.LookAt(model.transform.Position, OriginalPosition, Globals.LocalUpVector);
            //Matrix4d m = Matrix4d.RotateY(model.transform.Position, OriginalPosition, Globals.LocalUpVector);
            //Quaterniond q = m.ExtractRotation();
            //Quaterniond q = Quaterniond.FromAxisAngle(model.transform.Up(), 0.1);

            // model.SetRotation(q);

            Vector3d delta = model.transform.Position - OriginalPosition;
            Vector3d d2    = model.transform.Position + model.transform.Forward();
            double   d     = Vector3d.Dot(delta.Normalized(), d2.Normalized());

            Quaterniond s = Quaterniond.Slerp(model.transform.Rotation,
                                              model.transform.Rotation * Quaterniond.FromEulerAngles(0, -d, 0),
                                              0.0150);

            model.SetRotation(s);
        }
예제 #5
0
    public void Slerp()
    {
        for (int i = 0; i < count; i++)
        {
            Quaternion  a  = new Quaternion();
            Quaternion  b  = new Quaternion();
            Quaterniond ad = new Quaterniond();
            Quaterniond bd = new Quaterniond();

            float p = UnityEngine.Random.Range(-2F, 2F);

            RandomQuaternion(ref a, ref ad);
            RandomQuaternion(ref b, ref bd);

            Quaternion  value  = Quaternion.Slerp(a, b, p);
            Quaterniond valued = Quaterniond.Slerp(ad, bd, p);

            Assert.True(Approximate(value, valued));
        }
    }
예제 #6
0
        public override void Update()
        {
            if (Idle == true)
            {
                return;
            }
            if (msoParent == null)
            {
                return;
            }

            if (po == null)
            {
                po = (MPhysicsObject)Parent.FindModuleByType(EType.PhysicsObject);
            }

            MSceneObject msp        = (MSceneObject)Parent;
            Vector3d     CurrentPos = msp.transform.Position;
            Quaterniond  CurrentRot = msp.transform.Rotation;

            //CurrentPos = Vector3d.Lerp(CurrentPos, TargetPosition, Time.DeltaTime * Speed);
            Value += Time.DeltaTime * Speed;
            if (Value > 1)
            {
                Value = 1;
            }
            double dist = (Vector3d.Distance(TargetPosition, CurrentPos));

            if (dist > 1000)
            {
                Start = 0.999;
                if (po != null)
                {
                    po.SetActive(false);
                }
            }
            CurrentPos = Vector3d.Lerp(StartPosition, TargetPosition, Value);
            CurrentRot = Quaterniond.Slerp(CurrentRot, TargetRotation, Value);

            //if ( dist< 0.1)
            if (Value >= 1)
            {
                CurrentPos = TargetPosition;
                CurrentRot = TargetRotation;
                Idle       = true;
                //msp.SetPosition(TargetPosition);
                //msp.SetRotation(TargetRotation, false);
                //Console.WriteLine("idle");
                if (po != null)
                {
                    po.SetActive(true);
                }
                Complete();
            }
            else
            {
                if (po != null)
                {
                    po.SetActive(true);
                }
            }

            msp.SetPosition(CurrentPos);
            msp.SetRotation(CurrentRot, false);
        }