光线与STL文件之间的光线跟踪(或投射)

时间:2018-07-11 12:35:12

标签: python stl mesh raytracing raycasting

我有一个3D形状(骨头),是STL格式的三角形网格,并且正在使用Python语言。

然后我有一条射线及其起点和方向,我需要知道:

  • 网格的哪个面与该射线碰撞
  • 交点坐标
  • 射线与碰撞后的脸的法线向量之间的角度

我知道'pycaster'(https://pyscience.wordpress.com/2014/09/21/ray-casting-with-python-and-vtk-intersecting-linesrays-with-surface-meshes/),但是它仅适用于Python 2.x,我需要使用Python 3.x。

我从cgkit知道'trimeshgeom'类(http://cgkit.sourceforge.net/doc2/_sources/trimeshgeom.txt),但是PyCharm无法将其安装为解释器(无法理解原因)。

有人知道我该怎么做吗?

谢谢, 干杯,

Davide

1 个答案:

答案 0 :(得分:1)

我们曾经有过类似的任务,最终实现了相当简单的 Möller-Trumbore-Algorithm

可以从printrun窃取代码:

def ray_triangle_intersection(ray_near, ray_dir, v123):
    """
    Möller–Trumbore intersection algorithm in pure python
    Based on http://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
    """
    v1, v2, v3 = v123
    eps = 0.000001
    edge1 = v2 - v1
    edge2 = v3 - v1
    pvec = numpy.cross(ray_dir, edge2)
    det = edge1.dot(pvec)
    if abs(det) < eps:
        return False, None
    inv_det = 1. / det
    tvec = ray_near - v1
    u = tvec.dot(pvec) * inv_det
    if u < 0. or u > 1.:
        return False, None
    qvec = numpy.cross(tvec, edge1)
    v = ray_dir.dot(qvec) * inv_det
    if v < 0. or u + v > 1.:
        return False, None

    t = edge2.dot(qvec) * inv_det
    if t < eps:
        return False, None

return True, t

对于角度计算,您可以使用例如transformations.py中的angle_between_vectors()