Exemplo n.º 1
0
        internal WheelJoint(IWorldPool argPool, WheelJointDef def)
            : base(argPool, def)
        {
            m_localAnchorA.set(def.localAnchorA);
            m_localAnchorB.set(def.localAnchorB);
            m_localXAxisA.set(def.localAxisA);
            Vec2.crossToOutUnsafe(1.0f, m_localXAxisA, ref m_localYAxisA);

            m_motorMass = 0.0f;
            m_motorImpulse = 0.0f;

            m_maxMotorTorque = def.maxMotorTorque;
            m_motorSpeed = def.motorSpeed;
            m_enableMotor = def.enableMotor;

            m_frequencyHz = def.frequencyHz;
            m_dampingRatio = def.dampingRatio;
        }
Exemplo n.º 2
0
        public override void initTest(bool deserialized)
        {
            if (deserialized)
            {
                return;
            }
            m_hz = 4.0f;
            m_zeta = 0.7f;
            m_speed = 50.0f;

            Body ground = null;
            {
                BodyDef bd = new BodyDef();
                ground = m_world.createBody(bd);

                EdgeShape shape = new EdgeShape();

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 0.0f;
                fd.friction = 0.6f;

                shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
                ground.createFixture(fd);

                float[] hs = {0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f};

                float x = 20.0f, y1 = 0.0f, dx = 5.0f;

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    shape.set(new Vec2(x, y1), new Vec2(x + dx, y2));
                    ground.createFixture(fd);
                    y1 = y2;
                    x += dx;
                }

                for (int i = 0; i < 10; ++i)
                {
                    float y2 = hs[i];
                    shape.set(new Vec2(x, y1), new Vec2(x + dx, y2));
                    ground.createFixture(fd);
                    y1 = y2;
                    x += dx;
                }

                shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.createFixture(fd);

                x += 80.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.createFixture(fd);

                x += 40.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f));
                ground.createFixture(fd);

                x += 20.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
                ground.createFixture(fd);

                x += 40.0f;
                shape.set(new Vec2(x, 0.0f), new Vec2(x, 20.0f));
                ground.createFixture(fd);
            }

            // Teeter
            {
                BodyDef bd = new BodyDef();
                bd.position.set(140.0f, 1.0f);
                bd.type = BodyType.DYNAMIC;
                Body body = m_world.createBody(bd);

                PolygonShape box = new PolygonShape();
                box.setAsBox(10.0f, 0.25f);
                body.createFixture(box, 1.0f);

                RevoluteJointDef jd = new RevoluteJointDef();
                jd.initialize(ground, body, body.getPosition());
                jd.lowerAngle = -8.0f*MathUtils.PI/180.0f;
                jd.upperAngle = 8.0f*MathUtils.PI/180.0f;
                jd.enableLimit = true;
                m_world.createJoint(jd);

                body.applyAngularImpulse(100.0f);
            }

            // Bridge
            {
                int N = 20;
                PolygonShape shape = new PolygonShape();
                shape.setAsBox(1.0f, 0.125f);

                FixtureDef fd = new FixtureDef();
                fd.shape = shape;
                fd.density = 1.0f;
                fd.friction = 0.6f;

                RevoluteJointDef jd = new RevoluteJointDef();

                Body prevBody = ground;
                for (int i = 0; i < N; ++i)
                {
                    BodyDef bd = new BodyDef();
                    bd.type = BodyType.DYNAMIC;
                    bd.position.set(161.0f + 2.0f*i, -0.125f);
                    Body body = m_world.createBody(bd);
                    body.createFixture(fd);

                    Vec2 anchor = new Vec2(160.0f + 2.0f*i, -0.125f);
                    jd.initialize(prevBody, body, anchor);
                    m_world.createJoint(jd);

                    prevBody = body;
                }

                Vec2 anchor2 = new Vec2(160.0f + 2.0f*N, -0.125f);
                jd.initialize(prevBody, ground, anchor2);
                m_world.createJoint(jd);
            }

            // Boxes
            {
                PolygonShape box = new PolygonShape();
                box.setAsBox(0.5f, 0.5f);

                Body body = null;
                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;

                bd.position.set(230.0f, 0.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 1.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 2.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 3.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);

                bd.position.set(230.0f, 4.5f);
                body = m_world.createBody(bd);
                body.createFixture(box, 0.5f);
            }

            // Car
            {
                PolygonShape chassis = new PolygonShape();
                Vec2[] vertices = new Vec2[8];
                vertices[0] = new Vec2(-1.5f, -0.5f);
                vertices[1] = new Vec2(1.5f, -0.5f);
                vertices[2] = new Vec2(1.5f, 0.0f);
                vertices[3] = new Vec2(0.0f, 0.9f);
                vertices[4] = new Vec2(-1.15f, 0.9f);
                vertices[5] = new Vec2(-1.5f, 0.2f);
                chassis.set(vertices, 6);

                CircleShape circle = new CircleShape();
                circle.m_radius = 0.4f;

                BodyDef bd = new BodyDef();
                bd.type = BodyType.DYNAMIC;
                bd.position.set(0.0f, 1.0f);
                m_car = m_world.createBody(bd);
                m_car.createFixture(chassis, 1.0f);

                FixtureDef fd = new FixtureDef();
                fd.shape = circle;
                fd.density = 1.0f;
                fd.friction = 0.9f;

                bd.position.set(-1.0f, 0.35f);
                m_wheel1 = m_world.createBody(bd);
                m_wheel1.createFixture(fd);

                bd.position.set(1.0f, 0.4f);
                m_wheel2 = m_world.createBody(bd);
                m_wheel2.createFixture(fd);

                WheelJointDef jd = new WheelJointDef();
                Vec2 axis = new Vec2(0.0f, 1.0f);

                jd.initialize(m_car, m_wheel1, m_wheel1.getPosition(), axis);
                jd.motorSpeed = 0.0f;
                jd.maxMotorTorque = 20.0f;
                jd.enableMotor = true;
                jd.frequencyHz = m_hz;
                jd.dampingRatio = m_zeta;
                m_spring1 = (WheelJoint) m_world.createJoint(jd);

                jd.initialize(m_car, m_wheel2, m_wheel2.getPosition(), axis);
                jd.motorSpeed = 0.0f;
                jd.maxMotorTorque = 10.0f;
                jd.enableMotor = false;
                jd.frequencyHz = m_hz;
                jd.dampingRatio = m_zeta;
                m_spring2 = (WheelJoint) m_world.createJoint(jd);
            }
        }