【问题标题】:Ray-tracing (or casting) between rays and STL file光线和 STL 文件之间的光线追踪(或投射)
【发布时间】:2018-12-19 12:04:50
【问题描述】:

我有一个 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 无法将其安装为解释器(不明白为什么)。

有人知道我怎么做我想做的事吗?

谢谢, 干杯,

大卫

【问题讨论】:

    标签: python stl mesh raytracing raycasting


    【解决方案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
    

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

    【讨论】:

    • 嗨,乔,感谢您的回复。你知道什么是“不”吗?
    • 这里的事实是这个函数适用于 1 射线和 1 面。如果我有很多光线和很多面孔,我必须将这个函数迭代一百万次。你知道是否存在更高效、更省时的方法吗?谢谢,
    • 没错,我们将其重写为一个矢量化函数,最终将 numpy 数组用于三角形和任意形状的射线。之后,我们在并行线程中使用了该函数。还是不够快。然后我们将这段代码准确地移植到 CUDA,从那时起我们就在 GPU 上运行它。 :)
    • 如果我没记错的话,对它进行矢量化是一项有趣的任务,我们最终得到了五维数组:)
    • 你知道't'是什么(返回值加上true)吗?
    猜你喜欢
    • 2011-08-29
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多