Blame collider.cpp

8ee194
8ee194
8ee194
#include "collider.h"
8ee194
8ee194
8ee194
Real Collider::distance_to_triangle(const Triangle &triangle, const Vector3 &pos, const Vector3 &dir) {
8ee194
    const Vector3 &n = triangle.normal;
8ee194
    const Vector3 &a = triangle.vertices[0];
8ee194
    const Vector3 &b = triangle.vertices[1];
8ee194
    const Vector3 &c = triangle.vertices[2];
8ee194
    
8ee194
    Real d = n * dir;
8ee194
    if (fabs(d) < 1e-5) return INFINITY;
8ee194
    if ((b - a).len() < 1e-5) return INFINITY;
8ee194
    if ((c - b).len() < 1e-5) return INFINITY;
8ee194
    if ((a - c).len() < 1e-5) return INFINITY;
8ee194
8ee194
    d = 1/d;
8ee194
    //Real angle = fabs(atan(d));
8ee194
    Real l = (a - pos)*n*d;
8ee194
    
8ee194
    Vector3 p = pos + dir*l;
8ee194
    //Vector3 dp = n.cross(dir.cross(n));
8ee194
    
8ee194
    //Real th = 0, ch = 0, co = 0;
8ee194
    //tool.calc_collision(angle, th, ch, co);
8ee194
    //Real dist = sqrt(ch*ch + co*co);
8ee194
8ee194
    Vector3 pp = p;// + dp*dist;
8ee194
    if (n.cross(b - a)*(pp - a) < 0) return INFINITY;
8ee194
    if (n.cross(c - b)*(pp - b) < 0) return INFINITY;
8ee194
    if (n.cross(a - c)*(pp - c) < 0) return INFINITY;
8ee194
    
8ee194
    return l;// - th;
8ee194
}
8ee194
8ee194
Real Collider::distance_to_model(const Vector3 &pos, const Vector3 &dir) {
8ee194
    Real distance = INFINITY;
8ee194
    for(TriangleList::const_iterator i = model.triangles.begin(); i != model.triangles.end(); ++i)
8ee194
        distance = std::min(distance, distance_to_triangle(*i, pos, dir));
8ee194
    return distance;
8ee194
}
8ee194