mirror of
https://github.com/orange-cpp/omath.git
synced 2026-02-13 07:03:25 +00:00
Adds mesh scaling to mesh collider
Updates the mesh collider to include a scale parameter, allowing for non-uniform scaling of the collision mesh. This provides more flexibility in defining collision shapes and supports a wider range of scenarios.
This commit is contained in:
@@ -13,20 +13,22 @@ namespace omath::collision
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using VertexType = Vector3<float>;
|
using VertexType = Vector3<float>;
|
||||||
MeshCollider(const std::vector<Vector3<float>>& vertexes, const Vector3<float> origin)
|
MeshCollider(const std::vector<VertexType>& vertexes, const VertexType& origin, const VertexType& scale = {1.f, 1.f, 1.f})
|
||||||
: m_vertexes(vertexes), m_origin(origin)
|
: m_vertexes(vertexes),m_scale(scale), m_origin(origin)
|
||||||
{
|
{
|
||||||
if (m_vertexes.empty())
|
if (m_vertexes.empty())
|
||||||
throw std::runtime_error("Collider cannot have 0 vertexes");
|
throw std::runtime_error("Collider cannot have 0 vertexes");
|
||||||
}
|
}
|
||||||
std::vector<Vector3<float>> m_vertexes;
|
std::vector<Vector3<float>> m_vertexes;
|
||||||
|
Vector3<float> m_scale;
|
||||||
|
|
||||||
Vector3<float> m_origin;
|
Vector3<float> m_origin;
|
||||||
source_engine::ViewAngles m_rotation;
|
source_engine::ViewAngles m_rotation;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
source_engine::Mat4X4 to_world() const
|
source_engine::Mat4X4 to_world() const
|
||||||
{
|
{
|
||||||
return mat_translation(m_origin) * source_engine::rotation_matrix(m_rotation);
|
return mat_scale(m_scale) * mat_translation(m_origin) * source_engine::rotation_matrix(m_rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <omath/collision/gjk_algorithm.hpp>
|
#include <omath/collision/gjk_algorithm.hpp>
|
||||||
|
|
||||||
TEST(UnitTestGjk, TestCollisionTrue)
|
namespace
|
||||||
{
|
{
|
||||||
const std::vector<omath::Vector3<float>> mesh = {
|
const std::vector<omath::Vector3<float>> mesh = {
|
||||||
{-1.f, -1.f, -1.f},
|
{-1.f, -1.f, -1.f},
|
||||||
@@ -16,6 +16,9 @@ TEST(UnitTestGjk, TestCollisionTrue)
|
|||||||
{ 1.f, -1.f, 1.f},
|
{ 1.f, -1.f, 1.f},
|
||||||
{ 1.f, -1.f, -1.f}
|
{ 1.f, -1.f, -1.f}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
TEST(UnitTestGjk, TestCollisionTrue)
|
||||||
|
{
|
||||||
|
|
||||||
const omath::collision::MeshCollider collider_a(mesh, {0.f, 0.f, 0.f});
|
const omath::collision::MeshCollider collider_a(mesh, {0.f, 0.f, 0.f});
|
||||||
const omath::collision::MeshCollider collider_b(mesh, {0.f, 0.5f, 0.f});
|
const omath::collision::MeshCollider collider_b(mesh, {0.f, 0.5f, 0.f});
|
||||||
@@ -26,17 +29,6 @@ TEST(UnitTestGjk, TestCollisionTrue)
|
|||||||
}
|
}
|
||||||
TEST(UnitTestGjk, TestCollisionFalse)
|
TEST(UnitTestGjk, TestCollisionFalse)
|
||||||
{
|
{
|
||||||
const std::vector<omath::Vector3<float>> mesh = {
|
|
||||||
{-1.f, -1.f, -1.f},
|
|
||||||
{-1.f, -1.f, 1.f},
|
|
||||||
{-1.f, 1.f, -1.f},
|
|
||||||
{-1.f, 1.f, 1.f},
|
|
||||||
{ 1.f, 1.f, 1.f}, // x = +1 vertices (put {1,1,1} first in case your support breaks ties by first-hit)
|
|
||||||
{ 1.f, 1.f, -1.f},
|
|
||||||
{ 1.f, -1.f, 1.f},
|
|
||||||
{ 1.f, -1.f, -1.f}
|
|
||||||
};
|
|
||||||
|
|
||||||
const omath::collision::MeshCollider collider_a(mesh, {0.f, 0.f, 0.f});
|
const omath::collision::MeshCollider collider_a(mesh, {0.f, 0.f, 0.f});
|
||||||
const omath::collision::MeshCollider collider_b(mesh, {0.f, 2.1f, 0.f});
|
const omath::collision::MeshCollider collider_b(mesh, {0.f, 2.1f, 0.f});
|
||||||
|
|
||||||
@@ -47,17 +39,6 @@ TEST(UnitTestGjk, TestCollisionFalse)
|
|||||||
|
|
||||||
TEST(UnitTestGjk, TestCollisionEqualOrigin)
|
TEST(UnitTestGjk, TestCollisionEqualOrigin)
|
||||||
{
|
{
|
||||||
const std::vector<omath::Vector3<float>> mesh = {
|
|
||||||
{-1.f, -1.f, -1.f},
|
|
||||||
{-1.f, -1.f, 1.f},
|
|
||||||
{-1.f, 1.f, -1.f},
|
|
||||||
{-1.f, 1.f, 1.f},
|
|
||||||
{ 1.f, 1.f, 1.f}, // x = +1 vertices (put {1,1,1} first in case your support breaks ties by first-hit)
|
|
||||||
{ 1.f, 1.f, -1.f},
|
|
||||||
{ 1.f, -1.f, 1.f},
|
|
||||||
{ 1.f, -1.f, -1.f}
|
|
||||||
};
|
|
||||||
|
|
||||||
const omath::collision::MeshCollider collider_a(mesh, {0.f, 0.f, 0.f});
|
const omath::collision::MeshCollider collider_a(mesh, {0.f, 0.f, 0.f});
|
||||||
const omath::collision::MeshCollider collider_b(mesh, {0.f, 0.f, 0.f});
|
const omath::collision::MeshCollider collider_b(mesh, {0.f, 0.f, 0.f});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user