예제 #1
0
        protected override void LoadContent()
        {
            arch   = Content.Load <Model>("arch");
            sphere = Content.Load <Model>("sphere");

            Vector2 archPosition = new Vector2(0f, -1f);
            Body3D  arch3D       =
                Body3DFactory.CreateBody3D(
                    arch,
                    world3D.World2D,
                    GraphicsDevice,
                    archPosition,
                    BodyType.Static,
                    basicEffectParams: effectParams);

            world3D.AddBody3D(arch3D);

            Vector2 spherePosition = new Vector2(0f, 5f);
            Body3D  sphere3D       =
                Body3DFactory.CreateBody3D(
                    sphere,
                    world3D.World2D,
                    GraphicsDevice,
                    spherePosition,
                    basicEffectParams: effectParams);

            sphere3D.Body2D.SetRestitution(0.8f);
            sphere3D.Body2D.ApplyAngularImpulse(14f);

            world3D.AddBody3D(sphere3D);
        }
예제 #2
0
        private void AddRamp(bool typeA, Vector2 position)
        {
            Body3D ramp = _creator.CreateBody3D(typeA ? _rampAModel : _rampBModel, position, BodyType.Static);

            ramp.Body2D.SetCollisionCategories(Category.Cat31);
            Demo.World3D.AddBody3D(ramp);
        }
예제 #3
0
        public override void Construct()
        {
            Demo.Window.Title = "Friction Demo";

            Demo.Camera3D.Position = new Vector3(-46.62277f, 105.9008f, 79.68979f);
            Demo.Camera3D.Target   = new Vector3(-46.25956f, 105.3427f, 78.94375f);

            ConstructGround(23);
            Body3D body3D =
                Body3DFactory.CreateBody3D(
                    _leftBlock,
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    new Vector2(-59.15f, 5.9f),
                    BodyType.Static);

            body3D.Body2D.SetCollisionCategories(Category.Cat31);
            Demo.World3D.AddBody3D(body3D);

            body3D =
                Body3DFactory.CreateBody3D(
                    _rightBlock,
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    new Vector2(59.15f, 5.9f),
                    BodyType.Static);
            body3D.Body2D.SetCollisionCategories(Category.Cat31);
            Demo.World3D.AddBody3D(body3D);

            ConstructRamps();
        }
        private void ConstructEnvironment()
        {
            int groundLength = 51;

            ConstructGround(groundLength);

            Body3D blockLeft =
                Body3DFactory.CreateBody3D(
                    Demo.Content.Load <Model>("Models/groundBlockLongLeft"),
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    new Vector2(-129.15f, 5.9f),
                    BodyType.Static);

            Demo.World3D.AddBody3D(blockLeft);

            Body3D blockRight =
                Body3DFactory.CreateBody3D(
                    Demo.Content.Load <Model>("Models/groundBlockLongRight"),
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    new Vector2(129.15f, 5.9f),
                    BodyType.Static);

            Demo.World3D.AddBody3D(blockRight);

            _backgroundWall = Demo.Content.Load <Model>("Models/Decorations/goldWall");

            for (int i = -groundLength / 3; i < groundLength / 3; i++)
            {
                Demo.World3D.AddBackdrop3D(new Backdrop3D(_backgroundWall, new Vector3(i * 15f, 0f, -15f)));
            }
        }
        private void CreateChassis(World world, Vector2 pivot)
        {
            {
                PolygonShape shape = new PolygonShape(1f)
                {
                    Vertices = PolygonTools.CreateRectangle(2.5f, 1f)
                };

                _body = Demo.Content.Load <Model>("Models/TheoDesign/bodyOrganic");

                _chassis          = world.CreateBody();
                _chassis.BodyType = BodyType.Dynamic;
                _chassis.Position = pivot + _position;

                Fixture fixture = _chassis.CreateFixture(shape);
                fixture.CollisionGroup = -1;

                _mainBody3D = new Body3D(_body, _chassis);

                Demo.World3D.AddBody3D(_mainBody3D);
            }

            {
                CircleShape shape = new CircleShape(1.6f, 1f);

                _engine = Demo.Content.Load <Model>("Models/TheoDesign/engineLargeTwistedEnds");

                _wheel          = world.CreateBody();
                _wheel.BodyType = BodyType.Dynamic;
                _wheel.Position = pivot + _position;

                Fixture fixture = _wheel.CreateFixture(shape);
                fixture.CollisionGroup = -1;

                Demo.World3D.AddBody3D(new Body3D(_engine, _wheel));
            }

            {
                _motorJoint =
                    new RevoluteJoint(_wheel, _chassis, _wheel.GetLocalPoint(_chassis.Position), Vector2.Zero)
                {
                    CollideConnected = false,
                    MotorSpeed       = _motorSpeed,
                    MaxMotorTorque   = MAX_MOTOR_TORQUE,
                    MotorEnabled     = true
                };
                world.Add(_motorJoint);
            }
        }
