Exemplo n.º 1
0
        public SharpEngine(
            PhysicsEngineParameters simulationParameters,
            CollisionEngineParameters collisionEngineParameters,
            SolverParameters solverParameters)
        {
            SolverParameters     = solverParameters;
            CollisionEngineParam = collisionEngineParameters;
            EngineParameters     = simulationParameters;

            // Default solver
            SetSolverType(SolverType.ProjectedGaussSeidel);

            Shapes = new IShape[0];

            CollisionEngine = new CollisionDetectionEngine(
                collisionEngineParameters,
                EngineParameters.CollisionDistance);

            contactPartitioningEngine = new ContactPartitioningEngine();

            CollisionShapes          = new List <ICollisionShape>();
            CollisionJoints          = new List <ICollisionJoint>();
            Joints                   = new List <IConstraint> ();
            HsGenerator              = new HashGenerator();
            LinearSystemBuilder      = new LinearProblemBuilderEngine(EngineParameters);
            IntegrateVelocityEngine  = new IntegrateVelocity(EngineParameters);
            IntegratePositionEngine  = new IntegratePosition(EngineParameters);
            contactConstraintBuilder = new ContactConstraintBuilder(EngineParameters);
            rayCastEngine            = new RayCastingEngine();
            warmStartEngine          = new WarmStartEngine(EngineParameters);
            ccdEngine                = new ConservativeAdvancement();
        }
Exemplo n.º 2
0
        private JacobianConstraint[] AddFrictionConstraints(
            IShape objectA,
            IShape objectB,
            PhysicsEngineParameters simulationParameters,
            Vector3d normal,
            Vector3d relativeVelocity,
            Vector3d ra,
            Vector3d rb,
            SoftShapePoint softShapePoint)
        {
            JacobianConstraint[] friction = new JacobianConstraint[simulationParameters.FrictionDirections];

            Vector3d[] frictionDirection = GetFrictionCone(normal, simulationParameters.FrictionDirections);

            double constraintLimit = 0.0;

            Vector3d tangentialVelocity = relativeVelocity -
                                          normal.Dot(relativeVelocity) *
                                          normal;

            if (Vector3d.Length(tangentialVelocity) > simulationParameters.ShiftToStaticFrictionTolerance)
            {
                constraintLimit = 0.5 * (objectA.DynamicFrictionCoeff + objectB.DynamicFrictionCoeff);
            }
            else
            {
                constraintLimit = 0.5 * (objectA.StaticFrictionCoeff + objectB.StaticFrictionCoeff);
            }

            for (int i = 0; i < simulationParameters.FrictionDirections; i++)
            {
                var linearComponentA = frictionDirection[i];
                var linearComponentB = -1.0 * linearComponentA;

                var angularComponentA = ra.Cross(linearComponentA);
                var angularComponentB = -1.0 * rb.Cross(linearComponentA);

                friction[i] = JacobianCommon.GetDOF(
                    linearComponentA,
                    linearComponentB,
                    angularComponentA,
                    angularComponentB,
                    (objectA is ISoftShape) ? (IShapeCommon)softShapePoint: objectA,
                    (objectB is ISoftShape) ? (IShapeCommon)softShapePoint: objectB,
                    0.0,
                    0.0,
                    simulationParameters.FrictionCFM,
                    constraintLimit,
                    ConstraintType.Friction,
                    null);
            }

            return(friction);
        }
Exemplo n.º 3
0
        private JacobianConstraint[] GetJacobianConstraints(
            CollisionPointStructure[] collisionPointsStruct,
            List <IConstraint> simulationJointList,
            IShape[] simulationObjs,
            PhysicsEngineParameters simulationParameters)
        {
            List <JacobianConstraint> jacobianConstraints = new List <JacobianConstraint>();

            ////Collision Contact
            jacobianConstraints.AddRange(
                GetCollisionConstraints(
                    collisionPointsStruct,
                    simulationObjs));

            ////Joints
            if (simulationJointList.Count > 0)
            {
                List <JacobianConstraint>[] jConstraints = new List <JacobianConstraint> [simulationJointList.Count];
                var rangePartitioner = Partitioner.Create(0, simulationJointList.Count, Convert.ToInt32(simulationJointList.Count / EngineParameters.MaxThreadNumber) + 1);

                Parallel.ForEach(
                    rangePartitioner,
                    new ParallelOptions {
                    MaxDegreeOfParallelism = EngineParameters.MaxThreadNumber
                },
                    (range, loopState) =>
                {
                    for (int i = range.Item1; i < range.Item2; i++)
                    {
                        jConstraints[i] = simulationJointList[i].BuildJacobian();
                    }
                });

                jacobianConstraints.AddRange(jConstraints.SelectMany(f => f));
            }

            return(jacobianConstraints.ToArray());
        }
Exemplo n.º 4
0
 public ContactConstraintBuilder(
     PhysicsEngineParameters simulationParameters)
 {
     this.simulationParameters = simulationParameters;
 }