5#include <glm/gtc/matrix_transform.hpp>
12constexpr double kContactAreaFraction = 0.01;
13constexpr double kContactConductionDistance = 0.01;
23 std::lock_guard<std::mutex> lock(stateMutex);
24 meshVertices = vertices;
25 meshIndices = indices;
29void Physics::RigidBody::recomputeGeometry() {
30 if (meshIndices.empty())
return;
33 for (
size_t i = 0; i < meshIndices.size(); i += 3) {
34 glm::vec3 a = meshVertices[meshIndices[i]] * scale;
35 glm::vec3 b = meshVertices[meshIndices[i+1]] * scale;
36 glm::vec3 c = meshVertices[meshIndices[i+2]] * scale;
37 area += 0.5f * glm::length(glm::cross(b - a, c - a));
48 collider = std::move(col);
54 collider = std::move(col);
62 std::unique_lock<std::mutex> maybeLock;
64 maybeLock = std::unique_lock<std::mutex>(stateMutex);
70 std::unique_lock<std::mutex> maybeLock;
72 maybeLock = std::unique_lock<std::mutex>(stateMutex);
82 std::unique_lock<std::mutex> maybeLock;
84 maybeLock = std::unique_lock<std::mutex>(stateMutex);
87 glm::vec3 posIncrement = getVelocity(
BodyLock::NOLOCK) * dt + 0.5f * acceleration * dt * dt;
100 auto worldCollider = collider->getTransformed(M);
113 std::lock_guard<std::mutex> lock(stateMutex);
114 auto worldCollider = collider->getTransformed(getWorldTransform(
BodyLock::NOLOCK));
119 if (vRel >= 0.0f)
return false;
125 glm::vec3 Fnet(0.0f);
136 const double keLost = 0.5 * pm.
getMass(
BodyLock::NOLOCK) *
static_cast<double>(vRel) *
static_cast<double>(vRel);
140 const double contactArea = kContactAreaFraction * std::min(getSurfaceArea(), pm.
getSurfaceArea());
141 const double distance = kContactConductionDistance;
145 contactArea, distance, dt
virtual double getMass(BodyLock lock) const
void setPosition(const glm::vec3 &pos, BodyLock lock)
float getSurfaceArea() const
glm::vec3 getVelocity(BodyLock lock) const
virtual ThermalProperties getThermalProperties(BodyLock lock) const
std::map< std::string, glm::vec3 > getAllForces(BodyLock lock) const
void setWorldTransform(const glm::mat4 &M, BodyLock lock)
virtual bool collidesWithRigidBody(const RigidBody &rb) const =0
glm::vec3 getPosition(BodyLock lock) const
void setForce(const std::string &name, const glm::vec3 &force, BodyLock lock)
virtual void setMass(double newMass, BodyLock lock)
virtual bool resolveCollisionWithRigidBody(float dt, RigidBody &rb)=0
void setIsStatic(bool newStatic, BodyLock lock)
void applyImpulse(const glm::vec3 &impulse, BodyLock lock)
void setThermalProperty(const ThermalProperties &newProps, BodyLock lock) override
bool resolveCollisionWith(float dt, PhysicsBody &other) override
RigidBody(uint32_t id, double mass, std::unique_ptr< Bounding::ICollider > collider, glm::vec3 pos=glm::vec3(0.0f), bool isStatic=false)
bool collidesWith(const PhysicsBody &other) const override
bool collidesWithPointMass(const PointMass &pm) const override
bool resolveCollisionWithPointMass(float dt, PointMass &pm) override
bool resolveCollisionWithRigidBody(float dt, RigidBody &rb) override
void recordFrame(float t, BodyLock lock) override
bool collidesWithRigidBody(const RigidBody &rb) const override
void step(float dt, BodyLock lock) override
void loadFrame(const ObjectSnapshot &snapshot, BodyLock lock) override
void setGeometry(const std::vector< glm::vec3 > &vertices, const std::vector< unsigned int > &indices)
void setScale(const glm::vec3 &newScale)
float penetration
Penetration depth (positive = overlapping, negative = separated)
glm::vec3 normal
Surface normal at contact point (points outward from surface)
void applyConductiveExchange(ThermalProperties &a, double massA, ThermalProperties &b, double massB, double areaM2, double distanceM, double dt)
void applyThermalEnergy(ThermalProperties &props, double massKg, double energyJ)