コード例 #1
0
        public override MovementTransform DoSteering()
        {
            Vector3 temp          = Vector3.Zero;
            int     neighborCount = 0;
            var     it            = mCharacter.EnvironmentContext.World.Actors.GetEnumerator();

            while (it.MoveNext())
            {
                var actor = it.Current.Value;
                var boid  = actor.GetComponent <GamePlay.Component.GMovementComponent>() as IBoid;
                if (boid == null || boid == mCharacter || boid == mTarget)
                {
                    continue;
                }
                if ((boid.Position - mCharacter.Position).Length() < NeighborDistance)
                {
                    temp += boid.Velocity;
                    neighborCount++;
                }
            }
            it.Dispose();
            MovementTransform movementTransform = new MovementTransform();

            if (neighborCount > 0)
            {
                temp /= neighborCount;
                temp  = temp - mCharacter.Velocity;
                if (IgnoreY)
                {
                    temp.Y = 0;
                }
                movementTransform.Force = temp;
            }
            return(movementTransform);
        }
コード例 #2
0
        internal override MovementTransform DoSteering(Vector3 target)
        {
            MovementTransform steering = new MovementTransform();

            if (mTarget == null)
            {
                return(steering);
            }
            if (IgnoreY)
            {
                mTargetPos = new Vector3(GetRandomFloat(), 0, GetRandomFloat());
            }
            else
            {
                mTargetPos = new Vector3(GetRandomFloat(), GetRandomFloat(), GetRandomFloat());
            }
            mTargetPos *= Radius;
            mTargetPos += (-Vector3.UnitZ * Distance);
            var rot   = Quaternion.GetQuaternion(-Vector3.UnitZ, mCharacter.Velocity);
            var dir   = Vector3.TransformNormal(mTargetPos, Matrix.RotationQuaternion(rot));
            var force = dir - mCharacter.Velocity;

            if (IgnoreY)
            {
                force.Y = 0;
            }
            force.Normalize();
            steering.Force = force * mCharacter.MaxVelocity;
            return(steering);
        }
コード例 #3
0
        internal override MovementTransform DoSteering(Vector3 target)
        {
            MovementTransform steering = new MovementTransform();

            steering.Force = (target - mCharacter.Position);
            steering.Force.Normalize();
            steering.Force *= mCharacter.MaxVelocity;
            return(steering);
        }
コード例 #4
0
        public override MovementTransform DoSteering()
        {
            MovementTransform steering = new MovementTransform();

            if (mTarget == null)
            {
                return(steering);
            }
            steering.Force = (mTarget.Position - mCharacter.Position);
            steering.Force.Normalize();
            steering.Force *= mCharacter.MaxVelocity;
            return(steering);
        }
コード例 #5
0
ファイル: Separation.cs プロジェクト: huangdonghai/titan3d
        public override MovementTransform DoSteering()
        {
            Vector3 temp          = Vector3.Zero;
            int     neighborCount = 0;
            var     it            = mCharacter.EnvironmentContext.World.Actors.GetEnumerator();

            while (it.MoveNext())
            {
                var actor = it.Current.Value;
                var boid  = actor.GetComponent <GamePlay.Component.GMovementComponent>() as IBoid;
                if (boid == null || boid == mCharacter || boid == mTarget)
                {
                    continue;
                }
                if ((boid.Position - mCharacter.Position).Length() < NeighborDistance)
                {
                    if ((boid.Position - mCharacter.Position) == Vector3.Zero)
                    {
                        Random random = new Random();
                        var    vec    = new Vector3(random.Next(10), random.Next(10), random.Next(10));
                        temp += vec.NormalizeValue;
                    }
                    else
                    {
                        var vector = (mCharacter.Position - boid.Position);
                        temp += vector.NormalizeValue * (1 / vector.Length());
                    }
                    neighborCount++;
                }
            }
            it.Dispose();
            MovementTransform movementTransform = new MovementTransform();

            if (neighborCount > 0)
            {
                //temp.Normalize();
                //movementTransform.Force = temp * 10;
                temp = temp - mCharacter.Velocity;
                if (IgnoreY)
                {
                    temp.Y = 0;
                }
                movementTransform.Force = temp;
                //movementTransform.Orientation = temp.NormalizeValue;
            }
            return(movementTransform);
        }
コード例 #6
0
        internal override MovementTransform DoSteering(Vector3 target)
        {
            MovementTransform steering = new MovementTransform();

            steering.Force = (target - mCharacter.Position);
            if (steering.Force.Length() < Radius)
            {
                return(default(MovementTransform));
            }
            steering.Force /= TimeToTarget;
            if (steering.Force.Length() > Character.MaxVelocity)
            {
                steering.Force.Normalize();
                steering.Force *= Character.MaxVelocity;
            }
            return(steering);
        }
コード例 #7
0
        internal override MovementTransform DoSteering(Vector3 target)
        {
            MovementTransform steering = new MovementTransform();
            var desireVel = -(target - mCharacter.Position).NormalizeValue * mCharacter.MaxVelocity;
            var force     = desireVel - mCharacter.Velocity;
            var cos       = Vector3.Dot(desireVel, mCharacter.Velocity);

            if (cos > 0.9f)
            {
                force = desireVel;
            }
            //steering.Force = force.NormalizeValue * Math.Min(force.Length(),60);
            if (IgnoreY)
            {
                force.Y = 0;
            }
            steering.Force = force;
            return(steering);
        }
コード例 #8
0
        public override MovementTransform DoSteering()
        {
            MovementTransform steering = new MovementTransform();

            if (mTarget == null)
            {
                return(steering);
            }
            mTargetPos  = new Vector3(((MathHelper.RandomRange(0, 2) - 1) * Jitter), 0, ((MathHelper.RandomRange(0, 2) - 1) * Jitter));
            mTargetPos *= Radius;
            mTargetPos += (-Vector3.UnitZ * Distance);
            var rot = Quaternion.GetQuaternion(-Vector3.UnitZ, mCharacter.Orientation);
            var pos = Vector3.TransformCoordinate(mTargetPos, Matrix.RotationQuaternion(rot));
            var dir = pos - mCharacter.Position;

            dir.Normalize();
            dir.Y          = 0;
            steering.Force = dir * mCharacter.MaxVelocity;
            return(steering);
        }
コード例 #9
0
        public override MovementTransform DoSteering()
        {
            MovementTransform steering = new MovementTransform();

            if (mTarget == null)
            {
                return(steering);
            }
            steering.Force = (mTarget.Position - mCharacter.Position);
            if (steering.Force.Length() < Radius)
            {
                return(default(MovementTransform));
            }
            steering.Force /= TimeToTarget;
            if (steering.Force.Length() > Character.MaxVelocity)
            {
                steering.Force.Normalize();
                steering.Force *= Character.MaxVelocity;
            }
            return(steering);
        }