2#ifndef LIBSBX_PHYSICS_RIGIDBODY_HPP_
3#define LIBSBX_PHYSICS_RIGIDBODY_HPP_
7#include <libsbx/units/mass.hpp>
9#include <libsbx/math/vector3.hpp>
10#include <libsbx/math/matrix3x3.hpp>
11#include <libsbx/math/quaternion.hpp>
13namespace sbx::physics {
19 rigidbody(
const std::float_t mass = 1.0f) {
23 auto mass()
const noexcept -> std::float_t {
24 if (_inverse_mass <= std::numeric_limits<std::float_t>::epsilon()) {
25 return std::numeric_limits<std::float_t>::infinity();
28 return 1.0f / _inverse_mass;
31 auto set_mass(
const std::float_t mass)
noexcept ->
void {
32 if (mass <= std::numeric_limits<std::float_t>::epsilon()) {
36 _inverse_inertia_tensor = math::matrix3x3::zero;
37 _inverse_inertia_tensor_world = math::matrix3x3::zero;
39 _inverse_mass = 1.0f / mass;
44 auto inverse_mass()
const noexcept -> std::float_t {
48 auto is_static()
const noexcept ->
bool {
52 auto set_is_static(
const bool is_static)
noexcept ->
void {
53 _is_static = is_static;
57 _velocity = math::vector3::zero;
58 _angular_velocity = math::vector3::zero;
59 _inverse_inertia_tensor = math::matrix3x3::zero;
60 _inverse_inertia_tensor_world = math::matrix3x3::zero;
64 auto linear_damping()
const noexcept -> std::float_t {
65 return _linear_damping;
68 auto set_linear_damping(std::float_t damping)
noexcept ->
void {
69 _linear_damping = damping;
72 auto angular_damping()
const noexcept -> std::float_t {
73 return _angular_damping;
76 auto set_angular_damping(std::float_t damping)
noexcept ->
void {
77 _angular_damping = damping;
84 auto set_velocity(
const math::vector3& velocity)
noexcept ->
void {
88 auto add_velocity(
const math::vector3& delta)
noexcept ->
void {
92 auto angular_velocity()
const noexcept ->
const math::vector3& {
93 return _angular_velocity;
96 auto set_angular_velocity(
const math::vector3& velocity)
noexcept ->
void {
97 _angular_velocity = velocity;
100 auto add_angular_velocity(
const math::vector3& delta)
noexcept ->
void {
101 _angular_velocity += delta;
104 auto add_force(
const math::vector3& force)
noexcept ->
void {
105 _force_accumulator += force;
109 const auto arm = point - center_of_mass;
110 _force_accumulator += force;
111 _torque_accumulator += math::vector3::cross(arm, force);
114 auto constant_forces()
const noexcept ->
const math::vector3& {
115 return _constant_forces;
118 auto set_constant_forces(
const math::vector3& forces)
noexcept ->
void {
119 _constant_forces = forces;
122 auto add_constant_forces(
const math::vector3& forces)
noexcept ->
void {
123 _constant_forces += forces;
126 auto add_acceleration(
const math::vector3& acceleration)
noexcept ->
void {
131 const auto m = 1.0f / _inverse_mass;
133 _force_accumulator += acceleration * m;
136 auto add_constant_acceleration(
const math::vector3& acceleration)
noexcept ->
void {
141 const auto m = 1.0f / _inverse_mass;
143 _constant_forces += acceleration * m;
146 auto set_constant_acceleration(
const math::vector3& acceleration)
noexcept ->
void {
148 _constant_forces = math::vector3::zero;
152 const auto m = 1.0f / _inverse_mass;
154 _constant_forces = acceleration * m;
157 auto dynamic_forces()
const noexcept ->
const math::vector3& {
158 return _force_accumulator;
161 auto clear_dynamic_forces()
noexcept ->
void {
162 _force_accumulator = math::vector3::zero;
165 auto add_torque(
const math::vector3& torque)
noexcept ->
void {
166 _torque_accumulator += torque;
170 return _torque_accumulator;
173 auto clear_torque()
noexcept ->
void {
174 _torque_accumulator = math::vector3::zero;
177 auto inverse_inertia_tensor()
const noexcept ->
const math::matrix3x3& {
178 return _inverse_inertia_tensor;
181 auto set_inverse_inertia_tensor(
const math::matrix3x3& inverse_tensor)
noexcept ->
void {
183 _inverse_inertia_tensor = math::matrix3x3::zero;
185 _inverse_inertia_tensor = inverse_tensor;
189 auto inverse_inertia_tensor_world()
const noexcept ->
const math::matrix3x3& {
190 return _inverse_inertia_tensor_world;
193 auto update_inertia_tensor_world(
const math::matrix3x3& rotation)
noexcept ->
void {
194 _inverse_inertia_tensor_world = rotation * _inverse_inertia_tensor * math::matrix3x3::transposed(rotation);
199 std::float_t _inverse_mass{1.0f};
200 bool _is_static{
false};
202 std::float_t _linear_damping{0.01f};
203 std::float_t _angular_damping{0.05f};
Definition: matrix3x3.hpp:26
Definition: vector3.hpp:23
Definition: rigidbody.hpp:15