ballistics-engine
High-performance ballistics trajectory engine with professional physics modeling.
Features
- Professional-grade trajectory calculations with multiple drag models (G1, G7, G8)
- Advanced physics including wind effects and atmospheric modeling
- Fast Rust implementation with Python bindings via PyO3
- Imperial units API (grains, fps, yards, inches) with automatic metric conversion
Installation
pip install ballistics-engine
Quick Start
from ballistics_engine import BallisticInputs, TrajectorySolver, WindConditions, AtmosphericConditions, DragModel
# Create ballistic inputs (all imperial units)
inputs = BallisticInputs(
bc=0.505, # G7 BC
bullet_weight_grains=168, # grains
muzzle_velocity_fps=2650, # feet per second
bullet_diameter_inches=0.308, # inches
bullet_length_inches=1.24, # inches
sight_height_inches=1.5, # inches above bore
zero_distance_yards=100, # yards
twist_rate_inches=11.25, # inches per turn
)
inputs.drag_model = DragModel.g7() # Use G7 drag model
# Create wind conditions (optional)
wind = WindConditions(
speed_mph=10, # mph
direction_degrees=90, # degrees (0=headwind, 90=from right)
)
# Create atmospheric conditions (optional)
atmosphere = AtmosphericConditions(
temperature_f=59, # Fahrenheit
pressure_inhg=29.92, # inHg
humidity_percent=50, # percent
altitude_feet=0, # feet
)
# Solve trajectory
solver = TrajectorySolver(inputs, wind=wind, atmosphere=atmosphere)
result = solver.solve()
# Print results
print(f"Max range: {result.max_range_yards:.1f} yards")
print(f"Time of flight: {result.time_of_flight:.2f} seconds")
print(f"Impact velocity: {result.impact_velocity_fps:.1f} fps")
print(f"Impact energy: {result.impact_energy_ftlbs:.1f} ft-lbs")
# Iterate through trajectory points
for point in result.points:
print(f"Time: {point.time:.2f}s, X: {point.x:.1f}yd, Y: {point.y:.3f}yd, V: {point.velocity_fps:.1f}fps")
Units
The Python API uses imperial units for convenience:
- Mass: grains (gr)
- Velocity: feet per second (fps)
- Distance: yards (yd) and inches (in)
- Pressure: inches of mercury (inHg)
- Temperature: Fahrenheit (°F)
- Wind speed: miles per hour (mph)
All conversions to metric (used internally by the Rust engine) are handled automatically.
API Reference
BallisticInputs
Main input parameters for trajectory calculation.
Parameters:
bc(float): Ballistic coefficientbullet_weight_grains(float): Bullet mass in grainsmuzzle_velocity_fps(float): Muzzle velocity in fpsbullet_diameter_inches(float): Bullet diameter in inchesbullet_length_inches(float): Bullet length in inchessight_height_inches(float): Sight height above bore in incheszero_distance_yards(float): Zero distance in yardsshooting_angle_degrees(float): Uphill/downhill angle in degreestwist_rate_inches(float): Barrel twist rate (inches per turn)is_right_twist(bool): True for right-hand twist (default: True)
WindConditions
Wind parameters.
Parameters:
speed_mph(float): Wind speed in mph (default: 0)direction_degrees(float): Wind direction in degrees (0=headwind, 90=from right, default: 0)
AtmosphericConditions
Atmospheric parameters.
Parameters:
temperature_f(float): Temperature in Fahrenheit (default: 59)pressure_inhg(float): Barometric pressure in inHg (default: 29.92)humidity_percent(float): Relative humidity percentage (default: 50)altitude_feet(float): Altitude in feet (default: 0)
TrajectorySolver
Trajectory calculation engine.
Methods:
__init__(inputs, wind=None, atmosphere=None): Create solver with inputssolve(): Calculate trajectory, returnsTrajectoryResult
TrajectoryResult
Trajectory calculation results.
Properties:
max_range_yards(float): Maximum range in yardsmax_height_yards(float): Maximum height in yardstime_of_flight(float): Total flight time in secondsimpact_velocity_fps(float): Impact velocity in fpsimpact_energy_ftlbs(float): Impact energy in ft-lbspoints(list[TrajectoryPoint]): List of trajectory points
TrajectoryPoint
Individual point along trajectory.
Properties:
time(float): Time in secondsx(float): Downrange distance in yardsy(float): Vertical position in yards (relative to line of sight)z(float): Lateral position in yardsvelocity_fps(float): Velocity in fpsenergy_ftlbs(float): Kinetic energy in ft-lbs
DragModel
Drag model selection.
Static methods:
DragModel.g1(): G1 drag model (flat base)DragModel.g7(): G7 drag model (boat tail)DragModel.g8(): G8 drag model (boat tail with meplat)
bridge_call(request_json: str) -> str
The engine's versioned JSON command bridge: one request envelope in, one response
envelope out, both as strings. It is a transport onto the engine's own service layer,
so it reaches corrections.bc5d_table_path and atmosphere.pressure_reference,
which the typed classes above cannot carry at all. It is also the safer route to
effects.wind_shear_model: the inputs dict has accepted wind_shear_model for some
time, but it takes any string and silently resolves an unrecognised one to the power
law, where the bridge validates it and names the offending field.
import json
from ballistics_engine import bridge_call
response = json.loads(bridge_call(json.dumps({
"api_version": 1,
"command": "solve",
"request": {
"schema_version": 1,
"projectile": {"mass_kg": 0.01134, "diameter_m": 0.00782, "length_m": 0.0338,
"drag_model": "G7", "ballistic_coefficient": 0.243},
"rifle": {"muzzle_velocity_mps": 823.0, "sight_height_m": 0.0381},
"shot": {"max_range_m": 1000.0, "zero_distance_m": 100.0},
"atmosphere": {}, "wind": {"speed_mps": 4.47, "direction_from_rad": 1.5708},
"solver": {}, "effects": {"wind_shear_model": "logarithmic"},
"sampling": {"interval_m": 100.0},
},
})))
if response["ok"]:
print(response["result"]["samples"][-1])
else:
print(response["error"]["code"], response["error"]["message"])
Unlike the rest of this API, failures come back inside the returned JSON rather than
as a Python exception — a bad envelope, an unknown command or an invalid field all
return a well-formed {"ok": false, "api_version": 1, "engine_version": "...", "error": {"code": ..., "message": ...}} document. The wrapper returns the string
verbatim; parsing and error handling are the caller's.
Unlike the classes above, the bridge speaks SI units throughout (kg, m, m/s, K, Pa, radians), because it is the engine's own wire contract.
Ask meta.capabilities for the command list this wheel can actually run — it is
build-dependent, and this wheel links the engine with default features off, so the
PDF- and profile-import-gated commands are not compiled in.
License
Dual licensed under MIT or Apache-2.0.
Links
- Homepage: https://ballistics.rs/
- Repository: https://github.com/ajokela/ballistics-engine
- Documentation: https://docs.rs/ballistics-engine
Metadata
Release files for ballistics-engine 0.41.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ballistics_engine-0.41.0.tar.gz | 61.6 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| ballistics_engine-0.41.0-cp38-abi3-win_amd64.whl | CPython 3.8 | abi3 | Windows x86-64 | Details |
| ballistics_engine-0.41.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| ballistics_engine-0.41.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| ballistics_engine-0.41.0-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details |
| ballistics_engine-0.41.0-cp38-abi3-macosx_10_12_x86_64.whl | CPython 3.8 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 5.8 MB
Release files / ballistics_engine-0.41.0.tar.gz
| Download URL | ballistics_engine-0.41.0.tar.gz |
|---|---|
| Size | 61.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
043cea6755fdc25154f34d56d46dbd97a1e02759bba9e04f7ea9e40cf8141f9b
|
|
BLAKE2b-256 checksum How to use checksums |
f59be333150b39f5d490b56902dde299e28e5553ef650388aae7e0c3c544f300
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.15.0
|
Release files / ballistics_engine-0.41.0-cp38-abi3-win_amd64.whl
| Download URL | ballistics_engine-0.41.0-cp38-abi3-win_amd64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.8 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
e2a2338316c2fcaa9c3bcdcd7291a6c90eab53e36bc3b48a07c51557da66e161
|
|
BLAKE2b-256 checksum How to use checksums |
1b5c9a3f0ee9b07b4402da80567b4596055322ef34b38201ff86618a15ec508b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.15.0
|
Release files / ballistics_engine-0.41.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | ballistics_engine-0.41.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c6037eae8af6814d0b4123cec439d10a0a4048d9259c08f80fe46c686aaee469
|
|
BLAKE2b-256 checksum How to use checksums |
c5eb142940610c15ff47d05ca6a4c33dcc4b2900d34c45f2961a27cf88530980
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.15.0
|
Release files / ballistics_engine-0.41.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | ballistics_engine-0.41.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
27b7d50a5895e253c439ee273326842785da67d38fc8ae7cc1680efb61adbf28
|
|
BLAKE2b-256 checksum How to use checksums |
2fb67ba41d21f20c6a6ea598bb8143585f41c9a627b29264421484ba3afd40d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.15.0
|
Release files / ballistics_engine-0.41.0-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | ballistics_engine-0.41.0-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
695ce2eae07f6020b96c825ec5c9c27fa6d69e3cac3670d9f7d422abad115146
|
|
BLAKE2b-256 checksum How to use checksums |
b73ccc2e1b28aa24a815f2c3836a8d9abdfc458fae98c32bd09885e59eb0271c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.15.0
|
Release files / ballistics_engine-0.41.0-cp38-abi3-macosx_10_12_x86_64.whl
| Download URL | ballistics_engine-0.41.0-cp38-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.8 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
60fc24689c6494273b8002a7e5158d6fe4f1db1ae62b0877ecbacbe7a312b0d8
|
|
BLAKE2b-256 checksum How to use checksums |
46d80bf496ab56e2fe75115508d21ae91958039a89bab493d1bcfbf33ec8a6c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
maturin/1.15.0
|