To run the CarTest.java in testbed, following things to do:
1. Add WHEEL in JointTypeCode:
public enum JointType {
UNKNOWN, REVOLUTE, PRISMATIC, DISTANCE, PULLEY,
MOUSE, GEAR, LINE, WELD, WHEEL, FRICTION, CONSTANT_VOLUME
}
2. Create a WheelJoint in Joint.java:Code:
public static Joint create(World argWorld, JointDef def) {
...
case WHEEL:
return new WheelJoint(argWorld.getPool(), (WheelJointDef) def);
3. Here's CarTest.java:Code:
package org.jbox2d.testbed.tests;
import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.common.MathUtils;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.dynamics.FixtureDef;
import org.jbox2d.dynamics.World;
import org.jbox2d.dynamics.joints.RevoluteJointDef;
import org.jbox2d.dynamics.joints.WheelJoint;
import org.jbox2d.dynamics.joints.WheelJointDef;
import org.jbox2d.testbed.framework.TestbedSettings;
import org.jbox2d.testbed.framework.TestbedTest;
public class CarTest extends TestbedTest {
int m_motoKeepTime;
Body m_car;
Body m_wheel1;
Body m_wheel2;
float m_hz;
float m_zeta;
float m_speed;
WheelJoint m_spring1;
WheelJoint m_spring2;
@Override
public void initTest(boolean argDeserialized) {
// TODO Auto-generated method stub
m_hz = 4.0f;
m_zeta = 0.7f;
m_speed = 50.0f;
World world = getWorld();
Body ground = null;
{
BodyDef bd = new BodyDef();
ground = world.createBody(bd);
PolygonShape shape = new PolygonShape();
shape.setAsEdge(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f));
ground.createFixture(shape, 0.0f);
// TODO: EdgeShape not implemented yet.
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.setAsEdge(new Vec2(x, y1), new Vec2(x + dx, y2));
ground.createFixture(shape, 0.0f);
y1 = y2;
x += dx;
}
shape.setAsEdge(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
ground.createFixture(shape, 0.0f);
x += 80.0f;
shape.setAsEdge(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
ground.createFixture(shape, 0.0f);
x += 40.0f;
shape.setAsEdge(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f));
ground.createFixture(shape, 0.0f);
x += 20.0f;
shape.setAsEdge(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f));
ground.createFixture(shape, 0.0f);
x += 40.0f;
shape.setAsEdge(new Vec2(x, 0.0f), new Vec2(x, 20.0f));
ground.createFixture(shape, 0.0f);
}
// Teeter
{
BodyDef bd = new BodyDef();
bd.position.set(140.0f, 1.0f);
bd.type = BodyType.DYNAMIC;
Body body = 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;
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 = world.createBody(bd);
body.createFixture(fd);
Vec2 anchor = new Vec2(160.0f + 2.0f * i, -0.125f);
jd.initialize(prevBody, body, anchor);
world.createJoint(jd);
prevBody = body;
}
Vec2 anchor = new Vec2(160.0f + 2.0f * N, -0.125f);
jd.initialize(prevBody, ground, anchor);
world.createJoint(jd);
}
// Boxes
{
PolygonShape box = new PolygonShape();
box.setAsBox(0.5f, 0.5f);
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(230.0f, 0.5f);
Body body = 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 = world.createBody(bd);
body.createFixture(box, 0.5f);
bd.position.set(230.0f, 3.5f);
body = world.createBody(bd);
body.createFixture(box, 0.5f);
bd.position.set(230.0f, 4.5f);
body = world.createBody(bd);
body.createFixture(box, 0.5f);
}
// Car
{
PolygonShape chassis = new PolygonShape();
Vec2[] vertices = new Vec2[8];
for (int i = 0; i < vertices.length; i++)
vertices[i] = new Vec2();
vertices[0].set(-1.5f, -0.5f);
vertices[1].set(1.5f, -0.5f);
vertices[2].set(1.5f, 0.0f);
vertices[3].set(0.0f, 0.9f);
vertices[4].set(-1.15f, 0.9f);
vertices[5].set(-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 = 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 = world.createBody(bd);
m_wheel1.createFixture(fd);
bd.position.set(1.0f, 0.4f);
m_wheel2 = 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) 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) world.createJoint(jd);
}
m_motoKeepTime = 0;
}
@Override
public String getTestName() {
// TODO Auto-generated method stub
return "CarTest";
}
/**
* @see org.jbox2d.testbed.framework.TestbedTest#keyPressed(char, int)
*/
@Override
public void keyPressed(char argKeyChar, int argKeyCode) {
// switch (argKeyChar) {
// case 'l' :
// m_joint.enableLimit(!m_joint.isLimitEnabled());
// getModel().getKeys()['l'] = false;
// break;
// case 'm' :
// m_joint.enableMotor(!m_joint.isMotorEnabled());
// getModel().getKeys()['m'] = false;
// break;
// case 'a' :
// m_joint.setMotorSpeed(1.0f * MathUtils.PI);
// getModel().getKeys()['a'] = false;
// isLeft = true;
// break;
// case 'd' :
// m_joint.setMotorSpeed(-1.0f * MathUtils.PI);
// getModel().getKeys()['d'] = false;
// isLeft = false;
// break;
// }
}
/**
* @see org.jbox2d.testbed.framework.TestbedTest#step(org.jbox2d.testbed.framework.TestbedSettings)
*/
@Override
public void step(TestbedSettings settings) {
super.step(settings);
// addTextLine("Limits " + (m_joint.isLimitEnabled() ? "on" : "off") + ", Motor "
// + (m_joint.isMotorEnabled() ? "on " : "off ") + (isLeft ? "left" : "right"));
// addTextLine("Keys: (l) limits, (m) motor, (a) left, (d) right");
}
}