Пример #1
0
        /// <inheritdoc/>
        protected override bool OnApplyImpulse()
        {
            if (!_limitIsActive)
            {
                return(false);
            }

            var relativeVelocity = _constraint.GetRelativeVelocity(BodyA, BodyB);
            var impulse          = _constraint.SatisfyConstraint(BodyA, BodyB, relativeVelocity, 0, MaxForce);

            return(Math.Abs(impulse) > Simulation.Settings.Constraints.MinConstraintImpulse);
        }
Пример #2
0
        private float ApplyImpulse(int index)
        {
            if (_minImpulseLimits[index] != 0)
            {
                Constraint1D constraint       = _constraints[index];
                float        relativeVelocity = constraint.GetRelativeVelocity(BodyA, BodyB);
                float        impulse          = constraint.SatisfyConstraint(
                    BodyA,
                    BodyB,
                    relativeVelocity,
                    _minImpulseLimits[index],
                    _maxImpulseLimits[index]);

                return(impulse);
            }

            return(0);
        }
Пример #3
0
        /// <inheritdoc/>
        protected override bool OnApplyImpulse()
        {
            // Nothing to do if no limit is active.
            if (!_minLimitIsActive && !_maxLimitIsActive)
            {
                return(false);
            }

            // Relative velocity is positive if bodies are separating.
            float relativeVelocity = _constraint.GetRelativeVelocity(BodyA, BodyB);

            // If the max limit is reached, we must apply a negative impulse to bring bodies closer together.
            // If the min limit is reached, we must apply a positive impulse to get more separation.
            float impulseLimit    = MaxForce * _deltaTime;
            float minImpulseLimit = (_maxLimitIsActive) ? -impulseLimit : 0;
            float maxImpulseLimit = (_minLimitIsActive) ? impulseLimit : 0;

            // Apply constraint impulse.
            float impulse = _constraint.SatisfyConstraint(BodyA, BodyB, relativeVelocity, minImpulseLimit, maxImpulseLimit);

            return(Math.Abs(impulse) > Simulation.Settings.Constraints.MinConstraintImpulse);
        }