Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
AABB.cpp
Go to the documentation of this file.
1#include "AABB.h"
2#include <algorithm>
3#include <iostream>
4#include <memory>
5
6#include <glm/gtx/matrix_decompose.hpp>
7
8Physics::Bounding::AABB::AABB(const glm::vec3 &ctr, const glm::vec3 &halfExt)
9 : center(ctr), halfExtents(halfExt), minCorner(ctr-halfExt), maxCorner(ctr+halfExt) {}
10
11std::unique_ptr<Physics::Bounding::ICollider> Physics::Bounding::AABB::getTransformed(const glm::mat4 &modelMatrix) const {
12 auto L = glm::mat3(modelMatrix);
13 auto T = glm::vec3(modelMatrix[3]);
14
15 glm::mat3 absL = glm::mat3(
16 glm::abs(L[0]),
17 glm::abs(L[1]),
18 glm::abs(L[2])
19 );
20
21 glm::vec3 newHalfExtents = absL * halfExtents;
22 glm::vec3 newCenter = L * center + T;
23
24 return std::make_unique<AABB>(newCenter, newHalfExtents);
25}
26
28 return (minCorner.x <= other.maxCorner.x && maxCorner.x >= other.minCorner.x) &&
29 (minCorner.y <= other.maxCorner.y && maxCorner.y >= other.minCorner.y) &&
30 (minCorner.z <= other.maxCorner.z && maxCorner.z >= other.minCorner.z);
31}
32
33// Tavian Barnes’ branchless slab method
34std::optional<float> Physics::Bounding::AABB::intersectRay(const Math::Ray& ray) const {
35 glm::vec3 invDir = 1.0f / ray.dir;
36
37 glm::vec3 t0s = (minCorner - ray.origin) * invDir;
38 glm::vec3 t1s = (maxCorner - ray.origin) * invDir;
39
40 glm::vec3 tsmaller = glm::min(t0s, t1s);
41 glm::vec3 tbigger = glm::max(t0s, t1s);
42
43 float tmin = std::max(std::max(tsmaller.x, tsmaller.y), tsmaller.z);
44 float tmax = std::min(std::min(tbigger.x, tbigger.y), tbigger.z);
45
46 bool hit = tmax >= std::max(tmin, 0.0f);
47 return hit ? std::optional{ tmin } : std::nullopt;
48}
49
50bool Physics::Bounding::AABB::contains(const glm::vec3 &p) const {
51 return (p.x >= minCorner.x && p.x <= maxCorner.x) &&
52 (p.y >= minCorner.y && p.y <= maxCorner.y) &&
53 (p.z >= minCorner.z && p.z <= maxCorner.z);
54}
55
57 //TODO
58 return {p, glm::vec3(0.0f), 0.0f};
59}
60
61void Physics::Bounding::AABB::expand(const glm::vec3& point) {
62 minCorner = glm::min(minCorner, point);
63 maxCorner = glm::max(maxCorner, point);
64 center = (minCorner + maxCorner) * 0.5f;
65 halfExtents = (maxCorner - minCorner) * 0.5f;
66}
67
69 expand(other.getAABBMin());
70 expand(other.getAABBMax());
71}
std::optional< float > intersectRay(const Math::Ray &ray) const override
Tests ray-collider intersection.
Definition AABB.cpp:34
bool contains(const glm::vec3 &p) const override
Tests if a point is inside the collider volume.
Definition AABB.cpp:50
bool intersectsAABB(const AABB &other) const
Definition AABB.cpp:27
std::unique_ptr< ICollider > getTransformed(const glm::mat4 &modelMatrix) const override
Creates a transformed copy of this collider in world space.
Definition AABB.cpp:11
void expand(const glm::vec3 &point)
Definition AABB.cpp:61
glm::vec3 getAABBMin() const override
Gets the minimum, maximum corner of the axis-aligned bounding box (AABB) that contains this collider.
Definition AABB.h:21
ContactInfo closestPoint(const glm::vec3 &p) const override
Finds the closest point on the collider surface to a given point.
Definition AABB.cpp:56
glm::vec3 getAABBMax() const override
Definition AABB.h:22
glm::vec3 origin
Starting point of the ray in world space.
Definition Ray.h:12
glm::vec3 dir
Direction vector (should be normalized)
Definition Ray.h:13
Represents a ray in 3D space.
Definition Ray.h:11
Contact point information from collision queries.
Definition ICollider.h:35