2017-09-27 8 views
1

私は地形上を移動すべき地形とオブジェクトを持っているので、オブジェクトの起源を検出できる関数を作ったので、オブジェクトのYを設定する必要があります顔に垂直なオブジェクトの原点からのベクトルとの交点の正確な高さ、私は顔の3つの頂点を持つので、その法線とその起点と最大点と​​最小点(境界ボックス)を計算できます。ベクトルと顔のOpenGL交差

enter image description here

編集:別の形で 質問: 私はそれが三角形のポイントであるならば、私はそれをyと知ることができますどのように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; 
}