2017-09-27 49 views
1

我有一個地形和一個物體應該在地形上移動,所以我做了一個函數,可以檢測到哪個臉部是上面定位的物體的原點,所以我應該設置Y的對象從物體原點向量與臉部垂直的向量之間的交點的精確高度,我有臉部的三個頂點,因此我可以計算它的法線和它的原點以及最大和最小指針(有界框)。OpenGL矢量和臉部交集

enter image description here

編輯: 另一種形式的問題: 如果我知道一個點在3D空間中的三角形我怎麼能知道它Ÿ如果是在三角形的一個點的X和Z?

+0

執行標準光線 - 三角形相交? – BDL

+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; 
}