//-------------------------------------------------------------------- public SimModel(GameModel model, float mass, SimObjectType simObjectType) : base(mass, simObjectType) { this.model = model; this.currPosition = model.Translate; this.prevPosition = currPosition; }
public ChainSim(Game game, GameModel[] ropeSegmentModels, float totalMass, float stiffness, float damping) : base(game) { //create sim data float sphereMass = totalMass / ropeSegmentModels.Length; SimModel[] simObjs = new SimModel[ropeSegmentModels.Length]; for (int i = 0; i < ropeSegmentModels.Length; i++) { simObjs[i] = new SimModel(ropeSegmentModels[i], sphereMass, SimObjectType.ACTIVE); this.AddSimObject(simObjs[i]); } //attach springs between the sim objects for (int i = 1; i < ropeSegmentModels.Length; i++) { this.AddSpring(stiffness, damping, simObjs[i - 1], simObjs[i]); this.Constraints.Add(new LengthConstraint((simObjs[i - 1].Model.Translate - simObjs[i].Model.Translate).Length(), simObjs[i - 1], simObjs[i])); } }
private void InitChainScene() { //chain attributes int numSegments = 30; float separation = 0.65f; //load in segments GameModel[] segments = new GameModel[numSegments]; for (int i = 0; i < numSegments; i++) { segments[i] = modelComponent.LoadGameModel("chainSegment"); //reduce the size of each segment segments[i].Scale = 0.3f * Vector3.One; //position each segment downwards incrementally to form the chain segments[i].TranslateY = -i * separation; //rotate the even segments by 90 degrees in Y axis segments[i].RotateY = (i % 2) * 90.0f; } //create a chain sim float totalMass = 1.0f; float stiffness = 0.3f; float damping = 0.01f; chainSim = new ChainSim(this, segments, totalMass, stiffness, damping); //add in a global force generator: gravity Gravity gravity = new Gravity(new Vector3(0, -9.81f * 5, 0)); chainSim.AddGlobalForceGenerator(gravity); //constrain the head point so that we can control it chainHeadPoint = new PointConstraint(Vector3.Zero, chainSim.SimObjects[0]); chainSim.Constraints.Add(chainHeadPoint); //create a integrator and assign it to the sim float drag = 0.005f; Integrator integrator = new VerletNoVelocityIntegrator(this, drag); chainSim.Integrator = integrator; }