我怎么能在两点之间进行碰撞检查? (C ++)

时间:2016-07-04 12:30:50

标签: c++ collision trace points

基本上,我正在制作的程序将允许用户导入3d模型(作为fbx或obj)。然后,它将使用openGL在窗口中呈现,然后用户将能够在模型上放置点。

所以,我的问题是,如何在这两点之间进行碰撞检查。因此,如果从一个点到另一个点绘制一条直线,如果它完全击中三维模型,它可以返回“真实”。例如。如果它根本没有通过模型,它将返回' false'。

下图显示了我将如何应用此功能。 (在下面显示的图像中,线迹在与模型发生碰撞后变为绿色,我只是在搅拌机中制作图像以帮助描述我的意思。) Example of the use

1 个答案:

答案 0 :(得分: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

Ray-triangle intersection:https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm

可以进行大量优化,例如通过将模型拆分为八叉树。交点变为O(log n)而不是O(n)。有关ray-octree交叉点,请参阅此内容:Ray - Octree intersection algorithms