JSim 2026.06.01-p(1)
Loading...
Searching...
No Matches
integrators.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 "vector.hpp"
8#include "quaternion.hpp"
9
10namespace frcsim {
11
25struct Integrator {
26 // Semi-Implicit Euler (Linear)
27 // velocity += acceleration * dt
28 // position += velocity * dt
29 // Stable and standard for real-time physics engines.
30
31 static inline void integrateLinear(Vector3& position, Vector3& velocity,
32 const Vector3& acceleration,
33 double dt) noexcept {
34 velocity += acceleration * dt;
35 position += velocity * dt;
36 }
37
38 // Explicit Euler (optional)
39 // Useful for debugging or predictor steps
40
41 static inline void integrateLinearExplicit(Vector3& position,
42 Vector3& velocity,
43 const Vector3& acceleration,
44 double dt) noexcept {
45 position += velocity * dt;
46 velocity += acceleration * dt;
47 }
48
49 // Angular Integration
50 // Quaternion derivative:
51 // q_dot = 0.5 * omega_quat * q
52 // where omega_quat = (0, wx, wy, wz)
53 static inline void integrateAngular(Quaternion& orientation,
54 const Vector3& angularVelocity,
55 double dt) noexcept {
56 Quaternion omegaQuat(0.0, angularVelocity.x, angularVelocity.y,
57 angularVelocity.z);
58 Quaternion dq = omegaQuat * orientation * 0.5;
59 orientation = orientation + dq * dt;
60 orientation.normalizeIfNeeded();
61 }
62
63 // Angular Velocity Integration: omega += alpha * dt
64
65 static inline void integrateAngularVelocity(
66 Vector3& angularVelocity, const Vector3& angularAcceleration,
67 double dt) noexcept {
68 angularVelocity += angularAcceleration * dt;
69 }
70
71 // RK2 Integrator (optional)
72 // Midpoint integration, useful for projectiles or high-speed mechanisms.
73
74 static inline void integrateLinearRK2(Vector3& position, Vector3& velocity,
75 const Vector3& acceleration,
76 double dt) noexcept {
77 Vector3 halfVelocity = velocity + acceleration * (0.5 * dt);
78
79 position += halfVelocity * dt;
80
81 velocity += acceleration * dt;
82 }
83};
84
85} // namespace frcsim
Definition vector.hpp:13
Time-integration helpers for translational and rotational rigid-body dynamics.
Definition integrators.hpp:25
static void integrateAngular(Quaternion &orientation, const Vector3 &angularVelocity, double dt) noexcept
Definition integrators.hpp:53
static void integrateLinearExplicit(Vector3 &position, Vector3 &velocity, const Vector3 &acceleration, double dt) noexcept
Definition integrators.hpp:41
static void integrateLinear(Vector3 &position, Vector3 &velocity, const Vector3 &acceleration, double dt) noexcept
Definition integrators.hpp:31
static void integrateLinearRK2(Vector3 &position, Vector3 &velocity, const Vector3 &acceleration, double dt) noexcept
Definition integrators.hpp:74
static void integrateAngularVelocity(Vector3 &angularVelocity, const Vector3 &angularAcceleration, double dt) noexcept
Definition integrators.hpp:65
Unit-quaternion rotation representation and rotation algebra helpers.
Definition quaternion.hpp:25
void normalizeIfNeeded(double eps=1e-12) noexcept
Definition quaternion.hpp:62
3D vector utility used throughout JSim physics.
Definition vector.hpp:22