예제 #6
0
        private void AddBall(float restitution, float positionZ, float positionX, Category collisionCategory)
        {
            Body body = new Body();

            body.CreateCircle(1f, 1f);
            body.SetRestitution(restitution);
            body.SetCollidesWith(collisionCategory);

            Body3D body3D =
                Body3DFactory.CreateBody3D(_ballModel, Demo.World3D.World2D, body, new Vector2(positionX, 5f));

            body3D.PositionZ = positionZ;

            body3D.Body2D.ApplyLinearImpulse(Vector2.One * 10f);
            body3D.Body2D.ApplyAngularImpulse(-40f);

            Demo.World3D.AddBody3D(body3D);
        }
예제 #7
0
        /// <summary>
        /// Vrátí objekt typu <see cref="Body3D"/>. Tvar pro dvourozměrnou fyzikální simulaci je dán parametrem body.
        /// </summary>
        /// <param name="model">Trojrozměrný model.</param>
        /// <param name="world2D">Dvourozměrný svět, do kterého má být těleso zařazeno.</param>
        /// <param name="body">Dvourozměrné těleso.</param>
        /// <param name="position">Výchozí pozice objektu v dvourozměrném světě.</param>
        /// <param name="bodyType">Typ simulovaného tělesa (statické, kinematické nebo dynamické).</param>
        /// <param name="basicEffectParams">Parametry pro třídu <see cref="BasicEffect"/>.</param>
        /// <returns>Objekt typu <see cref="Body3D"/>.</returns>
        public static Body3D CreateBody3D(
            Model model,
            World world2D,
            Body body,
            Vector2 position  = new Vector2(),
            BodyType bodyType = BodyCreator.DEFAULT_BODY_TYPE,
            BasicEffectParams basicEffectParams = null)
        {
            body.Position = position;
            body.BodyType = bodyType;
            world2D.Add(body);

            Body3D body3D = new Body3D(model, body)
            {
                BasicEffectParams = basicEffectParams
            };

            return(body3D);
        }
예제 #8
0
        private void AddCube(float friction, float positionZ, float positionX, Category collisionCategory)
        {
            Body body = new Body();

            body.CreateRectangle(2f, 2f, 1f, Vector2.Zero);
            body.SetFriction(friction);
            body.SetCollidesWith(collisionCategory);

            Body3D body3D =
                Body3DFactory.CreateBody3D(
                    _cubeModel,
                    Demo.World3D.World2D,
                    body,
                    new Vector2(positionX, 100f));

            body3D.PositionZ = positionZ;

            Demo.World3D.AddBody3D(body3D);
        }
예제 #9
0
        protected override void LoadContent()
        {
            ground   = Content.Load <Model>("ground");
            cilinder = Content.Load <Model>("cilinder");

            Vector2 groundPosition = new Vector2(0f, -1f);
            Body3D  ground3D       =
                Body3DFactory.CreateBody3D(
                    ground, world3D.World2D, GraphicsDevice, groundPosition, BodyType.Static);

            world3D.AddBody3D(ground3D);

            Vector2 cilinderPosition = new Vector2(0f, 5f);
            Body3D  cilinder3D       =
                Body3DFactory.CreateBody3D(
                    cilinder, world3D.World2D, GraphicsDevice, cilinderPosition);

            world3D.AddBody3D(cilinder3D);
        }
