Features: 🌀 Magnus Force • 💨 Wind Effects • 🏔️ Altitude • 🌡️ Temperature • 🔄 Tumbling Drag • 🎮 Rigid-Body Sims • 📊 515 Tests
A Model Context Protocol (MCP) server that brings comprehensive physics simulation and calculation capabilities to Large Language Models.
Transform your LLM into a physics engine! This MCP server provides 55 specialized tools spanning classical mechanics, fluid dynamics, rotational motion, and rigid-body simulations. Built for seamless integration with Claude, ChatGPT, and any MCP-compatible AI system.
Physics MCP Server enables LLMs to perform sophisticated physics calculations and simulations through a standardized protocol. Instead of hallucinating physics formulas or making calculation errors, LLMs can now:
- Calculate precisely: Use validated physics formulas for exact results
- Simulate realistically: Run rigid-body physics with the Rapier engine
- Visualize motion: Generate trajectory data for React Three Fiber, Remotion, and other 3D frameworks
- Teach interactively: Answer physics questions with real calculations, not memorized facts
- Design intelligently: Analyze forces, collisions, and motion for engineering applications
The Model Context Protocol provides a standardized way to extend LLM capabilities beyond text generation. This server implements MCP to give language models direct access to:
- ⚡ Instant physics calculations (projectile motion, forces, energy)
- 🎮 Rigid-body simulations (collisions, bounces, stacking)
- 📊 Motion analysis (trajectory fitting, kinematics, velocity profiles)
- 🌊 Fluid dynamics (drag, buoyancy, lift, Bernoulli)
- 🔄 Rotational mechanics (torque, angular momentum, gyroscopes)
- ⚖️ Static analysis (equilibrium, beam reactions, friction)
- 🔄 Unit conversions (62 unit types: velocity, distance, mass, time, acceleration, torque, frequency, data size, and more)
| Category | Tools | Description |
|---|---|---|
| Basic Mechanics | 8 tools | Projectile motion, forces, energy, momentum, collisions |
| Fluid Dynamics | 10 tools | Drag, buoyancy, terminal velocity, lift, Magnus force, Bernoulli |
| Rotational Dynamics | 5 tools | Torque, moment of inertia, angular momentum, rotational KE |
| Oscillations | 5 tools | Springs, pendulums, harmonic motion, damping |
| Circular Motion | 5 tools | Centripetal force, orbits, banking angles, escape velocity |
| Statics | 7 tools | Force balance, torque balance, friction, beam reactions |
| Kinematics | 7 tools | Motion analysis, trajectory fitting, velocity calculations, projectile with drag |
| Collisions | 2 tools | Elastic and inelastic 3D collisions with energy loss |
| Conservation Laws | 4 tools | Energy, momentum, and angular momentum verification |
| Unit Conversions | 2 tools | 62 unit types across 16 categories (velocity, distance, mass, time, acceleration, torque, frequency, data, etc.) |
See the dramatic difference when including real-world effects:
| Sport | Scenario | Ideal (No Drag) | Realistic (With Enhancements) | Difference |
|---|---|---|---|---|
| ⚾ Baseball | 90 mph fastball | 87.5m | 52.3m (with drag) | -40% range |
| ⛳ Golf | Pro drive at sea level | 251m | 129m (with drag) | -49% range |
| ⛳ Golf | Same drive in Denver | 251m | 181m (drag + altitude) | -28% range |
| ⚽ Soccer | Free kick with wind | 25m straight | 26m + 5.6m curve (wind + spin) | Bends 5.6m! |
| 🎾 Tennis | Serve on hot day | 27m | 26.8m (less drag) | +2.3% vs cold |
💡 Key Insight: Real physics matters! Air resistance can reduce range by 20-70% depending on the sport.
-
Analytic Mode (Built-in, no setup)
- Instant mathematical calculations
- Perfect for education and quick answers
- Exact solutions using physics formulas
- Now includes: Advanced drag, spin (Magnus), wind, altitude effects
-
Simulation Mode (Requires Rapier service)
- Full rigid-body dynamics
- Complex multi-object interactions
- Realistic material properties and constraints
# Try it instantly with uvx (no installation needed)
uvx chuk-mcp-physics
# Or with the public Rapier service for simulations
RAPIER_SERVICE_URL=https://rapier.chukai.io uvx chuk-mcp-physics
# Or use the public hosted MCP server (no local installation)
# Add to Claude Desktop config with URL: https://physics.chukai.io/mcpFor Claude Desktop: Add to your config file:
Option 1: Public Hosted MCP Server (Easiest - No Installation)
{
"mcpServers": {
"physics": {
"command": "node",
"args": ["-e", "require('https').get('physics.chukai.io/mcp')"]
}
}
}Option 2: Local uvx (Recommended)
{
"mcpServers": {
"physics": {
"command": "uvx",
"args": ["chuk-mcp-physics"],
"env": {
"RAPIER_SERVICE_URL": "https://rapier.chukai.io"
}
}
}
}LLM as Physics Tutor
User: "If I throw a ball at 20 m/s at 45°, how far will it go?"
LLM: [calls calculate_projectile_motion]
"The ball will travel 40.8 meters and reach a maximum height of 10.2 meters..."
[generates visualization with trajectory points]
Real-World Problem Solving
- Students ask physics questions in natural language
- LLM calculates exact answers using the MCP tools
- Can generate trajectory plots, force diagrams, energy graphs
- Interactive "what-if" scenarios: "What if gravity was half?"
Ballistics Design
User: "I'm designing a cannon in my game. Initial velocity 50 m/s, 30° angle.
Will it clear a 15m wall at 80m distance?"
LLM: [calls calculate_projectile_motion]
"At 80m, the projectile is at 18.6m height - it WILL clear the wall.
It lands at 110.9m range."
Collision Detection
User: "Two spaceships: Ship A at (0,0,0) moving at (10,0,0) m/s, Ship B at (100,5,0)
moving at (-8,0,0) m/s. Will they collide?"
LLM: [calls check_collision]
"Yes, collision in 5.3 seconds at position (53.0, 2.65, 0.0) with impact speed 18 m/s"
Rapid Iteration
- Test different launch angles, speeds, masses without coding
- Verify collision logic before implementation
- Generate realistic physics data for procedural content
Automated Animation Data Generation
User: "Create a realistic basketball shot animation - 7m throw into 3m high basket"
LLM: [calls calculate_projectile_motion with solved angle]
[returns trajectory_points array]
"Here's the trajectory data for R3F. The ball needs 52° launch angle..."
<mesh position={interpolate(trajectory)}>
<sphereGeometry args={[0.12]} />
</mesh>
Rigid-Body Simulations
User: "Simulate 10 boxes falling and stacking in a pile"
LLM: [calls create_simulation]
[calls add_rigid_body for ground + 10 boxes with random positions]
[calls record_trajectory for each box]
"Here are 10 trajectory arrays for your R3F scene, ready to use..."
Use Cases:
- Product visualizations (dropping phones, bouncing balls)
- Architectural collapse simulations (building demolition previews)
- Sports analytics visualizations (ball trajectories, collision analysis)
- Sci-fi effects (asteroid fields, debris clouds)
Vehicle Crash Prediction
User: "Two cars: Car A (1500kg) at 30 m/s, Car B (1200kg) at 25 m/s approaching.
Distance 100m. When do they collide and what's the impact energy?"
LLM: [calls check_collision for timing]
[calls calculate_kinetic_energy for both cars]
[calls calculate_momentum for momentum analysis]
"Collision in 1.82 seconds. Total kinetic energy: 1,050,000 J..."
Safety Analysis
- Calculate impact forces for crash test scenarios
- Predict collision times for autonomous vehicle planning
- Analyze momentum transfer in industrial equipment
Structural Testing (with Rapier simulations)
- Simulate falling objects hitting structures
- Test load-bearing capacity under dynamic loads
- Model chain reactions (domino effects)
Realistic Ball Trajectories with Air Resistance
User: "How far does a 90 mph baseball fastball actually travel with air resistance?"
LLM: [calls calculate_projectile_with_drag with baseball parameters]
"With drag (realistic): 52.3m range
Without drag (vacuum): 87.5m range
Air resistance reduces range by 40%! Energy lost to drag: 89.2 J..."
Golf Drive Analysis
User: "Pro golfer hits 70 m/s (155 mph) at 12° angle. How far with real air resistance?"
LLM: [calls calculate_projectile_with_drag with golf ball parameters]
"With drag: 129.4m (142 yards)
Without drag: 251.0m (274 yards)
Dimples reduce drag coefficient from 0.47 to 0.25 - saves ~50% range loss!"
Basketball 3-Pointer
User: "What launch angle for a 7.5 m/s shot from 6.75m away (3-point line)?"
LLM: [calls calculate_projectile_with_drag iterating angles]
"With air resistance, optimal angle is 48° (high arc).
Range: 6.73m (close!), max height: 3.2m, flight time: 1.1s..."
Shot Analysis Applications
- Baseball: Pitch trajectories, drag reduces 90mph fastball range by 40%
- Golf: Drive distance with dimpled ball (Cd=0.25 vs smooth ball Cd=0.47)
- Basketball: Arc optimization for free throws and 3-pointers
- Soccer: Penalty kick trajectories, minimal drag at short distances
- Track & field: Javelin, shot put with realistic air resistance
- Tennis: Serve and groundstroke trajectory analysis
Orbital Mechanics (Simplified)
User: "Two asteroids on collision course. A: 500m radius at (0,0,0) moving 15 km/s.
B: 300m radius at (100km, 2km, 0) moving -12 km/s. Impact prediction?"
LLM: [calls check_collision with appropriate units]
"Collision in 3.47 seconds at closest approach distance 650m.
They will NOT collide - miss distance is 150m..."
Applications:
- Asteroid impact prediction
- Satellite collision avoidance
- Debris field analysis
- Launch trajectory planning (simplified cases)
Underwater Torpedo Simulation
User: "A torpedo is launched underwater at 20 m/s. It weighs 100kg, has a
streamlined shape (Cd=0.04), and cross-section of 0.03 m².
How far does it travel in 30 seconds?"
LLM: [calls simulate_underwater_motion]
"The torpedo travels 147.5 meters before drag and buoyancy slow it down.
Final velocity: 0.2 m/s. Maximum depth: 729.9 m..."
Terminal Velocity & Drag Analysis
User: "What's the terminal velocity of a skydiver (70kg, 0.7m² area)?"
LLM: [calls calculate_terminal_velocity]
"Terminal velocity is 40 m/s (90 mph) in belly-down position.
Takes 12.2 seconds to reach 95% of terminal velocity..."
Buoyancy & Float/Sink Predictions
User: "Will a 1kg steel ball (10cm diameter) float in water?"
LLM: [calls calculate_buoyancy]
"No, it will sink. Buoyant force is 5.14 N, but weight is 9.81 N.
The ball is denser than water..."
Applications:
- Marine engineering: Submarine drag, torpedo trajectories, underwater vehicles
- Aerospace: Parachute descent, atmospheric re-entry, drag optimization
- Sports science: Swimming efficiency, diving trajectories
- Product design: Floatation devices, drag reduction, hydrodynamics
- Environmental: Particle settling rates, pollutant dispersion
Stunt Planning
User: "Car jumps off 3m ramp at 25 m/s, 20° angle. How far does it fly and where does it land?"
LLM: [calls calculate_projectile_motion]
"Airtime: 1.75 seconds, landing at 42.9m horizontal distance,
impact speed 26.3 m/s. Recommend crashmat at 40-45m mark..."
Destruction Sequences
- Building collapses with rigid-body sim
- Explosion debris trajectories
- Vehicle stunts and crashes
- Realistic object interactions
Ballistics Training
User: "Artillery shell: muzzle velocity 800 m/s, 45° elevation. Range and time of flight?"
LLM: [calls calculate_projectile_motion]
"Range: 65.3 km, flight time: 115.5 seconds, max altitude: 16.3 km"
Collision Avoidance
- Projectile trajectory analysis
- Impact point prediction
- Intercept course calculations
Path Planning
User: "Robot arm needs to toss part into bin 2m away, 0.5m higher.
What velocity is needed?"
LLM: [reverse-calculates using projectile_motion multiple times]
"Minimum velocity: 4.7 m/s at 38° angle. Recommend 5.0 m/s for safety margin..."
Collision Detection
- Multi-robot coordination
- Object catching/throwing
- Assembly line optimization
Physics Simulations for ML Training Data
# Generate thousands of collision scenarios for ML model training
for i in range(10000):
result = await check_collision(random_params())
training_data.append({
'features': params,
'label': result.will_collide,
'impact_time': result.collision_time
})Use Cases:
- Generate labeled physics data for ML models
- Validate physics-informed neural networks
- Test scientific hypotheses with rapid iteration
- Monte Carlo simulations (vary parameters, aggregate results)
1. User: "I'm 2m tall shooting from free-throw line (4.6m). Basket is 3.05m high.
What's the minimum velocity needed?"
2. LLM calls calculate_projectile_motion with varying velocities
- Try v=5 m/s → doesn't reach
- Try v=7 m/s → reaches
- Binary search finds minimum: v=6.2 m/s at 52° angle
3. LLM: "Minimum velocity is 6.2 m/s at 52° launch angle.
For comfortable margin, use 7.0 m/s (typical free throw speed).
Here's the trajectory visualization..."
1. User: "Analyze accident: Car A (1500kg) skid marks 30m, Car B (1200kg) skid marks 25m.
Coefficient of friction 0.7. What were impact speeds?"
2. LLM:
- Calculates deceleration from friction: a = μg = 0.7 × 9.81 = 6.87 m/s²
- Uses v² = 2ad to find velocities
- Calls calculate_kinetic_energy for both cars
- Calls calculate_momentum for momentum analysis
3. LLM: "Car A impact speed: ~20.3 m/s (45 mph), Car B: ~18.5 m/s (41 mph).
Total kinetic energy at impact: 513,000 J. Here's the force analysis..."
1. User: "Create a Rube Goldberg machine: ball rolls down ramp, hits dominos,
dominos knock ball into basket"
2. LLM:
- Calls create_simulation(gravity_y=-9.81)
- Adds ground plane (static)
- Adds ramp (static, angled)
- Adds ball (dynamic, sphere, position at ramp top)
- Adds 10 dominos (dynamic boxes in a line)
- Adds basket (static)
- Calls step_simulation(steps=1000)
- Analyzes contacts to verify chain reaction
- Calls record_trajectory for each piece
3. LLM: "Simulation complete! Ball triggers all dominos successfully.
Here are the trajectories for R3F visualization.
Domino #3 falls at t=1.2s, domino #7 at t=2.1s..."
1. User: "Satellite A: position (6700km, 0, 0), velocity (0, 7.5km/s, 0)
Satellite B: position (6650km, 50km, 0), velocity (0, 7.6km/s, 0.1km/s)
Collision risk?"
2. LLM:
- Calls check_collision with satellite data
- Analyzes closest approach
3. LLM: "No collision. Closest approach: 48.3 km at t=412 seconds.
Satellites are in similar orbits but safe separation.
Recommend: monitor as orbits may precess over time."
function PhysicsAnimation() {
const [trajectory, setTrajectory] = useState([]);
useEffect(() => {
// LLM generated this trajectory data via MCP
fetch('/api/mcp/record_trajectory', {
body: JSON.stringify({
sim_id: "sim_xyz",
body_id: "ball",
steps: 300
})
}).then(res => setTrajectory(res.frames));
}, []);
return (
<Canvas>
<AnimatedBall trajectory={trajectory} />
<Ground />
</Canvas>
);
}
function AnimatedBall({ trajectory }) {
const ref = useRef();
useFrame((state) => {
const t = state.clock.getElapsedTime();
const frame = trajectory[Math.floor(t / 0.016) % trajectory.length];
if (frame && ref.current) {
ref.current.position.fromArray(frame.position);
ref.current.quaternion.fromArray(frame.orientation);
}
});
return (
<mesh ref={ref}>
<sphereGeometry args={[0.5]} />
<meshStandardMaterial color="orange" />
</mesh>
);
}All trajectory recordings follow a canonical schema for maximum interoperability with R3F, Remotion, Three.js, and other animation systems.
interface Trajectory {
dt: number; // Time step between frames (seconds)
frames: Frame[]; // Ordered list of frames
meta: {
body_id: string; // Fully qualified: "rapier://sim-123/body-1"
total_time: number; // Total duration (seconds)
num_frames: number; // Frame count
};
}
interface Frame {
t: number; // Absolute time (seconds)
position: [number, number, number]; // [x, y, z] in meters
rotation: [number, number, number, number]; // Quaternion [x, y, z, w]
velocity?: [number, number, number]; // Optional: linear velocity (m/s)
angular_velocity?: [number, number, number]; // Optional: angular velocity (rad/s)
}{
"dt": 0.016,
"frames": [
{
"t": 0.0,
"position": [0, 1, 0],
"rotation": [0, 0, 0, 1],
"velocity": [0, 0, 0]
},
{
"t": 0.016,
"position": [0.1, 1.01, 0],
"rotation": [0, 0.01, 0, 0.9999],
"velocity": [6.25, 0.61, 0]
}
],
"meta": {
"body_id": "rapier://sim-abc123/ball",
"total_time": 4.8,
"num_frames": 300
}
}import { useRef } from "react";
import { useFrame } from "@react-three/fiber";
function AnimatedObject({ trajectory }) {
const ref = useRef();
useFrame((state) => {
const elapsed = state.clock.getElapsedTime();
const frameIdx = Math.floor(elapsed / trajectory.dt);
const frame = trajectory.frames[frameIdx % trajectory.frames.length];
if (frame && ref.current) {
ref.current.position.fromArray(frame.position);
ref.current.quaternion.fromArray(frame.rotation);
}
});
return (
<mesh ref={ref}>
<sphereGeometry args={[0.5]} />
<meshStandardMaterial color="orange" />
</mesh>
);
}import { useCurrentFrame } from "remotion";
import { ThreeCanvas } from "@remotion/three";
export const PhysicsAnimation = ({ trajectory }) => {
const frame = useCurrentFrame();
const frameData = trajectory.frames[frame];
return (
<AbsoluteFill>
<ThreeCanvas>
<mesh position={frameData.position}>
<sphereGeometry />
</mesh>
</ThreeCanvas>
</AbsoluteFill>
);
};- Quaternions for rotation: More compact and interpolation-friendly than Euler angles
- Absolute time: Each frame has absolute time
t, making scrubbing easier - Constant dt: Frames are evenly spaced, simplifying playback
- Optional velocities: Include if needed for motion blur or physics visualization
- Qualified body_id: Format is
rapier://sim-{id}/{body_id}for traceability
- Python 3.11+
- For simulations: Rapier service (see RAPIER_SERVICE.md)
- Public service available at: https://rapier.chukai.io
- Or run locally with Docker (see below)
The fastest way to try chuk-mcp-physics without installation:
# Run directly with uvx (no installation needed)
uvx chuk-mcp-physics
# With environment variables
uvx --with chuk-mcp-physics chuk-mcp-physics# Install globally
pip install chuk-mcp-physics
# Or with pipx (isolated environment)
pipx install chuk-mcp-physics
# Run the server
chuk-mcp-physics
# Or via python module
python -m chuk_mcp_physics.server# Clone repository (from your source location)
cd chuk-mcp-physics
# Install in development mode
make dev-install
# Run the server
chuk-mcp-physicsAdd to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"physics": {
"command": "uvx",
"args": ["chuk-mcp-physics"],
"env": {
"PHYSICS_PROVIDER": "rapier",
"RAPIER_SERVICE_URL": "https://rapier.chukai.io"
}
}
}
}{
"mcpServers": {
"physics": {
"command": "python",
"args": ["-m", "chuk_mcp_physics.server"],
"env": {
"PHYSICS_PROVIDER": "rapier",
"RAPIER_SERVICE_URL": "https://rapier.chukai.io"
}
}
}
}{
"mcpServers": {
"physics": {
"command": "uvx",
"args": ["chuk-mcp-physics"],
"env": {
"PHYSICS_PROVIDER": "analytic"
}
}
}
}Tools are organized into two tiers to help you choose the right abstraction:
Best for: Quick calculations, education, simple scenarios
Direct formula-based calculations that return instant results:
| Tool | What It Does | Example Use Case |
|---|---|---|
calculate_projectile_motion |
Ballistic trajectory using kinematic equations | "How far does a cannonball go?" |
check_collision |
Predict if two spheres will collide | "Will these asteroids hit?" |
calculate_force |
F = ma calculations | "What force accelerates this car?" |
calculate_kinetic_energy |
KE = ½mv² | "How much energy in this crash?" |
calculate_momentum |
p = mv | "What's the momentum transfer?" |
calculate_potential_energy |
PE = mgh | "What's the energy at height?" |
calculate_work_power |
Work (F·d) and power (W/t) | "How much work lifting this box?" |
calculate_elastic_collision |
1D elastic collision (conserves energy & momentum) | "Pool balls colliding?" |
calculate_drag_force |
Air/water resistance (F = ½ρv²C_dA) | "What's the drag on this car?" |
calculate_buoyancy |
Will it float? (Archimedes) | "Does a steel ball float in water?" |
calculate_terminal_velocity |
Maximum fall speed | "How fast does a skydiver fall?" |
simulate_underwater_motion |
Underwater trajectory with drag & buoyancy | "How far does a torpedo travel?" |
Characteristics:
- ⚡ Instant execution (< 1ms)
- 📦 No external dependencies
- 🎯 Exact mathematical solutions
- ✅ Always available (no service required)
Limitations:
- Only spherical objects (for collisions)
- No complex shapes
- No multi-body interactions
- No friction or material properties
Best for: Complex physics, multi-body dynamics, visualization data
Low-level building blocks for rigid-body simulations:
| Tool | What It Does | When to Use |
|---|---|---|
create_simulation |
Initialize physics world | Start any simulation |
add_rigid_body |
Add objects (box, sphere, capsule, etc.) | Build scene |
step_simulation |
Advance time | Run physics |
record_trajectory |
Capture motion for R3F/Remotion | Generate animation data |
destroy_simulation |
Cleanup resources | End simulation |
Characteristics:
- 🦀 Requires Rapier service
- 🔄 Stateful (track simulation ID)
- 🧩 Composable (combine for complex scenarios)
- 💪 Full rigid-body dynamics
Typical workflow:
# 1. Create world
sim = create_simulation(gravity_y=-9.81)
# 2. Add objects
add_rigid_body(sim.sim_id, "ground", type="static", shape="plane")
add_rigid_body(sim.sim_id, "ball", type="dynamic", shape="sphere",
radius=0.5, position=[0, 5, 0])
# 3. Run simulation
step_simulation(sim.sim_id, steps=300)
# 4. Record for visualization
trajectory = record_trajectory(sim.sim_id, "ball", steps=300)
# 5. Cleanup
destroy_simulation(sim.sim_id)| Tool | Purpose | Example |
|---|---|---|
calculate_projectile_motion |
Ballistic trajectories | "How far does a cannonball travel?" |
check_collision |
Predict sphere collisions | "Will these asteroids hit?" |
calculate_force |
F = ma calculations | "What force accelerates this car?" |
calculate_kinetic_energy |
KE = ½mv² | "Energy in moving object?" |
calculate_momentum |
p = mv | "Momentum of moving object?" |
calculate_potential_energy |
PE = mgh | "Energy at height?" |
calculate_work_power |
Work (F·d) and power (W/t) | "Work done lifting object?" |
calculate_elastic_collision |
1D elastic collision | "Pool ball velocities after impact?" |
| Tool | Purpose | Example |
|---|---|---|
calculate_drag_force |
Air/water resistance | "Drag on car at speed?" |
calculate_buoyancy |
Will it float? (Archimedes) | "Does steel ball float?" |
calculate_terminal_velocity |
Maximum fall speed | "Skydiver terminal velocity?" |
simulate_underwater_motion |
Underwater trajectory | "How far does torpedo travel?" |
calculate_lift_force |
Aerodynamic lift | "Lift on aircraft wing?" |
calculate_magnus_force |
Force on spinning ball | "Why does curveball curve?" |
calculate_bernoulli |
Pressure in flowing fluid | "Pressure in pipe constriction?" |
calculate_pressure_at_depth |
Hydrostatic pressure | "Pressure at 30m depth?" |
calculate_reynolds_number |
Flow regime classification | "Is flow turbulent?" |
calculate_venturi_effect |
Flow through constriction | "Velocity in throat?" |
| Tool | Purpose | Example |
|---|---|---|
calculate_torque |
τ = r × F (cross product) | "Torque from wrench?" |
calculate_moment_of_inertia |
Rotational inertia | "MOI of spinning disk?" |
calculate_angular_momentum |
L = Iω | "Angular momentum of wheel?" |
calculate_rotational_kinetic_energy |
Rotational KE = ½Iω² | "Energy in flywheel?" |
calculate_angular_acceleration |
α = τ/I | "How fast does it spin up?" |
| Tool | Purpose | Example |
|---|---|---|
calculate_hookes_law |
Spring force F = -kx | "Force in compressed spring?" |
calculate_spring_mass_period |
Oscillation period | "How fast does mass oscillate?" |
calculate_simple_harmonic_motion |
Position at time t | "Where is mass at t=2s?" |
calculate_damped_oscillation |
Motion with damping | "How quickly does it settle?" |
calculate_pendulum_period |
Pendulum swing time | "Period of 1m pendulum?" |
| Tool | Purpose | Example |
|---|---|---|
calculate_centripetal_force |
F_c = mv²/r | "Force for circular motion?" |
calculate_orbital_period |
Kepler's 3rd law | "Satellite orbital period?" |
calculate_banking_angle |
Optimal curve angle | "Banking for highway curve?" |
calculate_escape_velocity |
Escape from gravity | "Earth escape velocity?" |
analyze_circular_orbit |
Complete orbital analysis | "Analyze ISS orbit?" |
| Tool | Purpose | Example |
|---|---|---|
check_force_balance |
Verify ΣF = 0 | "Are forces balanced?" |
check_torque_balance |
Verify Στ = 0 | "Will seesaw balance?" |
calculate_center_of_mass |
Balance point | "Where is center of mass?" |
calculate_static_friction |
Max friction force | "Will object slip?" |
calculate_normal_force |
Force on incline | "Normal force on ramp?" |
check_equilibrium |
Force + torque balance | "Is structure stable?" |
calculate_beam_reactions |
Support forces | "Reaction forces on beam?" |
| Tool | Purpose | Example |
|---|---|---|
calculate_acceleration_from_position |
Derive from position data | "Acceleration from motion capture?" |
calculate_jerk |
Rate of acceleration change | "How jerky is motion?" |
fit_trajectory |
Find trajectory equation | "Fit parabola to data?" |
generate_motion_graph |
Position/velocity/accel graphs | "Generate motion graphs?" |
calculate_average_speed |
Speed along path | "Average speed on route?" |
calculate_instantaneous_velocity |
Velocity at exact time | "Speed at t=2.5s?" |
calculate_projectile_with_drag |
Realistic projectile with air resistance | "How far does baseball actually go?" |
| Tool | Purpose | Example |
|---|---|---|
calculate_elastic_collision_3d |
3D perfect collision | "Pool balls in 3D?" |
calculate_inelastic_collision_3d |
3D collision with energy loss | "Car crash analysis?" |
| Tool | Purpose | Example |
|---|---|---|
check_energy_conservation |
Verify energy conserved | "Is collision realistic?" |
check_momentum_conservation |
Verify momentum conserved | "Is momentum preserved?" |
check_angular_momentum_conservation |
Verify L conserved | "Is rotation valid?" |
track_energy_dissipation |
Energy loss over time | "Where did energy go?" |
| Tool | Purpose | Supported Units |
|---|---|---|
convert_unit |
Convert between units | Velocity: m/s, km/h, mph, ft/s, knots Distance: m, km, mi, ft, yd, in Mass: kg, g, lb, oz Force: N, kN, lbf Energy: J, kJ, cal, BTU, kWh Power: W, kW, hp Temperature: K, C, F Angle: rad, deg Pressure: Pa, kPa, bar, psi, atm Area: m², km², ft², acre Volume: m³, L, gal, ft³ Time: s, min, hr, day Acceleration: m/s², g, ft/s² Torque: N·m, lb·ft, lb·in Frequency: Hz, kHz, MHz, GHz Data Size: B, KB, MB, GB |
list_unit_conversions |
Get all supported units | Returns complete list of conversions |
Examples:
# Natural language queries work perfectly
"Convert 60 mph to m/s" # → 26.82 m/s
"How fast is 100 km/h in mph?" # → 62.14 mph
"What's 10 kg in pounds?" # → 22.05 lb
"Convert 100 feet to meters" # → 30.48 m
"What's 98.6°F in Celsius?" # → 37°C
"Convert 3 g-force to m/s²" # → 29.42 m/s²
"What's 300 N·m in lb·ft?" # → 221.27 lb·ft
"Convert 1 hour to seconds" # → 3600 sFeatures:
- ⚡ Instant conversions (no external service needed)
- 🔄 Automatic indirect conversions (e.g., mph → km/h via m/s)
- 📐 70+ unit types across 16 categories
- 🎯 Perfect for natural language physics queries
- 🚀 Includes engineering units (torque, acceleration, frequency)
For use with calculate_projectile_with_drag tool:
| Object | Drag Coefficient (Cd) | Notes |
|---|---|---|
| Sports Balls | ||
| Baseball | 0.4 | Stitched surface |
| Golf ball (dimpled) | 0.25 | Dimples reduce drag by ~50% |
| Golf ball (smooth) | 0.47 | Without dimples (don't use!) |
| Basketball | 0.55 | Large, textured surface |
| Soccer ball | 0.25 | Modern, smooth panels |
| Tennis ball | 0.55 | Fuzzy surface |
| Football (American) | 0.05-0.15 | Highly streamlined, orientation-dependent |
| Generic Shapes | ||
| Sphere (smooth) | 0.47 | Default reference |
| Flat plate (perpendicular) | 1.28 | Maximum drag |
| Streamlined body | 0.04 | Teardrop/airfoil |
| Cylinder (perpendicular) | 1.15 | Like a pole |
| Vehicles | ||
| Car (modern) | 0.25-0.35 | Aerodynamic design |
| Truck | 0.6-0.9 | Boxy shape |
| Bicycle + rider | 0.9 | Upright position |
| Human Body | ||
| Skydiver (belly-down) | 1.0-1.3 | Maximum drag |
| Skydiver (head-down) | 0.7 | Streamlined |
| Projectiles | ||
| Bullet (supersonic) | 0.295 | Pointed nose |
| Artillery shell | 0.15-0.25 | Streamlined |
Basic Usage Example:
# Baseball pitch with realistic drag
result = await calculate_projectile_with_drag(
initial_velocity=40.23, # 90 mph
angle_degrees=10,
mass=0.145,
cross_sectional_area=0.0043, # π × (0.037m)²
drag_coefficient=0.4 # Baseball Cd
)The calculate_projectile_with_drag tool supports optional enhancements for ultra-realistic simulations:
Spin creates a pressure differential that deflects the ball's path. Essential for:
- Baseball: Curveballs (topspin drops), fastballs (backspin lifts)
- Golf: Backspin increases carry, sidespin causes slices/hooks
- Soccer: Bending free kicks around defensive walls
- Tennis: Topspin brings ball down faster
# Baseball curveball with topspin
result = await calculate_projectile_with_drag(
initial_velocity=35,
angle_degrees=0,
mass=0.145,
cross_sectional_area=0.0043,
drag_coefficient=0.4,
spin_rate=261.8, # 2500 rpm = 261.8 rad/s
spin_axis=[0, 0, -1] # Topspin (negative z-axis)
)
# Returns lateral_deflection and magnus_force_maxSpin Parameters:
spin_rate: Rotation speed in rad/s (convert from RPM: rpm × 2π/60)spin_axis: Unit vector [x, y, z] indicating spin direction[0, 0, 1]= Backspin (lifts)[0, 0, -1]= Topspin (drops)[0, 1, 0]= Sidespin (hooks/slices)
Constant wind vector affects trajectory throughout flight:
# Soccer free kick with 5 m/s crosswind
result = await calculate_projectile_with_drag(
initial_velocity=28,
angle_degrees=12,
mass=0.43,
cross_sectional_area=0.0388,
drag_coefficient=0.25,
wind_velocity=[5.0, 0.0] # [horizontal, vertical] in m/s
)
# Returns wind_drift showing total deflectionWind Types:
- Tailwind:
[+X, 0]- increases range - Headwind:
[-X, 0]- decreases range - Crosswind:
[X, 0]- lateral deflection - Updraft:
[0, +Y]- increases height and flight time - Downdraft:
[0, -Y]- decreases height
Air density varies with elevation and temperature, dramatically affecting drag:
# Golf drive in Denver (1600m elevation, 20°C)
result = await calculate_projectile_with_drag(
initial_velocity=70,
angle_degrees=12,
mass=0.0459,
cross_sectional_area=0.00143,
drag_coefficient=0.25,
altitude=1600, # meters above sea level
temperature=20 # Celsius
)
# Returns effective_air_density showing actual density usedReal-World Impact:
- Denver (1600m): ~10% longer drives than sea level
- Hot day (+20°C): ~2-3% less drag than cold day
- Everest Base Camp (5300m): ~50% less air density!
Air Density Formula:
ρ(h,T) = ρ₀ × exp(-Mgh/RT₀) × (T₀/T)
Where:
- ρ₀ = sea level density (1.225 kg/m³)
- h = altitude (meters)
- T = temperature (Kelvin)
- M = molar mass of air (0.029 kg/mol)
- g = gravity (9.81 m/s²)
- R = gas constant (8.314 J/(mol·K))
# Golf ball with ALL effects (spin + wind + altitude)
result = await calculate_projectile_with_drag(
initial_velocity=70,
angle_degrees=12,
mass=0.0459,
cross_sectional_area=0.00143,
drag_coefficient=0.25,
spin_rate=200, # Backspin
spin_axis=[0, 0, 1],
wind_velocity=[3, 0], # Tailwind
altitude=1000, # Moderate elevation
temperature=25 # Warm day
)
# All effects combine for maximum realism!See Examples:
examples/sports_projectiles_with_drag.py- Basic drag effectsexamples/advanced_projectile_effects.py- Magnus force, wind, altitude
For tumbling objects like footballs, frisbees, and javelins, drag varies dramatically based on orientation. A football in a perfect spiral has 3-6× less drag than when tumbling end-over-end!
Available via Rapier rigid-body simulations using the add_rigid_body tool with orientation-dependent drag parameters.
Objects moving through air experience drag that depends on their orientation:
- Football spiral: Streamlined along flight path → low drag (~0.1 Cd)
- Football tumbling: Broadside to airflow → high drag (~0.6 Cd)
- Frisbee flat: Minimal cross-section → low drag (~0.08 Cd)
- Frisbee tilted: Larger cross-section → higher drag
New add_rigid_body Parameters:
drag_coefficient: float # Base Cd value
drag_area: float # Reference cross-sectional area (m²)
drag_axis_ratios: [x, y, z] # Drag variation along body axes
fluid_density: float # Fluid density (air=1.225, water=1000)# Perfect spiral (low drag along Y-axis)
await add_rigid_body(
sim_id,
id="spiral",
shape="capsule",
size=[0.17, 0.28], # diameter, length
mass=0.42,
position=[0, 2, 0],
velocity=[vx, vy, 0],
angular_velocity=[0, 126, 0], # 20 rev/s spin
# Orientation-dependent drag
drag_coefficient=0.1,
drag_area=0.023, # End-on area
drag_axis_ratios=[1.0, 0.2, 1.0], # 5× less drag along Y
fluid_density=1.225
)
# Tumbling (higher drag, averaging all orientations)
await add_rigid_body(
sim_id,
id="tumble",
shape="capsule",
size=[0.17, 0.28],
mass=0.42,
position=[0, 2, 0],
velocity=[vx, vy, 0],
angular_velocity=[31.4, 0, 0], # Tumbling rotation
# Orientation-dependent drag
drag_coefficient=0.6, # Higher base Cd
drag_area=0.048, # Broadside area
drag_axis_ratios=[0.8, 1.0, 0.8], # Less streamlining
fluid_density=1.225
)Result: Spiral can travel 20-40% farther than tumble!
The drag_axis_ratios parameter specifies how drag varies along each body-local axis [X, Y, Z]:
| Object | Ratios | Streamlined Axis | Use Case |
|---|---|---|---|
| Football spiral | [1.0, 0.2, 1.0] |
Y (length) | Perfect pass |
| Javelin | [1.5, 0.2, 1.5] |
Y (length) | Optimal flight |
| Frisbee flat | [1.0, 0.1, 1.0] |
Y (vertical) | Stable throw |
| Sphere | [1.0, 1.0, 1.0] |
None | Basketball, etc. |
| Disc tumbling | [0.8, 1.0, 0.8] |
Less variation | Wobbly throw |
Physical Meaning:
0.2= 20% of base drag along that axis (very streamlined)1.0= 100% of base drag (normal)1.5= 150% of base drag (higher resistance)
⚽ Football Throw (spiral vs tumble):
# Spiral: 45-50 yards typical
# Tumble: 30-35 yards (30-40% loss)🥏 Frisbee (stable vs wobbling):
# Stable (600 rpm spin): 60-80 meters
# Wobbling (slow spin): 30-40 meters (50% loss)🏹 Javelin (optimal vs poor technique):
# Optimal angle: 70-90 meters (Olympic level)
# Poor release: 40-50 meters (45% loss)🎯 When to Use:
- Sports simulations (football, frisbee, discus)
- Projectile accuracy (javelin, arrows, darts)
- Aerospace applications (rocket tumbling, debris)
🔬 Physics: The drag force is calculated in the Rapier service using the body's current orientation (quaternion) to transform body-local drag coefficients into world-space drag forces.
Hybrid Drag Implementation: Rapier uses a hybrid approach to handle extreme drag cases:
- Normal drag (ratio < 2.0): Force-based orientation-dependent drag with full anisotropic behavior
- Extreme drag (ratio ≥ 2.0): Damping-based drag for stability when drag-to-weight ratio is very high
- Automatically activates for objects like ping pong balls (high drag, low mass)
- Prevents numerical instabilities while maintaining realistic energy dissipation
- Logged as INFO when triggered:
"Body 'name' has extreme drag (ratio=X.XX), using damping"
Where drag_ratio = 0.5 * fluid_density * drag_coefficient * drag_area * v_typical^2 / (mass * g)
Measurement Notes:
When analyzing trajectories, use max(x_positions) instead of final_x to measure range. Rapier's solver may occasionally jitter backward slightly near ground impact, but this is a measurement artifact, not a physics error. The drag forces always oppose motion correctly.
See Example:
examples/tumbling_projectiles.py- Football, frisbee, and javelin orientation effects
All Phase 1 features are complete, tested (98% coverage), and deployed to production!
Automatically detect and analyze bounces in ball trajectories with energy loss calculations.
What it does:
- Detects bounce events from trajectory data (velocity reversals near ground)
- Calculates energy loss percentage for each bounce
- Provides before/after velocities and heights
- Perfect for answering "how many bounces?" and "when does it stop?"
Tool: record_trajectory_with_events
Example:
# Record a bouncing ball
traj = await record_trajectory_with_events(
sim_id=sim_id,
body_id="ball",
steps=300,
detect_bounces=True,
bounce_height_threshold=0.01 # 1cm = "on ground"
)
print(f"Detected {len(traj.bounces)} bounces")
for bounce in traj.bounces:
print(f"Bounce #{bounce.bounce_number}:")
print(f" Time: {bounce.time:.2f}s")
print(f" Height: {bounce.height_at_bounce:.3f}m")
print(f" Energy loss: {bounce.energy_loss_percent:.1f}%")
print(f" Speed before: {bounce.speed_before:.2f} m/s")
print(f" Speed after: {bounce.speed_after:.2f} m/s")Output:
Detected 5 bounces
Bounce #1: Time: 1.43s, Height: 0.00m, Energy loss: 36.0%, Speed: 14.0→9.0 m/s
Bounce #2: Time: 2.51s, Height: 0.00m, Energy loss: 36.0%, Speed: 8.9→5.7 m/s
Bounce #3: Time: 3.23s, Height: 0.00m, Energy loss: 36.0%, Speed: 5.7→3.6 m/s
...
Use Cases:
- Sports analytics (basketball arc, tennis serve bounces)
- Product testing (phone drop tests, durability simulations)
- Game development (realistic ball physics)
- Education (demonstrate energy conservation)
See: examples/06_bounce_detection.py for full demo
Real-time collision tracking with detailed contact information from the physics engine.
What it does:
- Tracks all contact events between bodies during simulation
- Reports contact start, ongoing, and end events
- Provides impulse magnitudes, normals, and relative velocities
- Essential for collision analysis and force calculations
Included in: All trajectory recordings (record_trajectory, record_trajectory_with_events)
Contact Event Data:
ContactEvent(
time=1.43, # When contact occurred
body_a="ball", # First body
body_b="ground", # Second body
contact_point=[0.0, 0.05, 0.0], # World space position
normal=[0.0, 1.0, 0.0], # Contact normal (from A to B)
impulse_magnitude=14.2, # Collision impulse (N⋅s)
relative_velocity=[0.0, -14.0, 0.0], # Relative velocity
event_type="started" # "started", "ongoing", or "ended"
)Example:
traj = await record_trajectory(sim_id, "ball", steps=300)
# Analyze contacts
for event in traj.contact_events:
if event.event_type == "started":
print(f"Collision at t={event.time:.2f}s")
print(f" Bodies: {event.body_a} ↔ {event.body_b}")
print(f" Impulse: {event.impulse_magnitude:.1f} N⋅s")
print(f" Impact speed: {abs(event.relative_velocity[1]):.1f} m/s")Use Cases:
- Collision analysis (car crashes, sports impacts)
- Force calculations (derive forces from impulses)
- Interaction tracking (which objects touched what)
- VFX triggers (spark effects on collisions)
See: examples/07_contact_events.py for full demo
Connect rigid bodies with realistic joints for complex mechanical systems.
What it does:
- Create constraints between bodies (hinges, sliders, ball-and-socket, fixed)
- Build complex systems (pendulums, chains, ragdolls, machinery)
- Realistic mechanical motion (doors, wheels, linkages)
- Perfect for simulating articulated structures
Tool: add_joint
Joint Types:
| Type | Description | Example Uses |
|---|---|---|
| FIXED | Rigid connection (glue) | Attach hat to head, weld joints |
| REVOLUTE | Hinge rotation around axis | Doors, pendulums, wheels |
| SPHERICAL | Ball-and-socket rotation | Ragdoll shoulders, gimbal mounts |
| PRISMATIC | Sliding along axis | Pistons, elevators, sliders |
Example - Simple Pendulum:
# Create anchor point
await add_rigid_body(
sim_id=sim_id,
body_id="anchor",
body_type="static",
shape="sphere",
size=[0.05],
position=[0.0, 3.0, 0.0]
)
# Create pendulum bob
await add_rigid_body(
sim_id=sim_id,
body_id="bob",
body_type="dynamic",
shape="sphere",
size=[0.2],
mass=1.0,
position=[1.5, 1.5, 0.0] # Start displaced
)
# Connect with revolute joint (hinge)
await add_joint(
sim_id=sim_id,
joint=JointDefinition(
id="hinge",
joint_type=JointType.REVOLUTE,
body_a="anchor",
body_b="bob",
anchor_a=[0.0, 0.0, 0.0], # Center of anchor
anchor_b=[0.0, 0.2, 0.0], # Top of bob
axis=[0.0, 0.0, 1.0] # Rotate around Z-axis
)
)
# Simulate and see realistic pendulum motion!
traj = await record_trajectory(sim_id, "bob", steps=300)Example - Multi-Link Chain:
# Create anchor
await add_rigid_body(sim_id, "anchor", body_type="static", ...)
# Create 3 chain links
for i in range(3):
await add_rigid_body(
sim_id,
f"link{i}",
body_type="dynamic",
shape="box",
size=[0.1, 0.4, 0.1],
position=[0.0, 2.5 - i*0.5, 0.0]
)
# Connect with spherical joints (ball-and-socket)
await add_joint(sim_id, JointDefinition(
id="joint0",
joint_type=JointType.SPHERICAL,
body_a="anchor",
body_b="link0",
anchor_a=[0.0, 0.0, 0.0],
anchor_b=[0.0, 0.2, 0.0]
))
await add_joint(sim_id, JointDefinition(
id="joint1",
joint_type=JointType.SPHERICAL,
body_a="link0",
body_b="link1",
anchor_a=[0.0, -0.2, 0.0],
anchor_b=[0.0, 0.2, 0.0]
))
# ... and so onUse Cases:
- Mechanical systems (engines, gears, levers)
- Character animation (ragdolls, inverse kinematics)
- Vehicle suspension (wheels, shocks)
- Architectural simulations (doors, drawbridges)
See: examples/08_pendulum.py for full demo
Realistic energy dissipation through linear and angular damping.
What it does:
- Simulates air resistance (linear damping)
- Simulates rotational friction (angular damping)
- Makes simulations more realistic and stable
- Perfect for settling physics and reducing "floaty" motion
Parameters: Added to add_rigid_body tool
Damping Parameters:
await add_rigid_body(
sim_id=sim_id,
body_id="damped_ball",
body_type="dynamic",
shape="sphere",
size=[0.5],
mass=1.0,
position=[0.0, 5.0, 0.0],
# Phase 1.4: Damping
linear_damping=0.5, # 0.0 (none) to 1.0 (high) - like air resistance
angular_damping=0.3 # 0.0 (none) to 1.0 (high) - like rotational friction
)Effect of Linear Damping:
0.0= No air resistance (vacuum physics)0.1-0.3= Light damping (tennis ball in air)0.5-0.7= Moderate damping (underwater motion)0.9+= Heavy damping (very viscous fluid)
Effect of Angular Damping:
0.0= Spins forever (vacuum)0.1-0.3= Realistic friction (rolling ball)0.5-0.7= High friction (rough surface)0.9+= Almost no rotation (sticky surface)
Comparison:
# Without damping - bounces forever
await add_rigid_body(..., linear_damping=0.0)
# Result: Ball bounces 20+ times, takes 30+ seconds to settle
# With damping - realistic settling
await add_rigid_body(..., linear_damping=0.5)
# Result: Ball bounces 5 times, settles in ~5 secondsUse Cases:
- Realistic object motion (not "floaty" game physics)
- Faster settling (less simulation time needed)
- Underwater simulations (high damping)
- Space simulations (zero damping)
See: examples/09_phase1_complete.py for all Phase 1 features combined
Analytical fluid calculations for drag, buoyancy, and underwater motion.
What it does:
- Calculates drag forces (quadratic air/water resistance)
- Computes buoyancy using Archimedes' principle
- Determines terminal velocity for falling objects
- Simulates underwater projectile motion with drag and buoyancy
Tools Available:
Calculate the force opposing motion through a fluid.
# Ball falling through water
result = await calculate_drag_force(
velocity=[0, -5.0, 0], # 5 m/s downward
cross_sectional_area=0.00785, # π*r² for 10cm diameter
fluid_density=1000, # water (air=1.225)
drag_coefficient=0.47, # sphere (streamlined=0.04)
viscosity=1.002e-3 # optional: water viscosity for accurate Re
)
print(f"Drag force: {result['magnitude']:.1f} N (upward)")
print(f"Reynolds number: {result['reynolds_number']:.0f}")Common drag coefficients:
- Sphere: 0.47
- Streamlined (torpedo): 0.04
- Flat plate: 1.28
- Human (standing): 1.0-1.3
- Car: 0.25-0.35
Optional viscosity parameter (for accurate Reynolds number):
- Water at 20°C:
1.002e-3Pa·s - Air at 20°C:
1.825e-5Pa·s - Motor oil:
0.1Pa·s - If omitted, estimated from density (water-like if >100 kg/m³, else air-like)
Determine buoyant force and whether objects float or sink.
# Check if 1kg steel ball floats
volume = (4/3) * π * (0.05)**3 # 10cm diameter sphere
result = await calculate_buoyancy(
volume=0.000524, # m³
fluid_density=1000 # water
)
weight = 1.0 * 9.81 # 9.81 N
buoyancy = result['buoyant_force'] # 5.14 N
# weight > buoyancy → SINKSCalculate the speed where drag equals weight.
# Skydiver terminal velocity
result = await calculate_terminal_velocity(
mass=70, # kg
cross_sectional_area=0.7, # m² (belly-down)
fluid_density=1.225, # air
drag_coefficient=1.0 # human
)
print(f"Terminal velocity: {result['terminal_velocity']:.1f} m/s")
# Result: ~40 m/s (90 mph)
print(f"Time to 95%: {result['time_to_95_percent']:.1f}s")Simulate motion through fluids with drag and buoyancy forces.
# Torpedo launched underwater
result = await simulate_underwater_motion(
initial_velocity=[20, 0, 0], # 20 m/s forward
mass=100, # kg
volume=0.05, # m³
cross_sectional_area=0.03, # m²
fluid_density=1000, # water
drag_coefficient=0.04, # streamlined
duration=30.0
)
print(f"Distance traveled: {result['total_distance']:.1f}m")
print(f"Final velocity: {result['final_velocity']}")
print(f"Max depth: {result['max_depth']:.1f}m")Use Cases:
- Marine engineering: Torpedo trajectories, submarine drag
- Aerospace: Skydiving, parachute descent, atmospheric re-entry
- Sports: Swimming, diving, underwater ballistics
- Product design: Drag optimization, floatation devices
- Environmental: Particle settling, pollutant dispersion
Physics Models:
- Quadratic drag: F_drag = 0.5 * ρ * v² * C_d * A
- Buoyancy: F_b = ρ_fluid * V * g (Archimedes)
- Terminal velocity: v_t = √(2mg / ρC_dA)
- Numerical integration for complex underwater motion
See: examples/10_fluid_dynamics.py for comprehensive demonstrations
Status: ✅ All features production-ready
| Feature | Status | Tool | Coverage |
|---|---|---|---|
| Bounce Detection | ✅ Shipped | record_trajectory_with_events |
100% |
| Contact Events | ✅ Shipped | All trajectory tools | 100% |
| Joints & Constraints | ✅ Shipped | add_joint |
100% |
| Damping Controls | ✅ Shipped | add_rigid_body |
100% |
| Fluid Dynamics | ✅ Shipped | calculate_drag_force, calculate_buoyancy, calculate_terminal_velocity, simulate_underwater_motion |
100% |
Test Coverage: 98% (350 tests passing)
Deployment:
- 🌐 MCP Server: https://physics.chukai.io/mcp
- 🦀 Rapier Service: https://rapier.chukai.io
Examples: See examples/06_bounce_detection.py through examples/10_fluid_dynamics.py
All Phase 2 features are complete, tested (98% coverage), and deployed to production!
Complete rotational motion calculations including torque, moment of inertia, angular momentum, and rotational kinetic energy.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
calculate_torque |
Calculate torque from force and position (τ = r × F) | "What torque does this wrench apply?" |
calculate_moment_of_inertia |
Moment of inertia for common shapes (disk, sphere, rod, etc.) | "What's the rotational inertia?" |
calculate_angular_momentum |
Angular momentum (L = Iω) | "How much rotational momentum?" |
calculate_rotational_kinetic_energy |
Rotational KE (½Iω²) | "Energy in spinning flywheel?" |
calculate_angular_acceleration |
Angular acceleration (α = τ/I) | "How fast does it spin up?" |
Example - Calculate Torque:
result = await calculate_torque(
force_x=50.0,
force_y=0.0,
force_z=0.0,
position_x=0.0,
position_y=0.0,
position_z=0.8 # 80cm wrench
)
# torque magnitude = 40 N⋅mUse Cases:
- Mechanical engineering (gear systems, engines)
- Robotics (joint torques, motor sizing)
- Sports science (bat swings, golf clubs)
- Aerospace (satellite attitude control)
Harmonic motion and spring systems with damping effects.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
calculate_hookes_law |
Spring force and potential energy (F = -kx) | "How much force in compressed spring?" |
calculate_spring_mass_period |
Period and frequency of spring-mass system | "How fast does it oscillate?" |
calculate_simple_harmonic_motion |
Position, velocity, acceleration at time t | "Where is the mass at t=2s?" |
calculate_damped_oscillation |
Damped harmonic motion (underdamped, critically damped, overdamped) | "How quickly does it settle?" |
calculate_pendulum_period |
Period of simple pendulum | "How long is one swing?" |
Example - Spring-Mass System:
result = await calculate_spring_mass_period(
mass=0.5, # 500g mass
spring_constant=20.0 # N/m
)
# period ≈ 0.99s, frequency ≈ 1.01 HzUse Cases:
- Mechanical design (suspension systems, vibration isolation)
- Seismology (earthquake oscillations)
- Electronics (LC circuits, resonance)
- Horology (pendulum clocks)
Circular motion, orbital mechanics, and centripetal forces.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
calculate_centripetal_force |
Force required for circular motion | "What force keeps car on curve?" |
calculate_orbital_period |
Period and velocity for circular orbit | "How long is satellite orbit?" |
calculate_banking_angle |
Optimal banking for curved road | "What angle for this turn?" |
calculate_escape_velocity |
Minimum velocity to escape gravity | "Can rocket escape Earth?" |
analyze_circular_orbit |
Complete orbital analysis (altitude, period, velocity) | "Analyze ISS orbit" |
Example - Satellite Orbit:
result = await analyze_circular_orbit(
altitude=400000.0, # 400 km above surface
planet_mass=5.972e24, # Earth mass
planet_radius=6.371e6 # Earth radius
)
# orbital_velocity ≈ 7670 m/s
# period ≈ 5530 seconds (92 minutes)Use Cases:
- Space missions (orbital calculations, satellite deployment)
- Astrophysics (planetary motion, binary stars)
- Transportation (highway curve design)
- Amusement parks (loop-the-loop, centrifuges)
3D collision calculations with elastic and inelastic collisions.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
calculate_elastic_collision_3d |
3D elastic collision (energy conserved) | "Pool ball collisions in 3D" |
calculate_inelastic_collision_3d |
3D inelastic collision with restitution | "Car crash with energy loss" |
Example - Car Crash:
result = await calculate_inelastic_collision_3d(
mass1=1500.0,
velocity1=[20.0, 0.0, 0.0],
mass2=1200.0,
velocity2=[-15.0, 0.0, 0.0],
coefficient_of_restitution=0.0 # Perfectly inelastic
)
# final_velocity1 = [1.11, 0, 0]
# final_velocity2 = [1.11, 0, 0] # Stick together
# energy_loss > 0 (deformation energy)Verify and track conservation of energy, momentum, and angular momentum.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
check_energy_conservation |
Verify total energy is conserved | "Is this collision realistic?" |
check_momentum_conservation |
Verify momentum is conserved | "Does this violate physics?" |
check_angular_momentum_conservation |
Verify angular momentum conserved | "Is rotation energy conserved?" |
track_energy_dissipation |
Track energy loss over trajectory | "Where did the energy go?" |
Example - Validate Collision:
result = await check_energy_conservation(
initial_kinetic_energy=100.0,
final_kinetic_energy=50.0,
initial_potential_energy=0.0,
final_potential_energy=50.0
)
# is_conserved = True (100 = 50 + 50)
# energy_difference ≈ 0Static equilibrium analysis for structures and forces.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
check_force_balance |
Verify ΣF = 0 (force equilibrium) | "Are these forces balanced?" |
check_torque_balance |
Verify Στ = 0 (torque equilibrium) | "Will this seesaw balance?" |
calculate_center_of_mass |
Find center of mass for system | "Where is the balance point?" |
calculate_static_friction |
Maximum friction force, will object slip? | "Will box slide down ramp?" |
calculate_normal_force |
Normal force on inclined plane | "What force on ramp?" |
check_equilibrium |
Complete equilibrium check (force + torque) | "Is structure stable?" |
calculate_beam_reactions |
Reaction forces for simply supported beam | "What are support forces?" |
Example - Beam Analysis:
result = await calculate_beam_reactions(
beam_length=10.0,
loads=[1000, 500], # Two point loads
load_positions=[3.0, 7.0] # Positions along beam
)
# reaction_left = 800 N
# reaction_right = 700 N
# is_balanced = TrueUse Cases:
- Structural engineering (bridges, buildings)
- Mechanical design (levers, balances)
- Architecture (load analysis)
- Safety analysis (stability checks)
Analyze motion data to extract velocities, accelerations, and trajectories.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
calculate_acceleration_from_position |
Derive velocity and acceleration from position data | "Analyze motion capture data" |
calculate_jerk |
Calculate jerk (rate of change of acceleration) | "How jerky is this motion?" |
fit_trajectory |
Fit polynomial to trajectory (linear, quadratic, cubic) | "Find trajectory equation" |
generate_motion_graph |
Generate position/velocity/acceleration graphs | "Visualize kinematics" |
calculate_average_speed |
Average speed along path | "What's average speed?" |
calculate_instantaneous_velocity |
Velocity at specific time with interpolation | "Speed at exact moment?" |
Example - Motion Analysis:
result = await calculate_acceleration_from_position(
times=[0, 1, 2, 3, 4],
positions=[[0,0,0], [5,0,0], [10,0,0], [15,0,0], [20,0,0]]
)
# velocities = [[5,0,0], [5,0,0], ...] # Constant 5 m/s
# average_acceleration ≈ [0,0,0] # No accelerationUse Cases:
- Motion capture analysis (sports, biomechanics)
- Robotics (trajectory planning, motion smoothness)
- Autonomous vehicles (trajectory optimization)
- Scientific research (particle tracking)
Extended fluid calculations including lift, Magnus force, Bernoulli, and viscous flow.
Tools Available:
| Tool | Description | Example Use |
|---|---|---|
calculate_lift_force |
Aerodynamic lift (L = ½ρv²C_LA) | "What lift on wing?" |
calculate_magnus_force |
Force on spinning ball | "Why does curveball curve?" |
calculate_bernoulli |
Bernoulli's equation for flowing fluids | "Pressure in pipe constriction?" |
calculate_pressure_at_depth |
Hydrostatic pressure | "Pressure at 30m depth?" |
calculate_reynolds_number |
Flow regime (laminar/turbulent) | "Is flow turbulent?" |
calculate_venturi_effect |
Flow through constriction | "Velocity in throat?" |
Example - Aircraft Wing:
result = await calculate_lift_force(
velocity=70, # m/s (~250 km/h)
wing_area=20.0, # m²
lift_coefficient=1.2,
fluid_density=1.225 # air
)
# lift_force ≈ 73,500 NUse Cases:
- Aerospace engineering (aircraft design, aerodynamics)
- Marine engineering (hull design, submarine motion)
- Sports science (ball trajectories, swimming efficiency)
- HVAC design (airflow optimization)
Status: ✅ All features production-ready
| Feature Area | Tools | Coverage |
|---|---|---|
| Rotational Dynamics | 5 tools | 100% |
| Oscillations | 5 tools | 100% |
| Circular Motion | 5 tools | 100% |
| Advanced Collisions | 2 tools | 100% |
| Conservation Laws | 4 tools | 100% |
| Statics | 7 tools | 100% |
| Kinematics Analysis | 6 tools | 100% |
| Advanced Fluids | 6 tools | 100% |
Total Tools: 79 tools across all categories Test Coverage: 98% overall (350 tests passing)
Next Up: Phase 3 - Performance Optimization & Visualization
- Batch simulation API for ML training data
- Parameter sweep utilities
- Enhanced visualization exports
- Performance profiling and optimization
User: A golf ball is hit at 70 m/s at 15 degrees. How far does it go and what's the flight time?
LLM: [calls calculate_projectile_motion(70, 15)]
Range ≈ 249.7 m
Time of flight ≈ 3.694 s
Maximum height ≈ 16.73 m
Here are 50 trajectory points for visualization...
User: What angle gives maximum range for a cannonball fired at 100 m/s?
LLM: [calls calculate_projectile_motion multiple times with different angles]
The optimal angle is 45°, which gives:
- Maximum range: 1019.4 m
- Flight time: 14.4 s
- Peak height: 254.8 m
User: Two asteroids: one at (0,0,0) moving at 1000 m/s in x direction,
another at (50000, 100, 0) moving at -800 m/s in x. Will they collide?
LLM: [calls check_collision with both objects]
Yes, they will collide!
- Collision time: ~27.8 seconds
- Impact location: (27,778, 100, 0)
- Impact speed: 1,800 m/s
- This would be a devastating impact given the closing speed.
User: Two cars 500m apart, one at 60 mph, other at 45 mph heading toward each other.
When do they collide?
LLM: [calls check_collision]
Collision in 10.7 seconds at position 250m from car 1's starting point.
Combined approach speed is 105 mph (46.9 m/s).
User: What force is needed to accelerate a 1500 kg car at 3 m/s²?
LLM: [calls calculate_force(1500, 3)]
Force required: 4,500 N (Newtons)
This is about 1,011 pounds of force.
User: What's the kinetic energy of a 2000 kg car at 30 m/s (about 67 mph)?
LLM: [calls calculate_kinetic_energy(2000, 30)]
Kinetic energy: 900,000 J (Joules)
That's 900 kJ or 0.25 kWh of energy.
For perspective, this is why car crashes at highway speeds are so dangerous.
User: Calculate momentum of a 70 kg runner at 10 m/s
LLM: [calls calculate_momentum(70, 10)]
Momentum: 700 kg⋅m/s
Direction: same as velocity vector
User: I'm designing a water fountain. Water shoots up at 15 m/s.
How high does it go and when does it come back down?
LLM: [calls calculate_projectile_motion(15, 90)]
The water will:
- Rise to maximum height: 11.47 m
- Take 1.53 seconds to reach peak
- Return to ground level after 3.06 seconds total
- Have the same 15 m/s speed when it lands (just downward)
User: A basketball player shoots from 2m high at 7 m/s toward a hoop
3.05m high and 4.6m away. What angles work?
LLM: [calls calculate_projectile_motion with various angles]
Two possible angles work:
1. Low arc: 38° (faster, flatter shot)
2. High arc: 52° (slower, higher shot)
Most players use 50-55° for better chance of going in.
User: Create a simulation of a ball dropping from 10 meters and bouncing
LLM: [calls create_simulation(gravity_y=-9.81)]
[calls add_rigid_body for ground plane (static)]
[calls add_rigid_body for ball (dynamic, sphere, position=(0,10,0))]
[calls record_trajectory(steps=200)]
Simulation complete! The ball:
- Hits ground at t=1.43s with velocity 14.0 m/s
- Bounces to 7.5m (with restitution=0.8)
- Makes 5 bounces before settling
Here's the full trajectory data for R3F visualization...
User: Simulate 5 boxes stacked, then another box hits them from the side
LLM: [calls create_simulation]
[calls add_rigid_body for ground]
[calls add_rigid_body 5 times for stacked boxes]
[calls add_rigid_body for projectile box with velocity]
[calls step_simulation(300)]
[calls record_trajectory for each box]
The collision causes a realistic toppling effect!
Boxes 1-2 fall left, boxes 3-5 scatter right.
Peak chaos at t=0.8s. All settled by t=3.2s.
Full trajectory data ready for 3D visualization...
Copy and paste these into your LLM chat to see the physics tools in action:
A golf ball is hit at 70 m/s at 15 degrees. How far does it go and what's the flight time?What angle gives maximum range for a cannonball fired at 100 m/s?If I throw a javelin at 28 m/s from 2 meters high, what angle gives maximum distance?A basketball player shoots from 2m high at 7 m/s toward a hoop 3.05m high and 4.6m away. What angles work?
Two cars 500m apart, one at 60 mph, other at 45 mph heading toward each other. When do they collide?Two asteroids: one at (0,0,0) moving at 1000 m/s in x direction, another at (50000, 100, 0) moving at -800 m/s in x. Will they collide?Spaceship A at (10000,0,0) moving at (-50,0,0) m/s, spaceship B at (-10000,100,0) moving at (45,0,0) m/s. Collision check?
What force is needed to accelerate a 1500 kg car at 3 m/s²?What's the kinetic energy of a 2000 kg car traveling at 30 m/s?Calculate the momentum of a 70 kg runner sprinting at 10 m/sHow much energy does a 0.145 kg baseball have when pitched at 45 m/s?
I'm designing a water fountain. Water shoots up at 15 m/s. How high does it go?A cannon on a 50 meter cliff fires horizontally at 200 m/s. How far from the base does the projectile land?Two cars crash: Car A (1500kg) at 30 m/s, Car B (1200kg) at 25 m/s. What's the total kinetic energy at impact?
Create a simulation of a ball dropping from 10 meters height and bouncing on the groundSimulate 5 boxes stacked on top of each other, then have another box hit them from the sideCreate a Newton's cradle with 5 spheres and record their motionSimulate a sphere rolling down a 30-degree ramp
The examples/ directory contains working demonstration scripts:
These examples use the built-in analytic provider and work immediately:
00_quick_start.py- Quick demo of all 5 analytic tools01_simple_projectile.py- Cannonball trajectories, basketball shots, angle comparisons02_collision_detection.py- Car crashes, near misses, asteroid collisions03_force_energy_momentum.py- F=ma, kinetic energy, momentum conservation04_r3f_visualization.py- Generate React Three Fiber visualization data
# Run any example
python examples/00_quick_start.py
python examples/01_simple_projectile.py
# ... etcThese examples demonstrate rigid-body simulations and Phase 1 features. They need the Rapier service running:
05_rapier_simulation.py- Bouncing balls, collisions, stacking boxes06_bounce_detection.py- Phase 1.1: Automatic bounce detection and energy analysis07_contact_events.py- Phase 1.2: Real-time contact tracking and collision events08_pendulum.py- Phase 1.3: Joints and constraints (pendulums, chains)09_phase1_complete.py- Phase 1.4: All Phase 1 features (damping, bounces, contacts, joints)10_fluid_dynamics.py- Phase 1.5: Fluid calculations (drag, buoyancy, terminal velocity)11_rotational_dynamics.py- Phase 2.1: Torque, angular momentum, gyroscopes12_oscillations.py- Phase 2.2: Springs, pendulums, harmonic motion, damping13_circular_motion.py- Phase 2.3: Orbital mechanics, centripetal force14_statics.py- Phase 2.6: Static equilibrium, force balance, beam analysis15_kinematics_analysis.py- Phase 2.7: Motion analysis, trajectory fitting16_roulette_simulation.py- 🎰 Casino Roulette - Complete showcase of multi-body physics, collisions, and energy dissipation
# Option 1: Use public Rapier service (easiest)
export RAPIER_SERVICE_URL=https://rapier.chukai.io
python examples/05_rapier_simulation.py
python examples/06_bounce_detection.py
# ... etc
# Option 2: Run local Rapier service with Docker
docker run -p 9000:9000 chuk-rapier-service
export RAPIER_SERVICE_URL=http://localhost:9000
python examples/05_rapier_simulation.pyNote:
- Examples 00-04 work instantly (no external services)
- Examples 05-09 showcase advanced rigid-body physics with Rapier
- Use the public Rapier service at
https://rapier.chukai.ioor run your own
# Provider selection
PHYSICS_PROVIDER=analytic # or "rapier"
# Rapier service (only if using Rapier provider)
# The default is automatically determined:
# - On Fly.io: uses https://rapier.chukai.io (public service)
# - Locally: uses http://localhost:9000
#
# Override with:
RAPIER_SERVICE_URL=https://rapier.chukai.io # or http://localhost:9000
# Optional configuration
RAPIER_TIMEOUT=30.0
RAPIER_MAX_RETRIES=3
RAPIER_RETRY_DELAY=1.0Create physics.yaml in your working directory or ~/.config/chuk-mcp-physics/:
default_provider: rapier
providers:
# Override provider per tool type
simulations: rapier
projectile_motion: analytic
rapier:
# Public service (recommended)
service_url: https://rapier.chukai.io
# Or local development
# service_url: http://localhost:9000
timeout: 30.0
max_retries: 3
retry_delay: 1.0Understanding these limits helps prevent timeouts, instabilities, and confusion:
| Parameter | Recommended | Maximum | Notes |
|---|---|---|---|
| Units | meters, kg, seconds | - | SI units throughout |
| dt | 0.008 - 0.033 | 0.001 - 0.1 | <0.008 = overkill, >0.033 = unstable |
| steps | 100 - 5000 | 10,000 | Depends on dt and complexity |
| bodies | 1 - 100 | 1,000 | Performance degrades >100 |
| gravity | -20 to 0 m/s² | -100 to +100 | Earth = -9.81 |
| velocity | 0 - 100 m/s | 1,000 m/s | Very high speeds may cause tunneling |
| mass | 0.1 - 10,000 kg | 1e-6 - 1e6 | Extreme ratios cause instability |
The public Rapier service at https://rapier.chukai.io has these limits:
- Max steps per call: 5,000
- Max bodies per simulation: 100
- Max concurrent simulations: 10 per IP
- Request timeout: 30 seconds
- Max simulation lifetime: 1 hour (auto-cleanup)
For larger simulations, run your own Rapier service (see RAPIER_SERVICE.md).
Symptoms:
- Bodies gain extreme velocities
- Objects disappear from view
- NaN values in positions
Causes:
dttoo large for the forces involved- Very high mass ratios (1g object hitting 1000kg object)
- Extreme initial velocities
Solutions:
- Reduce
dtto 0.008 or lower - Use more similar masses (within 2-3 orders of magnitude)
- Limit initial velocities to <100 m/s
Symptoms:
- Request takes >10 seconds
- Timeout errors
- High CPU usage
Causes:
- Too many bodies (>100)
- Very small
dt(<0.005) - Complex mesh colliders
- Too many steps (>5000)
Solutions:
- Reduce body count or simplify shapes
- Increase
dt(balance accuracy vs. speed) - Break large step counts into multiple calls
- Use primitive shapes (sphere, box) instead of meshes
Symptoms:
- Fast-moving objects pass through walls
- Collisions not detected
- Objects appear inside each other
Causes:
- Very high velocities + large
dt - Thin colliders (<0.1m)
- Disabled continuous collision detection (CCD)
Solutions:
- Reduce
dtfor high-speed scenarios - Thicken colliders (minimum 0.1m recommended)
- Reduce velocities
- Enable CCD if available (future feature)
- Start simple: Test with 2-3 bodies before scaling up
- Validate inputs: Check for NaN, Inf, extreme values before simulation
- Monitor performance: Track step time, adjust
dt/steps accordingly - Cleanup: Always
destroy_simulationwhen done (prevent memory leaks) - Use analytic when possible: For simple scenarios, analytic is faster and exact
# Navigate to project directory
cd chuk-mcp-physics
# Install in development mode
make dev-install
# Run tests
make test
# Run tests with coverage
make test-cov
# Format code
make format
# Run all checks
make check
# Build package
make build# Build image
make docker-build
# Run container
make docker-run
# Access at http://localhost:8000Current Production Services:
-
MCP Physics Server: https://physics.chukai.io/mcp
- Public hosted MCP server endpoint
- No local installation required
- Pre-configured with Rapier service
- Ready to use in Claude Desktop
-
Rapier Physics Engine: https://rapier.chukai.io
- Public API for physics simulations
- No authentication required for basic usage
- Rate limits may apply
Quick Test:
# Test the public Rapier service
curl https://rapier.chukai.io/health
# Use with chuk-mcp-physics locally
export RAPIER_SERVICE_URL=https://rapier.chukai.io
uvx chuk-mcp-physicsIf you need your own private Rapier service instance:
cd rapier-service
# Login to Fly.io
fly auth login
# Create Redis instance for distributed storage
fly redis create
# Choose: your-rapier-redis, region sjc (or your preferred region), plan 256MB
# Set Redis URL secret (use URL from previous step)
fly secrets set REDIS_URL="redis://default:password@fly-your-rapier-redis.upstash.io"
# Create and deploy the service
fly apps create your-rapier-physics
fly deploy
# Verify Redis connection in logs
fly logs
# Look for: "📦 Initialized RedisStorage backend"
# Add custom domain (optional)
fly certs add rapier.yourdomain.com -a your-rapier-physics
# Verify service is running
curl https://your-rapier-physics.fly.dev/healthRedis Benefits:
- ✅ Horizontal scaling (multiple service instances share state)
- ✅ Automatic cleanup (TTL-based simulation expiration)
- ✅ Distributed coordination across instances
- ✅ Session persistence within TTL window
Configuration:
The service uses Redis automatically on Fly.io (see rapier-service/fly.toml). For local development, it defaults to in-memory storage.
See rapier-service/FLY_REDIS_SETUP.md for detailed Redis setup guide, monitoring, and troubleshooting.
# Option 1: Environment variable
export RAPIER_SERVICE_URL=https://rapier.yourdomain.com
uvx chuk-mcp-physics
# Option 2: YAML config (physics.yaml)
# rapier:
# service_url: https://rapier.yourdomain.comWhy deploy your own?
- 🔒 Private instance for production workloads
- 📈 Custom scaling and resource allocation
- 🌍 Deploy closer to your users (different regions)
- 💾 Persistent simulations and custom configurations
See DEPLOYMENT.md for complete deployment guide, scaling strategies, and CI/CD setup.
For full rigid-body simulations, you have several options:
# No setup required - just configure the URL
export RAPIER_SERVICE_URL=https://rapier.chukai.io
uvx chuk-mcp-physics# Using Docker
docker run -p 9000:9000 chuk-rapier-service
# Configure to use local service
export RAPIER_SERVICE_URL=http://localhost:9000
uvx chuk-mcp-physics# Build and run the Rust service
cd rapier-service
cargo run --release
# In another terminal
export RAPIER_SERVICE_URL=http://localhost:9000
uvx chuk-mcp-physicsSee RAPIER_SERVICE.md for:
- Complete API specification
- Rust implementation guide
- Docker deployment details
- Testing examples
| Feature | Analytic Provider | Rapier Provider |
|---|---|---|
| Projectile motion | ✅ Exact (kinematic eqs) | ✅ Simulated |
| Simple collisions | ✅ Exact (sphere-sphere, elastic) | ✅ Simulated |
| Force/energy/momentum | ✅ F=ma, KE, PE, momentum, work/power | ✅ Can derive from sim |
| Fluid dynamics | ✅ Drag, buoyancy, terminal velocity | ❌ Not supported |
| Rigid-body dynamics | ❌ Not supported | ✅ Full 3D/2D physics |
| Complex shapes | ❌ Spheres only | ✅ Box, capsule, mesh, etc |
| Friction/restitution | ❌ Not modeled | ✅ Full material properties |
| Multi-body systems | ❌ Not supported | ✅ Unlimited bodies |
| Constraints/joints | ❌ Not supported | ✅ Hinges, sliders, etc |
| Performance | ⚡ Instant | 🐇 Fast (Rust) |
| Setup | 📦 Built-in | 🦀 Requires Rapier service |
Recommendation:
- Use Analytic for simple calculations, education, quick answers
- Use Rapier for complex simulations, games, visualizations, multi-body dynamics
Contributions welcome! Please see CONTRIBUTING.md.
Apache License 2.0 - see LICENSE for details.
This is a demonstration project provided as-is for learning and testing purposes.
- Rapier - Fast 2D/3D physics engine in Rust
- Model Context Protocol - Protocol specification
- RAPIER_SERVICE.md - Rapier microservice specification
- Examples - Example usage patterns
- API Documentation - Detailed tool reference