void BuildDominos(ref List <RigidBody_c> rigidBodies) { rigidBodies.Clear(); // Add ground rectangle rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); int num = 20; float r = 50.0f; for (int i = 0; i < num; i++) { float inc = i / (float)(num); // 0 to 1.0f float x = r * (float)Math.Sin(inc * Math.PI * 2.0f); float z = r * (float)Math.Cos(inc * Math.PI * 2.0f); Quaternion yQRot = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), inc * (float)Math.PI * 2.0f); Vector3 cubeSize = new Vector3(1, 10, 5); Vector3 cubePos = new Vector3(x, 5.0f, z); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), yQRot, cubePos, 1.0f)); } // Trigger the domino effect { Vector3 cubeSize = new Vector3(5, 5, 5); Vector3 cubePos = new Vector3(5, 45.0f, r); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 1.0f)); } }
void BuildSeeSaw(ref List <RigidBody_c> rigidBodies) { rigidBodies.Clear(); // Add ground rectangle rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); Vector3 cubeSize = new Vector3(5, 5, 5); Vector3 cubePos = new Vector3(0, 0, 0); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 1.0f)); cubeSize = new Vector3(30, 2, 5); cubePos = new Vector3(0, 7.0f, 0); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 1.0f)); for (int i = 0; i < 5; i++) { cubeSize = new Vector3(5, 5, 5); cubePos = new Vector3(25, 50.0f + i * 20, 0); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 1.0f)); } cubeSize = new Vector3(5, 5, 5); cubePos = new Vector3(-25.0f, 15.0f, 0); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 1.0f)); }
private void buttonShootBall_Click(object sender, EventArgs e) { Shape shape = new ShapeSphere(5); m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(shape, Quaternion.Identity, new Vector3(0, 30, -100), 1.0f)); m_rigidBodies[m_rigidBodies.Count - 1].body.v += new Vector3(0, 0, 200); }
public void ModifyRigidBody(Shape shape) { ArbiterContainer_c.Clear(); if (m_addRigidBodies) { //for (int i=1; i<10; i++) int i = 1; m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(shape, Quaternion.Identity, new Vector3(20, 30 * i, 10), 1.0f)); } else { m_rigidBodies[m_rigidBodies.Count - 1] = HelperRigidBody_c.CreateRigidBody(shape, Quaternion.Identity, new Vector3(0, 10, 0), 1.0f); } }
void BuildMarbles(ref List <RigidBody_c> rigidBodies) { rigidBodies.Clear(); // Add ground rectangle rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); for (int i = 0; i < 4; i++) { float side = 1.0f; if (i % 2 == 0) { side = -1.0f; } Vector3 cubeSize = new Vector3(30, 2, 5); Vector3 cubePos = new Vector3(side * 5.0f, 7.0f + i * 25.0f, 0); Quaternion cubeRot = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), side * 0.2f); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), cubeRot, cubePos, 0.0f)); } for (int i = 0; i < 2; i++) { float side = 1.0f; if (i == 0) { side = -1.0f; } Vector3 cubeSize = new Vector3(2, 50, 5); Vector3 cubePos = new Vector3(35 * side, 50, 0); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 0.0f)); } // Add some falling marbles for (int i = 0; i < 1; i++) { Vector3 spherePos = new Vector3(25 - 7 * i, 95 + i * 0.0f, 0); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeSphere(3.0f), Quaternion.Identity, spherePos, 1.0f)); } }
private void buttonStack_Click(object sender, EventArgs e) { int num = 5; if (int.TryParse(textBoxStack.Text, out num) == false) { return; } ArbiterContainer_c.Clear(); m_rigidBodies.Clear(); // Add ground rectangle m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); // Stack cubes for (int i = 0; i < num; i++) { m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(5, 5, 5)), Quaternion.Identity, new Vector3(0, 10 * i, 0), 1.0f)); } }
void BuildBowling(ref List <RigidBody_c> rigidBodies) { rigidBodies.Clear(); // Add ground rectangle rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); Vector3 firstPinPos = new Vector3(0, 5, 30); Vector3 cubeSize = new Vector3(2, 10, 2); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, firstPinPos, 1.0f)); for (int i = 0; i < 4; i++) { for (int k = 0; k < 2; k++) { float side = 1.0f; if (k == 1) { side = -1.0f; } float gap = 5.0f; Vector3 pinPos = firstPinPos; pinPos.Z = firstPinPos.Z + (i + 1) * gap; pinPos.X = (i + 1) * side * gap; rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, pinPos, 1.0f)); } } // Fire bowling ball { Vector3 spherePos = new Vector3(0, 3, -70); rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeSphere(5.0f), Quaternion.Identity, spherePos, 1.0f)); rigidBodies[rigidBodies.Count() - 1].body.v.Z = 400.0f; } }
private void buttonWall_Click(object sender, EventArgs e) { int numX = 5; int numY = 5; if (!int.TryParse(textBoxWallX.Text, out numX)) { return; } if (!int.TryParse(textBoxWallY.Text, out numY)) { return; } ArbiterContainer_c.Clear(); m_rigidBodies.Clear(); // Add ground rectangle m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); // Wall cubes for (int y = 0; y < numY; y++) { for (int x = 0; x < numX; x++) { float xx = 0; if (y % 2 == 0) { xx = 5.0f; } Vector3 cubeSize = new Vector3(4.5f, 5, 5); Vector3 cubePos = new Vector3(x * 10 + xx, 10 * y, 0); m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(cubeSize), Quaternion.Identity, cubePos, 1.0f)); } } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); PresentationParameters pp = new PresentationParameters(); pp.BackBufferCount = 1; pp.IsFullScreen = false; pp.SwapEffect = SwapEffect.Discard; pp.BackBufferWidth = pictureBox.Width; pp.BackBufferHeight = pictureBox.Height; pp.AutoDepthStencilFormat = DepthFormat.Depth24Stencil8; pp.EnableAutoDepthStencil = true; pp.PresentationInterval = PresentInterval.Default; pp.BackBufferFormat = SurfaceFormat.Unknown; pp.MultiSampleType = MultiSampleType.None; m_device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.pictureBox.Handle, pp); m_device.PresentationParameters.BackBufferWidth = pictureBox.Width; m_device.PresentationParameters.BackBufferHeight = pictureBox.Height; m_device.Reset(); m_device.RenderState.AlphaBlendEnable = true; m_device.RenderState.DestinationBlend = Blend.InverseSourceAlpha; m_device.RenderState.SourceBlend = Blend.SourceAlpha; //float aspectRatio = (float)m_device.Viewport.Width / m_device.Viewport.Height; //Camera_c.s_view = Matrix.CreateLookAt( new Vector3(0,0,20.0f), // Vector3.Zero, // Vector3.Up); //Camera_c.s_projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), // aspectRatio, // 1.0f, // 1000.0f); m_timer = new Timer(); m_timer.Interval = 1; m_timer.Tick += new EventHandler(Draw); m_timer.Start(); // Add ground rectangle m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(100, 5, 100)), Quaternion.Identity, new Vector3(0, -10, 0), 0.0f)); /* * m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeCube( new Vector3(100, 100, 5)), Quaternion.Identity, new Vector3(0,70, 100), 0.0f) ); * m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeCube( new Vector3(100, 100, 5)), Quaternion.Identity, new Vector3(0,70,-100), 0.0f) ); * m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeCube( new Vector3(5, 100, 100)), Quaternion.Identity, new Vector3(-100, 70,0), 0.0f) ); * m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeCube( new Vector3(5, 100, 100)), Quaternion.Identity, new Vector3( 100, 70,0), 0.0f) ); * * * * m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeSphere( 5.0f ), Quaternion.Identity, Vector3.Zero, 1.0f) ); * * m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeCube(new Vector3(5, 10, 15) ), Quaternion.Identity, new Vector3(-20,0,0), 1.0f) ); */ //m_rigidBodies.Add( HelperRigidBody_c.CreateRigidBody( new ShapeSphere( 5.0f ), Quaternion.Identity, new Vector3(0,3,0), 1.0f) ); m_rigidBodies.Add(HelperRigidBody_c.CreateRigidBody(new ShapeCube(new Vector3(10, 5, 5)), Quaternion.Normalize(new Quaternion(1, 0, 1, 1)), new Vector3(0, 7, 0), 1.0f)); // So we can step back and check previous values m_curStep = 0; for (int i = 0; i < m_prevSteps.Count(); i++) { m_prevSteps[i] = new List <Body_c>(); } //m_model[0] = new Model_c(); //m_model[1] = new Model_c(); //m_model[0].m_shape = new ShapeSphere( 5.0f ); //m_model[0].m_hullMaker = new HullMaker(m_model[0].m_shape, -1); //m_model[0].m_position = new Vector3(8,8,0); //m_model[1].m_shape = new ShapeCube( new Vector3(5, 10, 15) ); //m_model[1].m_hullMaker = new HullMaker(m_model[1].m_shape, -1); //m_model[1].m_position = new Vector3(-8,8,0); }
RigidBody_c CreateRigidBody(Shape collideModel, Quaternion q, Vector3 x, float inv_m) { //RenderPolytope renderModel = rb.renderModel; HullMaker renderModel = new HullMaker(collideModel, -1); //if (!renderModel) //{ // renderModel = CreateRenderModel(collideModel); //} Body_c body = new Body_c(); body.q = q; body.x = x; body.inv_I = Matrix.Identity; body.inv_I *= inv_m / 25.0f; //body.inv_I.M33 = 1; body.inv_I.M44 = 1; body.inv_m = inv_m; if (inv_m == 0.0f) { body.m = 0.0f; } if (inv_m > 0.0f) { HelperRigidBody_c.ComputeMassProperties(body, renderModel, 1.0f); } float radiusNegX = Math.Abs(collideModel.GetSupportPoint(new Vector3(-1, 0, 0)).X); float radiusPosX = Math.Abs(collideModel.GetSupportPoint(new Vector3(1, 0, 0)).X); float radiusNegY = Math.Abs(collideModel.GetSupportPoint(new Vector3(0, -1, 0)).Y); float radiusPosY = Math.Abs(collideModel.GetSupportPoint(new Vector3(0, 1, 0)).Y); float radiusNegZ = Math.Abs(collideModel.GetSupportPoint(new Vector3(0, 0, -1)).Z); float radiusPosZ = Math.Abs(collideModel.GetSupportPoint(new Vector3(0, 0, 1)).Z); Vector3 maxRadiusVector = new Vector3 ( Math.Max(radiusNegX, radiusPosX), Math.Max(radiusNegY, radiusPosY), Math.Max(radiusNegZ, radiusPosZ) ); float maxRadius = maxRadiusVector.Length(); Microsoft.Xna.Framework.Graphics.Color[] randColour = { Microsoft.Xna.Framework.Graphics.Color.Red, Microsoft.Xna.Framework.Graphics.Color.Green, Microsoft.Xna.Framework.Graphics.Color.PaleGoldenrod, Microsoft.Xna.Framework.Graphics.Color.OliveDrab, Microsoft.Xna.Framework.Graphics.Color.OrangeRed, Microsoft.Xna.Framework.Graphics.Color.Wheat, Microsoft.Xna.Framework.Graphics.Color.YellowGreen }; randColourIndx++; if (randColourIndx > (randColour.Count() - 1)) { randColourIndx = 0; } body.inv_m_back = body.inv_m; return(new RigidBody_c(body, collideModel, renderModel, maxRadius, randColour[randColourIndx])); }