Ejemplo n.º 1
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            var handle = Entities.ForEach((ref MovementOrder movementOrder,
                                           in InterceptTarget interceptTarget, in Position position, in Movement movement,
                                           in MovementCapabilities movementCapabilities) =>
            {
                var intercept = PhysicsUtils.AccelerationToIntercept(
                    new PhysicalState {
                    Position     = position.Value,
                    Velocity     = movement.Velocity,
                    Acceleration = movement.Acceleration,
                },
                    new PhysicalState {
                    Position     = interceptTarget.Position,
                    Velocity     = interceptTarget.Velocity,
                    Acceleration = interceptTarget.Acceleration,
                },
                    PhysicsUtils.GeesToMs2(movementCapabilities.MaxAccelerationMagnitude)
                    );

                movementOrder.Heading = math.normalize(intercept.Acceleration);
                movementOrder.AccelerationMagnitude = movementCapabilities.MaxAccelerationMagnitude;
            }).Schedule(inputDeps);
Ejemplo n.º 2
0
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.KeypadPlus))
            {
                var maxSteps = closestApproaches.Count + 1;
                var ca       = PhysicsUtils.ClosestApproach(
                    new PhysicalState
                {
                    Position     = fromVector3(Subject.position),
                    Velocity     = subjectVelocity,
                    Acceleration = subjectAcceleration
                },
                    new PhysicalState
                {
                    Position     = fromVector3(Target.position),
                    Velocity     = targetVelocity,
                    Acceleration = targetAcceleration
                },
                    1.0f,
                    maxSteps
                    );

                var dist = ca.x;
                var tti  = ca.y;

                var fSubject = PhysicsUtils.PredictFutureState(new PhysicalState()
                {
                    Position     = Subject.position,
                    Velocity     = subjectVelocity,
                    Acceleration = subjectAcceleration
                }, tti).Position;

                var fTarget = PhysicsUtils.PredictFutureState(new PhysicalState()
                {
                    Position     = Target.position,
                    Velocity     = targetVelocity,
                    Acceleration = targetAcceleration
                }, tti).Position;

                var diffDist = math.distance(fSubject, fTarget);

                closestApproaches.Add(new ClosestApproachResult()
                {
                    distance        = dist,
                    tti             = tti,
                    subjectPosition = fSubject,
                    targetPosition  = fTarget,
                    distCheck       = diffDist
                });

                Text.text += "\nCD: " + dist + " / DD: " + diffDist;
            }

            if (Input.GetKeyDown(KeyCode.Space))
            {
                var lastTti = -1f;
                for (var maxSteps = 1; maxSteps < 10; maxSteps++)
                {
                    var intercept = PhysicsUtils.AccelerationToIntercept(
                        new PhysicalState
                    {
                        Position     = fromVector3(Subject.position),
                        Velocity     = subjectVelocity,
                        Acceleration = subjectAcceleration
                    },
                        new PhysicalState
                    {
                        Position     = fromVector3(Target.position),
                        Velocity     = targetVelocity,
                        Acceleration = targetAcceleration
                    },
                        maxAccMag,
                        1.0f,
                        maxSteps
                        );

                    // if (intercept.TimeToIntercept - lastTti < float.Epsilon) break;
                    lastTti = intercept.TimeToIntercept;

                    intercepts.Add(intercept);
                }
            }

            if (Input.GetKeyDown(KeyCode.Return))
            {
                intercepts.Clear();
                closestApproaches.Clear();
                Text.text = "";
            }
        }