2016-07-04 6 views
2

私が作っているプログラムは、ユーザーが3Dモデル(fbxまたはobj)をインポートできるようにします。 OpenGLを使用してウィンドウ内にレンダリングされると、ユーザーはモデル上にポイントを配置できます。2点間の衝突チェックはどうすればできますか? (C++)

私の問題は、どうやってこれらの2点間の衝突チェックを行うことができるかということです。したがって、ある点から別の点に直線が引かれた場合、3Dモデルにまったく当たった場合、例えば「真」を返すことができます。モデルをまったく通過しない場合は、「false」が返されます。

以下のイメージは、どのように私がこれを適用するかを示しています。 (それがモデルに衝突した後にライントレースの下に示す画像では緑色になり、私はちょうど私が何を意味するか説明を助けるためにブレンダーでイメージを作った。) Example of the use

+0

ポリゴン間の衝突検出を最適に実行する方法に関する全書が書かれています。 –

+0

プログラミングよりも数学的な問題が多いように思えます。 IMHOオフトピックのstackoverflow。別のスタック交換を試してみませんか? –

答えて

2

擬似コード:

function rayhitsmodel(model, pointA, pointB): 

    max-distance <- distance-between(pointA, pointB) 
    ray-source <- pointA 
    ray-direction <- normalize-vector(pointB - pointA) 

    for each triangle-index in model.triangle-indices: 

     p1 <- model.points[triangle-index.point1] 
     ... similarly for p2, p3 

     triangle <- p1, p2, p3 
     intersection <- intersect-with-triangle(ray-source, ray-direction, triangle) 

     if intersection is not nothing 
      and distance-between(intersection.point, ray-source) <= max-distance 
       return true 

    return false 

レイ三角形の交差:https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm

大幅に最適化することができます。モデルをオクトリーに分割します。交点はO(n)ではなくO(log n)になります。レイ・オクトリー交差については、Ray - Octree intersection algorithmsを参照してください。

関連する問題