2017-09-27 11 views
1

Ich habe ein Gelände und ein Objekt, das über das Gelände bewegt werden soll, also habe ich eine Funktion gemacht, die erkennen kann, welches Gesicht der Ursprung des Objekts ist, also setze ich das Y des Objekts mit die genaue Höhe des Schnittpunkts zwischen dem Vektor vom Objektursprung senkrecht zum Gesicht, ich habe die drei Eckpunkte des Gesichts, so dass ich seine normale und seinen Ursprung und maximale und minimale Pointes (begrenzte Box) berechnen kann.OpenGL Schnittpunkt zwischen Vektor und Gesicht

enter image description here

Edit: die Frage in anderer Form: wenn ich weiß, x und z ein Punkt über ein Dreieck im 3D-Raum, wie kann ich es y wissen, ob es ein Punkt im Dreieck ist?

+0

einen Strahl-Dreieck Kreuzung Perform Standard? – BDL

+0

Bitte posten Sie Ihre Antwort als Antwort und nicht in der Frage –

Antwort

1

the Möller–Trumbore intersection algorithm

dies ist die Umsetzung:

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