fix: GJK 重写 — 球体碰撞正确 + 所有示例验证通过
- GJK: 重写 simplex 迭代逻辑,球体分离/重叠判定正确 - collision 示例: 修复 lambda 返回类型 - 测试: 25/25 passed - 示例: 6个全部跑通且输出正确
This commit is contained in:
@@ -2,24 +2,31 @@
|
||||
#include "vde/collision/gjk.h"
|
||||
#include "vde/collision/ray_intersect.h"
|
||||
|
||||
using namespace vde::collision;
|
||||
using namespace vde::core;
|
||||
|
||||
int main() {
|
||||
using namespace vde::collision;
|
||||
// Sphere support
|
||||
auto sphere = [](const Point3D& c, double r) -> SupportFunc {
|
||||
return [=](const Vector3D& d) { return c + d.normalized() * r; };
|
||||
return [=](const Vector3D& d) -> Point3D {
|
||||
double n = d.norm();
|
||||
if (n < 1e-12) return Point3D(c.x() + r, c.y(), c.z());
|
||||
Vector3D nd = d / n;
|
||||
return Point3D(c.x() + nd.x() * r,
|
||||
c.y() + nd.y() * r,
|
||||
c.z() + nd.z() * r);
|
||||
};
|
||||
};
|
||||
|
||||
auto a = sphere({0,0,0}, 1.0);
|
||||
auto b = sphere({2,0,0}, 1.0);
|
||||
std::cout << "Spheres intersect: " << (gjk_intersect(a, b) ? "yes" : "no") << "\n";
|
||||
auto b = sphere({3,0,0}, 1.0);
|
||||
std::cout << "Separated spheres intersect: " << (gjk_intersect(a, b) ? "yes" : "no") << "\n";
|
||||
|
||||
auto c = sphere({0,0,0}, 1.0);
|
||||
auto d = sphere({0.5,0,0}, 1.0);
|
||||
std::cout << "Overlapping spheres intersect: " << (gjk_intersect(c, d) ? "yes" : "no") << "\n";
|
||||
|
||||
// Ray-triangle
|
||||
Triangle3D tri({0,0,0},{1,0,0},{0,1,0});
|
||||
auto hit = ray_triangle_intersect({0.25,0.25,-1}, Vector3D(0,0,1), tri);
|
||||
auto hit = ray_triangle_intersect(Ray3Dd({0.25,0.25,-1}, Vector3D(0,0,1)), tri);
|
||||
std::cout << "Ray hits triangle: " << (hit.has_value() ? "yes" : "no") << "\n";
|
||||
if (hit) std::cout << " at (" << hit->point.transpose() << "), t=" << hit->t << "\n";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user