Planets¶
A Planet is a world-level entity: a planet-fixed frame, standing
disturbances on the shared fields, and initial-state factories.
manta.Planet ¶
Body-fixed rotating planet frame + field-disturbance source.
Args:
name — identifier (used in repr + lookups).
position — planet center in WorldFrame (m). Default origin.
rotation_axis — unit rotation axis in WorldFrame. Default (0,0,1).
omega — angular rate, rad/s. Positive ⇒ right-hand-rule
rotation about rotation_axis. Earth sidereal
is ~7.272e-5 rad/s; default 0 (non-rotating).
Source code in manta/planets/base.py
R_world_from_planet ¶
3×3 rotation matrix from PlanetFrame to WorldFrame at time t.
Source code in manta/planets/base.py
omega_vec_world ¶
planet_to_world ¶
Position + velocity of a point that, in PlanetFrame at time
t, has coords (p_planet, v_planet). Returns (p_world, v_world).
Velocity transform: v_world = R · v_planet + ω × (p_world − planet.position)
Source code in manta/planets/base.py
position_world_sym ¶
omega_world_sym ¶
R_world_from_planet_sym ¶
3×3 MX rotation from PlanetFrame to WorldFrame at symbolic t.
Rodrigues' formula with angle = omega·t. Branch-free.
Source code in manta/planets/base.py
position ¶
Return a PlanetState wrapping a PlanetFrame position. Pass
directly to World.add_craft(..., position=...) to seed the
craft's initial WorldFrame position from PlanetFrame coords.
Source code in manta/planets/base.py
velocity ¶
Return a PlanetState wrapping a PlanetFrame velocity.
at_rest ¶
Shorthand for planet.velocity(0, 0, 0) — sets the WorldFrame
velocity such that the craft sits at rest in PlanetFrame
(i.e., co-rotates with the planet).
register_disturbances ¶
Called by Sim(world) to attach this planet's standing
contributions to the world's shared fields. Subclasses (Earth,
Moon, ...) override to install gravity / ocean / atmosphere /
magnetic-dipole disturbances. Base default: no-op.
Subclasses should use world.get_or_create_field(FieldClass) to
get the shared instance, then .add(disturbance).
Source code in manta/planets/base.py
manta.planets.Earth ¶
Earth(name='earth', *, position=(0.0, 0.0, 0.0), rotation_rate=0.0, rotation_axis=(0.0, 0.0, 1.0), sea_level=0.0, water_density=1025.0, air_density=1.225, atmosphere_scale_height=None, gravity_mu=MU, include_j2=False, dipole_moment=0.0, waves=None, surface_collision=True, surface_smoothing=0.0)
Bases: Planet
Standard Earth preset.
Args:
name — identifier. Default "earth".
position — planet center in WorldFrame (m).
rotation_rate — angular rate, rad/s. Earth sidereal:
Earth.SIDEREAL. Default 0.
sea_level — elevation of the ocean's top above the
planet's equatorial radius, m. Default 0
(sea-level surface coincides with R_EQ).
water_density — ocean density, kg/m³. Default 1025 (seawater).
air_density — atmosphere density, kg/m³. Default 1.225 (ISA
sea-level).
gravity_mu — gravitational parameter μ (m³/s²). 0 disables
gravity. Default Earth.MU.
include_j2 — register a J2 oblateness perturbation
alongside the point-mass term. Default False.
dipole_moment — magnetic dipole strength, A·m². 0 disables
magnetic. Default 0.
waves — optional SeaWaves: a sinusoidal moving sea
surface (boundary elevation + underwater
orbital velocity). Default None (flat sea).
surface_collision — register the sea-level sphere as a solid
CollisionField obstacle (a rough model of
the surface), so Collider-footed craft can
stand anywhere on the planet without a
per-site ground plane. Default True.
surface_smoothing — m. Blend the water/air density switch over
this length (logistic in altitude) instead of
a hard if_else. Physically: a finite-size
volume element crosses the surface over its
own diameter; numerically it turns point-
sampled buoyancy from bang-bang into a smooth
ramp (a floating hull finds a stable draft, a
surface-piercing foil gets a smooth lift-vs-
height slope). Default 0 (hard boundary).
Source code in manta/planets/earth.py
planet_radius
property
¶
Radius from planet center to sea-level surface. Equal to R_EQ + sea_level.
manta.planets.PlanetState ¶
Initial-state value carrying its PlanetFrame origin.
Resolved by World.add_craft at compile time via
planet.planet_to_world(...).
Source code in manta/planets/state.py
manta.planets.SeaWaves
dataclass
¶
Planar deep-water sinusoid riding a planet's sea surface.
The surface elevation (above the sea-level sphere) is
η(p, t) = amplitude · cos(k·ξ − ω·t), ξ = p_planet · direction
with k = 2π/wavelength and ω = k·c. The phase speed c defaults to
the deep-water dispersion relation c = √(g·λ / 2π). Underwater, the
fluid carries the matching first-order orbital velocity — particles
circle with radius amplitude at the surface, decaying as e^{k·z}
with depth — so drag surfaces and foils feel the moving water, not
just the moving boundary.
direction is a planet-frame vector (normalized; its radial
component at the point of interest should be ~0). The wave is a
PLANAR field in planet coordinates — valid for a local patch of
ocean, not a globe-wrapping solution.
Args: amplitude — m (crest height above mean sea level). wavelength — m (crest-to-crest). direction — planet-frame propagation direction. Default +x. speed — phase speed override, m/s. None → deep-water dispersion using the planet's surface gravity.