예제 #10
0
        public override void Construct()
        {
            Demo.Window.Title = "Restitution Demo";

            Demo.Camera3D.Position = new Vector3(22.12281f, 0.4714419f, 5.708819f);
            Demo.Camera3D.Target   = new Vector3(21.21403f, 0.5188365f, 5.294256f);

            ConstructGround();

            Body3D leftBlock =
                Body3DFactory.CreateBody3D(
                    Demo.Content.Load <Model>("Models/groundBlockLongLeft"),
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    new Vector2(-24.15f, 5.9f),
                    BodyType.Static);

            leftBlock.Body2D.SetCollisionCategories(Category.Cat31);
            Demo.World3D.AddBody3D(leftBlock);

            Body3D rightBlock =
                Body3DFactory.CreateBody3D(
                    Demo.Content.Load <Model>("Models/groundBlockLongRight"),
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    new Vector2(24.15f, 5.9f),
                    BodyType.Static);

            rightBlock.Body2D.SetCollisionCategories(Category.Cat31);
            Demo.World3D.AddBody3D(rightBlock);

            AddBall(0.70f, -6f, -6f, Category.Cat31);
            AddBall(0.75f, -4f, -4f, Category.Cat31);
            AddBall(0.80f, -2f, -2f, Category.Cat31);
            AddBall(0.85f, 0f, 0f, Category.Cat31);
            AddBall(0.90f, 2f, 2f, Category.Cat31);
            AddBall(0.95f, 4f, 4f, Category.Cat31);
            AddBall(1.00f, 6f, 6f, Category.Cat31);
        }
예제 #11
0
        /// <summary>
        /// Vrátí objekt typu <see cref="Body3D"/>. Tvar odpovídající dvourozměrné reprezentaci pro fyzikální simulaci
        /// je nalezen podle ortogonální projekce zadaného trojrozměrného modelu.
        /// </summary>
        /// <param name="model">Trojrozměrný model.</param>
        /// <param name="world2D">Dvourozměrný svět, do kterého má být těleso zařazeno.</param>
        /// <param name="graphicsDevice">Grafické zařízení.</param>
        /// <param name="position">Výchozí pozice objektu ve dvojrozměrném světě.</param>
        /// <param name="bodyType">Typ simulovaného tělesa (statické, kinematické nebo dynamické).</param>
        /// <param name="orthographicModelSize">Velikost modelu pro renderování. Pokud tento parametr není zadán,
        /// vypočítá se.</param>
        /// <param name="triangulationAlgorithm">Algoritmus pro rozdělení tvaru na množství menších konvexních
        /// polygonů.</param>
        /// <param name="basicEffectParams">Parametry pro třídu <see cref="BasicEffect"/>.</param>
        /// <returns>Objekt typu <see cref="Body3D"/>.</returns>
        public static Body3D CreateBody3D(
            Model model,
            World world2D,
            GraphicsDevice graphicsDevice,
            Vector2 position              = new Vector2(),
            BodyType bodyType             = BodyCreator.DEFAULT_BODY_TYPE,
            Vector2 orthographicModelSize = new Vector2(),
            TriangulationAlgorithm triangulationAlgorithm = BodyCreator.DEFAULT_TRIANGULATION_ALGORITHM,
            BasicEffectParams basicEffectParams           = null)
        {
            using (Texture2D orthoRender = BitmapRenderer.RenderOrthographic(graphicsDevice, model,
                                                                             BitmapRenderer.DEFAULT_BITMAP_SCALE, orthographicModelSize))
            {
                Body body2D = BodyCreator.CreatePolygonBody(orthoRender, world2D, position, bodyType,
                                                            1f, 0f, 1f, triangulationAlgorithm);

                Body3D body3D = new Body3D(model, body2D)
                {
                    BasicEffectParams = basicEffectParams
                };

                return(body3D);
            }
        }
