矢量和面部之间的OpenGL交集

时间:2017-09-27 08:57:34

标签: c++11 math linear-algebra

我有一个地形和一个应该在地形上移动的物体,所以我做了一个功能,可以检测哪个面是上面定位的物体的原点,所以我应该设置物体的Y与交叉点的准确高度从物体原点垂直于面部的矢量之间的点,我有面的三个顶点,所以我可以计算它的法线及其原点以及最大和最小指针(有界框)。

enter image description here

编辑: 另一种形式的问题: 如果我知道3D空间中三角形上的点的x和z,我怎么能知道它是否是三角形中的一个点?

1 个答案:

答案 0 :(得分:1)

the Möller–Trumbore intersection algorithm

这是实施:

bool EngineItem::checkIntersection(glm::vec3& rayOrigin, glm::vec3& rayVector, Face& face, glm::vec3& point) {
    const float EPSILON = 0.0000001;
    glm::vec3 vertex0 = face.v1;
    glm::vec3 vertex1 = face.v2;
    glm::vec3 vertex2 = face.v3;
    glm::vec3 edge1, edge2, h, s, q;
    float a, f, u, v;
    edge1 = vertex1 - vertex0;
    edge2 = vertex2 - vertex0;
    h = glm::cross(rayVector, edge2);
    a = glm::dot(edge1, h);
    if (a > -EPSILON && a < EPSILON)
        return false;
    f = 1 / a;
    s = rayOrigin - vertex0;
    u = f * glm::dot(s, h);
    if (u < 0.0 || u > 1.0)
        return false;
    q = glm::cross(s, edge1);
    v = f * glm::dot(rayVector, q);
    if (v < 0.0 || u + v > 1.0)
        return false;
    float t = f * glm::dot(edge2, q);
    if (t > EPSILON) {
        glm::vec3 plus = glm::normalize(rayVector) * (t * glm::length(rayVector));
        point = rayOrigin + plus;
        return true;
    } else
        return false;
}