// ── Construction (robotInit / subsystem constructor) ──────────────────────SimWorldsimWorld=newSimWorld();// 50 Hz, 10 solver iterationssimWorld.addBody(newSimBodyBuilder("Floor").planeCollider(0,0,1,0)// +Z normal, at Z=0.isStatic().material(Material.CARPET));SimBodyrobot=simWorld.addBody(newSimBodyBuilder("Robot").robotId(RobotId.BLUE_1).position(0,0,0.1).mass(54).boxCollider(0.3,0.3,0.15).noGravity().fixedRotation().material(Material.CARPET));// ── simulationPeriodic ────────────────────────────────────────────────────// Push motor outputs into the actuator:robot.getActuator().setForce(driveForceX,driveForceY,0);// Advance physics:simWorld.step();// Read back the simulated pose:Pose3dp=robot.getPose();
JSim provides built-in force generators that you attach to bodies via SimWorld:
// Velocity-proportional drag (linear and rotational):DragForcedrag=simWorld.addDragForce(gamePiece,0.1,0.05);// Magnus lift for spinning projectiles:MagnusForcemagnus=simWorld.addMagnusForce(gamePiece,0.3);// Direct actuator — set each control loop iteration:robot.getActuator().setForce(fx,fy,fz);robot.getActuator().setTorque(tx,ty,tz);robot.getActuator().zero();// clear on disable