예제 #12
0
        public override void Construct()
        {
            Demo.Window.Title = "Game Scene Demo";

            Demo.Camera3D.Position = new Vector3(17f, 9f, 19f);
            Vector2 defaultPositionShift = new Vector2(-100f, 5f);

            Demo.Camera3D.Target = new Vector3(defaultPositionShift.X, defaultPositionShift.Y, 18f);
            _positionStart       = Demo.Camera3D.Target;

            ConstructBusStop();
            ConstructBackground();

            PolygonShape shape = new PolygonShape(1f)
            {
                Vertices = PolygonTools.CreateRoundedRectangle(25f, 6.45566f, 1.5f, 1.5f, 4)
            };

            _chassis3D =
                Body3DFactory.CreateBody3D(
                    _bodyModel,
                    Demo.World3D.World2D,
                    Demo.GraphicsDevice,
                    defaultPositionShift,
                    BodyType.Dynamic,
                    new Vector2(25f, 6.45566f));

            Demo.World3D.AddBody3D(_chassis3D);

            #region Přední náprava

            Vector2 frontPosition = new Vector2(6.996475f, -2.9f) + defaultPositionShift;
            Vector2 axis          = new Vector2(0f, 1.2f);

            _frontWheels = new Body();
            _frontWheels.CreateCircle(1.3163165f, 1f);

            _frontWheels3D =
                Body3DFactory.CreateBody3D(
                    _frontWheelsModel,
                    Demo.World3D.World2D,
                    _frontWheels,
                    frontPosition);

            _springFront = new WheelJoint(_chassis3D.Body2D, _frontWheels, frontPosition, axis, true)
            {
                MotorSpeed     = 0f,
                MaxMotorTorque = 10f,
                MotorEnabled   = false,
                Frequency      = 4f,
                DampingRatio   = 0.7f
            };
            Demo.World3D.World2D.Add(_springFront);

            Demo.World3D.AddBody3D(_frontWheels3D);

            #endregion Přední náprava

            #region Zadní náprava

            Vector2 backPosition = new Vector2(-5.973385f, -2.9f) + defaultPositionShift;

            _backWheels = new Body();
            _backWheels.CreateCircle(1.364622f, 1f);

            _backWheels3D =
                Body3DFactory.CreateBody3D(
                    _backWheelsModel,
                    Demo.World3D.World2D,
                    _backWheels,
                    backPosition);

            _springBack = new WheelJoint(_chassis3D.Body2D, _backWheels, backPosition, axis, true)
            {
                MotorSpeed     = DEFAULT_MOTOR_SPEED,
                MaxMotorTorque = MAX_MOTOR_TORQUE,
                MotorEnabled   = true,
                Frequency      = 4f,
                DampingRatio   = 0.7f
            };
            Demo.World3D.World2D.Add(_springBack);

            Demo.World3D.AddBody3D(_backWheels3D);

            #endregion Zadní náprava

            #region Rampa

            _ramp3D = Body3DFactory.CreateBody3D(
                _rampModel,
                Demo.World3D.World2D,
                Demo.GraphicsDevice,
                new Vector2(0f, 5f));
            Demo.World3D.AddBody3D(_ramp3D);

            #endregion Rampa
        }
예제 #13
0
        public override void Construct()
        {
            Demo.Window.Title = "Path Demo";

            Demo.Camera3D.Position = new Vector3(16.36052f, 7.006462f, 1.119595f);
            Demo.Camera3D.Target   = new Vector3(15.43861f, 6.659885f, 0.9464932f);

            HiddenBody = Demo.World3D.World2D.CreateBody(Vector2.Zero);

            Path bridgePath = new Path();

            bridgePath.Add(new Vector2(-17, 5));
            bridgePath.Add(new Vector2(17, 5));

            bridgePath.Closed = false;

            Model plankModel = Demo.Content.Load <Model>("Models/bridge");

            PolygonShape shape = new PolygonShape(PolygonTools.CreateRectangle(0.125f, 0.5f), 20f);

            List <Body> bodies =
                PathManager.EvenlyDistributeShapesAlongPath(Demo.World3D.World2D,
                                                            bridgePath, shape,
                                                            BodyType.Dynamic,
                                                            34);

            JointFactory.CreateRevoluteJoint(
                Demo.World3D.World2D,
                HiddenBody,
                bodies[0],
                new Vector2(0f, 0.5f));
            JointFactory.CreateRevoluteJoint(
                Demo.World3D.World2D,
                HiddenBody,
                bodies[bodies.Count - 1],
                new Vector2(0f, -0.5f));

            PathManager.AttachBodiesWithRevoluteJoint(
                Demo.World3D.World2D,
                bodies,
                new Vector2(0f, 0.5f),
                new Vector2(0f, -0.5f),
                false,
                true);

            foreach (Body b in bodies)
            {
                Demo.World3D.AddBody3D(new Body3D(plankModel, b));
            }

            Body body = new Body();

            body.CreateCircle(1f, 1f);
            body.SetRestitution(0.7f);

            Body3D body3D =
                Body3DFactory.CreateBody3D(
                    Demo.Content.Load <Model>("Models/Primitives/goldBall"),
                    Demo.World3D.World2D,
                    body,
                    new Vector2(8f, 8f));

            Demo.World3D.AddBody3D(body3D);
            body.ApplyAngularImpulse(5f);
        }