void ICCDPositionUpdateable.UpdatePositionContinuously(float dt) { float minimumToi = 1; for (int i = 0; i < collisionInformation.pairs.Count; ++i) { if (collisionInformation.pairs.Elements[i].timeOfImpact < minimumToi) { minimumToi = collisionInformation.pairs.Elements[i].timeOfImpact; } } //The orientation was already updated by the PreUpdatePosition. //However, to be here, this object is not a discretely updated object. //That means we still need to update the linear motion. Vector3 increment; Vector3.Multiply(ref linearVelocity, dt * minimumToi, out increment); Vector3.Add(ref position, ref increment, out position); collisionInformation.UpdateWorldTransform(ref position, ref orientation); if (PositionUpdated != null) { PositionUpdated(this); } linearMomentum.Validate(); linearVelocity.Validate(); angularMomentum.Validate(); angularVelocity.Validate(); position.Validate(); orientation.Validate(); }
void ICCDPositionUpdateable.UpdatePositionContinuously(float dt) { float minimumToi = 1; for (int i = 0; i < collisionInformation.pairs.Count; i++) { if (collisionInformation.pairs.Elements[i].timeOfImpact < minimumToi) { minimumToi = collisionInformation.pairs.Elements[i].timeOfImpact; } } //The orientation was already updated by the PreUpdatePosition. //However, to be here, this object is not a discretely updated object. //That means we still need to update the linear motion. System.Numerics.Vector3 increment; Vector3Ex.Multiply(ref linearVelocity, dt * minimumToi, out increment); Vector3Ex.Add(ref position, ref increment, out position); collisionInformation.UpdateWorldTransform(ref position, ref orientation); if (PositionUpdated != null) { PositionUpdated(this); } MathChecker.Validate(linearVelocity); MathChecker.Validate(angularVelocity); MathChecker.Validate(position); MathChecker.Validate(orientation); #if CONSERVE MathChecker.Validate(angularMomentum); #endif }