2017-09-27 4 views
1

J'ai un terrain et un objet qui devrait se déplacer sur le terrain donc j'ai fait une fonction qui peut détecter quelle face est l'origine de l'objet localiser ci-dessus, donc je devrais définir le Y de l'objet avec la hauteur précise du point d'intersection entre le vecteur de l'origine de l'objet perpendiculaire à la face, j'ai les trois sommets du visage afin que je puisse calculer sa normale et son origine et les pointes maximum et minimum (boîte bornée).OpenGL intersection entre le vecteur et le visage

enter image description here

Edit: la question sous une autre forme: si je sais x et z d'un point sur un triangle dans l'espace 3D comment puis-je le sais y si elle est un point dans le triangle?

+0

une intersection Perform standard triangle de rayons? – BDL

+0

Veuillez poster votre réponse comme une réponse et non dans la question –

Répondre

1

the Möller–Trumbore intersection algorithm

c'est la mise en œuvre:

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