JSim 2026.06.01-p(1)
Loading...
Searching...
No Matches
physics_world.hpp
Go to the documentation of this file.
1// Copyright (c) JSim contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the LGPLv3 license file in the root directory of this project.
4
5#pragma once
6
7#include <cstddef>
8#include <cstdint>
9#include <memory>
10#include <vector>
11
18
19namespace frcsim {
20
133
155 public:
165 std::int32_t material_a_id{0};
167 std::int32_t material_b_id{0};
169 double restitution{0.5};
171 double friction{0.6};
173 bool enabled{true};
174 };
175
181 : config_(config) {}
182
188 RigidBody& createBody(double mass_kg);
189
195
204
210 std::vector<EnvironmentalBoundary>& boundaries() { return boundaries_; }
211
216 const std::vector<EnvironmentalBoundary>& boundaries() const {
217 return boundaries_;
218 }
219
228 const std::shared_ptr<ForceGenerator>& generator);
229
235
243
245 std::vector<RigidBody>& bodies() { return bodies_; }
246
248 const std::vector<RigidBody>& bodies() const { return bodies_; }
249
251 std::vector<RigidAssembly>& assemblies() { return assemblies_; }
252
254 const std::vector<RigidAssembly>& assemblies() const { return assemblies_; }
255
265 const Gamepiece::Properties& properties = Gamepiece::Properties());
266
275 const Gamepiece::Properties& properties = Gamepiece::Properties());
276
278 std::vector<Gamepiece>& gamepieces() { return gamepieces_; }
279
281 const std::vector<Gamepiece>& gamepieces() const { return gamepieces_; }
282
284 std::vector<Gamepiece>& balls() { return gamepieces_; }
285
287 const std::vector<Gamepiece>& balls() const { return gamepieces_; }
288
297 void step();
298
300 std::size_t stepCount() const { return step_count_; }
301
303 double accumulatedSimTimeS() const { return accumulated_sim_time_s_; }
304
309 PhysicsConfig& config() { return config_; }
310
315 const PhysicsConfig& config() const { return config_; }
316
326 void setGravity(double gx_mps2, double gy_mps2, double gz_mps2) {
327 config_.gravity_mps2 = Vector3{gx_mps2, gy_mps2, gz_mps2};
328 config_.enable_gravity = true;
329 }
330
339 void gravity(double* gx_mps2, double* gy_mps2, double* gz_mps2) const {
340 if (gx_mps2) {
341 *gx_mps2 = config_.gravity_mps2.x;
342 }
343 if (gy_mps2) {
344 *gy_mps2 = config_.gravity_mps2.y;
345 }
346 if (gz_mps2) {
347 *gz_mps2 = config_.gravity_mps2.z;
348 }
349 }
350
351 private:
356 bool shouldInteract(std::uint32_t layer_a, std::uint32_t mask_a,
357 std::uint32_t layer_b, std::uint32_t mask_b) const;
358
365 const MaterialInteraction* findMaterialInteraction(
366 std::int32_t material_a_id, std::int32_t material_b_id) const;
367
368 PhysicsConfig config_{};
369
370 std::vector<RigidBody> bodies_{};
371 std::vector<RigidAssembly> assemblies_{};
372 std::vector<Gamepiece> gamepieces_{};
373 std::vector<EnvironmentalBoundary> boundaries_{};
374 std::vector<std::shared_ptr<ForceGenerator>> global_force_generators_{};
375 std::vector<MaterialInteraction> material_interactions_{};
376
377 std::size_t step_count_{0};
378 double accumulated_sim_time_s_{0.0};
379};
380
381} // namespace frcsim
3D rigid-body style ball simulator with drag, Magnus lift, and ground contact.
Definition ball_physics.hpp:22
Generic runtime gamepiece abstraction.
Definition gamepiece.hpp:21
BallPhysicsSim3D::Config Config
Definition gamepiece.hpp:23
BallPhysicsSim3D::BallProperties Properties
Definition gamepiece.hpp:24
PhysicsConfig & config()
Mutable access to world configuration.
Definition physics_world.hpp:309
const std::vector< EnvironmentalBoundary > & boundaries() const
Immutable access to boundary storage.
Definition physics_world.hpp:216
const std::vector< Gamepiece > & gamepieces() const
Immutable access to all registered gamepieces.
Definition physics_world.hpp:281
Gamepiece & createGamepiece(const Gamepiece::Config &config=Gamepiece::Config(), const Gamepiece::Properties &properties=Gamepiece::Properties())
Creates and registers a generic gamepiece.
PhysicsWorld(const PhysicsConfig &config=PhysicsConfig())
Constructs a world with an initial configuration snapshot.
Definition physics_world.hpp:180
const PhysicsConfig & config() const
Read-only access to world configuration.
Definition physics_world.hpp:315
const std::vector< RigidBody > & bodies() const
Immutable access to all rigid bodies currently registered in the world.
Definition physics_world.hpp:248
RigidBody & createBody(double mass_kg)
Creates and registers a dynamic rigid body.
std::vector< EnvironmentalBoundary > & boundaries()
Mutable access to boundary storage.
Definition physics_world.hpp:210
void step()
Advances simulation by exactly one fixed timestep.
BallPhysicsSim3D & createBall(const Gamepiece::Config &config=Gamepiece::Config(), const Gamepiece::Properties &properties=Gamepiece::Properties())
Backwards-compatible helper that creates a ball simulator.
std::vector< Gamepiece > & gamepieces()
Mutable access to all registered gamepieces.
Definition physics_world.hpp:278
void addGlobalForceGenerator(const std::shared_ptr< ForceGenerator > &generator)
Registers a world-level force generator.
const std::vector< Gamepiece > & balls() const
Backwards-compatible const accessor for registered balls (gamepieces).
Definition physics_world.hpp:287
double accumulatedSimTimeS() const
Total accumulated simulation time in seconds.
Definition physics_world.hpp:303
std::vector< RigidBody > & bodies()
Mutable access to all rigid bodies currently registered in the world.
Definition physics_world.hpp:245
void setMaterialInteraction(const MaterialInteraction &interaction)
Registers or updates one material interaction override row.
std::vector< RigidAssembly > & assemblies()
Mutable access to all rigid assemblies currently registered in the world.
Definition physics_world.hpp:251
void setGravity(double gx_mps2, double gy_mps2, double gz_mps2)
Sets world gravity acceleration from scalar components.
Definition physics_world.hpp:326
std::vector< Gamepiece > & balls()
Backwards-compatible accessor name for registered balls (gamepieces).
Definition physics_world.hpp:284
void gravity(double *gx_mps2, double *gy_mps2, double *gz_mps2) const
Reads world gravity acceleration into optional scalar outputs.
Definition physics_world.hpp:339
std::size_t stepCount() const
Number of completed fixed-timestep iterations since construction/reset.
Definition physics_world.hpp:300
RigidAssembly & createAssembly()
Creates and registers a rigid assembly container.
EnvironmentalBoundary & addBoundary()
Adds a new environmental boundary primitive.
void clearMaterialInteractions()
Clears all material interaction override rows.
const std::vector< RigidAssembly > & assemblies() const
Immutable access to all rigid assemblies currently registered in the world.
Definition physics_world.hpp:254
Multi-body articulated system made from rigid links and joints.
Definition rigid_assembly.hpp:29
Simulated rigid body with translational/angular dynamics and optional aero metadata.
Definition rigid_body.hpp:44
Definition vector.hpp:13
Collision or constraint boundary definition used by PhysicsWorld.
Definition boundary.hpp:51
Global runtime settings for PhysicsWorld dynamics and optional features.
Definition physics_world.hpp:32
IntegrationMethod
Definition physics_config.hpp:27
@ kSemiImplicitEuler
Definition physics_config.hpp:28
double default_drag_reference_area_m2
Default drag reference area in square meters.
Definition physics_world.hpp:92
double magnus_coefficient
Magnus lift scaling coefficient.
Definition physics_world.hpp:110
double linear_drag_coefficient_n_per_mps
Linear drag coefficient in N/(m/s) for optional viscous damping.
Definition physics_world.hpp:102
bool enable_aerodynamics
Enables aerodynamic drag and Magnus lift forces.
Definition physics_world.hpp:71
double fixed_dt_s
Fixed timestep in seconds used by PhysicsWorld::step.
Definition physics_world.hpp:41
IntegrationMethod integration_method
Integration scheme used for rigid body translational/rotational updates.
Definition physics_world.hpp:48
bool enable_collision_detection
Enables broad collision/contact processing.
Definition physics_world.hpp:56
double angular_damping_per_s
Angular damping coefficient in 1/s.
Definition physics_world.hpp:131
double linear_damping_per_s
Linear damping coefficient in 1/s.
Definition physics_world.hpp:124
Vector3 gravity_mps2
Gravity acceleration vector in meters per second squared.
Definition physics_world.hpp:117
double air_density_kgpm3
Ambient air density in kilograms per cubic meter.
Definition physics_world.hpp:95
bool enable_joint_constraints
Enables joint/constraint solving for rigid assemblies.
Definition physics_world.hpp:63
double default_drag_coefficient
Default dimensionless drag coefficient (Cd).
Definition physics_world.hpp:85
bool enable_gravity
Enables gravity contribution during body integration.
Definition physics_world.hpp:78
Material-pair contact interaction override entry.
Definition physics_world.hpp:163
std::int32_t material_b_id
Second material numeric id (application-defined namespace).
Definition physics_world.hpp:167
bool enabled
True when this row should be considered during lookup.
Definition physics_world.hpp:173
std::int32_t material_a_id
First material numeric id (application-defined namespace).
Definition physics_world.hpp:165
double friction
Pair-specific friction coefficient, typically >= 0.
Definition physics_world.hpp:171
double restitution
Pair-specific restitution coefficient, typically in [0, 1].
Definition physics_world.hpp:169
3D vector utility used throughout JSim physics.
Definition vector.hpp:22