C++11 OpenGL中矢量与面的求交

C++11 OpenGL中矢量与面的求交,c++11,math,linear-algebra,C++11,Math,Linear Algebra,我有一个地形和一个应该在地形上移动的物体,所以我做了一个功能,可以检测哪个面是位于上面的物体的原点,所以我应该设置物体的Y,以及物体原点与面垂直的向量之间的交点的准确高度,我有面的三个顶点,所以我可以计算它的法线、原点、最大点和最小点(有界框) 编辑: 另一种形式的问题是: 如果我知道三维空间中三角形上某个点的x和z,如果它是三角形中的某个点,我怎么知道它是y呢? 这就是实现: bool EngineItem::checkIntersection(glm::vec3& rayOrigi

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

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

这就是实现:

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;
}
bool EngineItem::checkIntersection(glm::vec3和光线原点,glm::vec3和光线向量,面和面,glm::vec3和点){
常量浮点ε=0.0000001;
glm::vec3顶点0=face.v1;
glm::vec3 vertex1=face.v2;
glm::vec3 vertex2=face.v3;
glm::vec3边1、边2、h、s、q;
浮子a、f、u、v;
边1=顶点1-顶点0;
边2=顶点2-顶点0;
h=glm::交叉(光线向量,边2);
a=glm::dot(边1,h);
if(a>-EPSILON&&a1.0)
返回false;
q=glm::交叉(s,边1);
v=f*glm::dot(光线矢量,q);
如果(v<0.0 | | u+v>1.0)
返回false;
浮点数t=f*glm::dot(边2,q);
if(t>EPSILON){
glm::vec3 plus=glm::规格化(光线向量)*(t*glm::长度(光线向量));
点=光线原点+加号;
返回true;
}否则
返回false;
}

执行标准的光线三角形相交?请将您的答案作为答案发布,而不是在问题中发布