Exemplo n.º 1
0
    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));
        }
    }
Exemplo n.º 2
0
    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));
    }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
    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));
        }
    }
Exemplo n.º 6
0
        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));
            }
        }
Exemplo n.º 7
0
    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;
        }
    }
Exemplo n.º 8
0
        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));
                }
            }
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
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]));
    }