private void BuildCar() { JitterDemo demo = this.Game as JitterDemo; World world = demo.World; CompoundShape.TransformedShape lower = new CompoundShape.TransformedShape( new BoxShape(2.5f, 1f, 6.0f), JMatrix.Identity, JVector.Zero); CompoundShape.TransformedShape upper = new CompoundShape.TransformedShape( new BoxShape(2.0f, 0.5f, 3.0f), JMatrix.Identity, JVector.Up * 0.75f + JVector.Backward * 1.0f); CompoundShape.TransformedShape[] subShapes = { lower, upper }; Shape chassis = new CompoundShape(subShapes); //chassis = new BoxShape(2.5f, 1f, 6.0f); carBody = new DefaultCar(world, chassis); // use the inertia of the lower box. // adjust some driving values carBody.SteerAngle = 30; carBody.DriveTorque = 155; carBody.AccelerationRate = 10; carBody.SteerRate = 2f; carBody.AdjustWheelValues(); carBody.Tag = BodyTag.DontDrawMe; carBody.AllowDeactivation = false; // place the car two units above the ground. carBody.Position = new JVector(0, 5, 0); world.AddBody(carBody); }
public override void Build() { AddGround(); List<ConvexHullShape> shapes = BuildFromHACDTestObjFile(@"Content/ConvexDecomposition.obj"); CompoundShape.TransformedShape[] transformedShapes = new CompoundShape.TransformedShape[shapes.Count]; for (int i = 0; i < shapes.Count; i++) { transformedShapes[i] = new CompoundShape.TransformedShape(); transformedShapes[i].Shape = shapes[i]; transformedShapes[i].Orientation = JMatrix.Identity; transformedShapes[i].Position = -1.0f * shapes[i].Shift; } // Create one compound shape CompoundShape cs = new CompoundShape(transformedShapes); for (int i = 0; i < 1; i++) { RigidBody compoundBody = new RigidBody(cs); compoundBody.EnableDebugDraw = true; compoundBody.Position = new JVector(0, 5+ i*10, 0) - cs.Shift; Demo.World.AddBody(compoundBody); } // Create several single bodies. for (int i = 0; i < shapes.Count; i++) { RigidBody body = new RigidBody(shapes[i]); body.Position = -1.0f * shapes[i].Shift + new JVector(-10, 5, 0); body.EnableDebugDraw = true; Demo.World.AddBody(body); } for (int i = 0; i < shapes.Count; i++) { RigidBody body = new RigidBody(shapes[i]); body.Position = -1.0f * shapes[i].Shift + new JVector(-20, 5, 0); body.EnableDebugDraw = true; body.IsStatic = true; Demo.World.AddBody(body); } }
private void BuildScene() { // creating a box shape, representing the ground // and one to create the compound shape Shape boxShape = new BoxShape(new JVector(1,1,3)); Shape groundShape = new BoxShape(new JVector(10, 1, 10)); // Build the CompoundShape.TransformedShape structure, // containing "normal" shapes and position/orientation // information. CompoundShape.TransformedShape[] transformedShapes = new CompoundShape.TransformedShape[2]; // Create a rotation matrix (90°) JMatrix rotated = Conversion.ToJitterMatrix(Matrix.CreateRotationX(MathHelper.PiOver2)); // the first "sub" shape. A rotatated boxShape. transformedShapes[0] = new CompoundShape.TransformedShape( boxShape,rotated,JVector.Zero); // the second "sub" shape. transformedShapes[1] = new CompoundShape.TransformedShape( boxShape, JMatrix.Identity, JVector.Zero); // Pass the CompoundShape.TransformedShape structure to the compound shape. CompoundShape compoundShape = new CompoundShape(transformedShapes); RigidBody compoundBody = new RigidBody(compoundShape); compoundBody.Position = new JVector(0, 5, 0); RigidBody groundBody = new RigidBody(groundShape); // make the body static, so it can't be moved groundBody.IsStatic = true; // add the bodies to the world. world.AddBody(compoundBody); world.AddBody(groundBody); }
protected override void Update(GameTime gameTime) { if (codeFormVisible) return; KeyboardState keyState = Keyboard.GetState(); MouseState mouseState = Mouse.GetState(); if (keyState.IsKeyDown(Keys.Escape)) this.Exit(); bool leftHold = (mouseState.LeftButton == ButtonState.Pressed); bool spaceHold = (keyState.IsKeyDown(Keys.Space)); bool enterHold = (keyState.IsKeyDown(Keys.Enter)); bool mHold = (keyState.IsKeyDown(Keys.M)); #region Turn multithreading on/off if (mHold) { if (!mClicked) { multithread = !multithread; mClicked = true; } } #endregion #region Object drag & drop if (leftHold && !leftClicked) { JVector ray = Conversion.ToJitterVector(RayTo(mouseState.X, mouseState.Y)); ray.Normalize(); JVector camp = Conversion.ToJitterVector(Camera.Position); float fraction; bool result = world.CollisionSystem.Raycast(camp, ray * 100, RaycastCallback, out resBody, out hitNormal, out fraction); if (result) { hitPoint = camp + fraction * ray * 100; if (wp != null) world.RemoveConstraint(wp); JVector lanchor = hitPoint - resBody.Position; lanchor = JVector.Transform(lanchor, JMatrix.Transpose(resBody.Orientation)); wp = new WorldPointConstraint(resBody, lanchor); world.AddConstraint(wp); hitDistance = (Conversion.ToXNAVector(hitPoint) - Camera.Position).Length(); scrollWheel = mouseState.ScrollWheelValue; wp.Anchor = hitPoint; } leftClicked = true; } if (mouseState.LeftButton == ButtonState.Pressed) { hitDistance += (mouseState.ScrollWheelValue - scrollWheel) * 0.001f; scrollWheel = mouseState.ScrollWheelValue; if (resBody != null) { Vector3 ray = RayTo(mouseState.X, mouseState.Y); ray.Normalize(); wp.Anchor = Conversion.ToJitterVector(Camera.Position + ray * hitDistance); } } else { resBody = null; if (wp != null) world.RemoveConstraint(wp); } #endregion #region Show code form if (enterHold && !enterClicked && gameTime.TotalGameTime.TotalSeconds > 0.1f) { display.DisplayText[5] = string.Empty; System.Windows.Forms.Form form = (System.Windows.Forms.Form)System.Windows.Forms.Control.FromHandle(this.Window.Handle); codeFormVisible = true; System.Windows.Forms.DialogResult result = codeForm.ShowDialog(form); codeFormVisible = false; enterClicked = true; } #endregion #region Spawn random primitive if (spaceHold && !spaceClicked) { int rndn = random.Next(6); RigidBody body; if (rndn == 0) { body = new RigidBody(new ConeShape((float)random.Next(5, 50) / 20.0f, (float)random.Next(10, 20) / 20.0f)); } else if (rndn == 1) { body = new RigidBody(new BoxShape(new JVector( (float)random.Next(10, 30) / 20.0f, (float)random.Next(10, 30) / 20.0f, (float)random.Next(10, 30) / 20.0f))); } else if (rndn == 2) { body = new RigidBody(new SphereShape((float)random.Next(30,100) /100.0f)); } else if (rndn == 3) { body = new RigidBody(new CylinderShape(1.0f, 0.5f)); } else if (rndn == 4) { body = new RigidBody(new CapsuleShape(1.0f, 0.5f)); } else { Shape b1 = new BoxShape(new JVector(3, 1, 1)); Shape b2 = new BoxShape(new JVector(1, 1, 3)); Shape b3 = new CylinderShape(2.0f, 0.5f); CompoundShape.TransformedShape t1 = new CompoundShape.TransformedShape(b1, JMatrix.Identity, JVector.Zero); CompoundShape.TransformedShape t2 = new CompoundShape.TransformedShape(b2, JMatrix.Identity, JVector.Zero); CompoundShape.TransformedShape t3 = new CompoundShape.TransformedShape(b3, JMatrix.Identity, new JVector(0, 0, 0)); CompoundShape ms = new CompoundShape(new CompoundShape.TransformedShape[3] { t1, t2, t3 }); body = new RigidBody(ms); } world.AddBody(body); body.Position = Conversion.ToJitterVector(Camera.Position); body.LinearVelocity = Conversion.ToJitterVector((Camera.Target - Camera.Position) * 40.0f); body.Update(); spaceClicked = true; } #endregion spaceClicked = spaceHold; leftClicked = leftHold; enterClicked = enterHold; mClicked = mHold; int contactCount = 0; foreach (Arbiter ar in world.ArbiterMap.Values) contactCount += ar.ContactList.Count; display.DisplayText[0] = "Arbitercount: " + world.ArbiterMap.Values.Count.ToString() + ";" + " Contactcount: " + contactCount.ToString(); display.DisplayText[2] = "Bodycount: " + world.RigidBodies.Count; display.DisplayText[3] = (multithread) ? "Multithreaded" : "Single Threaded"; float elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds; if (elapsedTime > 1.0f / 100.0f) elapsedTime = 1.0f / 100.0f; world.Step(elapsedTime, multithread); base.Update(gameTime); }
private void SpawnRandomPrimitive(JVector position, JVector velocity) { RigidBody body = null; int rndn = random.Next(7); // less of the more advanced objects if (rndn == 5 || rndn == 6) rndn = random.Next(7); switch (rndn) { case 0: body = new RigidBody(new ConeShape((float)random.Next(5, 50) / 20.0f, (float)random.Next(10, 20) / 20.0f)); break; case 1: body = new RigidBody(new BoxShape((float)random.Next(10, 30) / 20.0f, (float)random.Next(10, 30) / 20.0f, (float)random.Next(10, 30) / 20.0f)); break; case 2: body = new RigidBody(new SphereShape(1.0f)); break; case 3: body = new RigidBody(new CylinderShape(1.0f, 0.5f)); break; case 4: body = new RigidBody(new CapsuleShape(1.0f, 0.5f)); break; case 5: Shape b1 = new BoxShape(new JVector(3, 1, 1)); Shape b2 = new BoxShape(new JVector(1, 1, 3)); Shape b3 = new CylinderShape(3.0f, 0.5f); CompoundShape.TransformedShape t1 = new CompoundShape.TransformedShape(b1, JMatrix.Identity, JVector.Zero); CompoundShape.TransformedShape t2 = new CompoundShape.TransformedShape(b2, JMatrix.Identity, JVector.Zero); CompoundShape.TransformedShape t3 = new CompoundShape.TransformedShape(b3, JMatrix.Identity, new JVector(0, 0, 0)); CompoundShape ms = new CompoundShape(new CompoundShape.TransformedShape[3] { t1, t2, t3 }); body = new RigidBody(ms); break; case 6: ConvexHullObject obj2 = new ConvexHullObject(this); Components.Add(obj2); body = obj2.body; body.Material.Restitution = 0.2f; body.Material.StaticFriction = 0.8f; break; } World.AddBody(body); body.Position = position; body.LinearVelocity = velocity; //body.EnableDebugDraw = true; lastBody = body; }