基本上,我正在制作的程序将允许用户导入3d模型(作为fbx或obj)。然后,它将使用openGL在窗口中呈现,然后用户将能够在模型上放置点。
所以,我的问题是,如何在这两点之间进行碰撞检查。因此,如果从一个点到另一个点绘制一条直线,如果它完全击中三维模型,它可以返回“真实”。例如。如果它根本没有通过模型,它将返回' false'。
下图显示了我将如何应用此功能。 (在下面显示的图像中,线迹在与模型发生碰撞后变为绿色,我只是在搅拌机中制作图像以帮助描述我的意思。) Example of the use
答案 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。