Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 光线和STL文件之间的光线跟踪(或投射)_Python_Stl_Mesh_Raytracing_Raycasting - Fatal编程技术网

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

Python 光线和STL文件之间的光线跟踪(或投射),python,stl,mesh,raytracing,raycasting,Python,Stl,Mesh,Raytracing,Raycasting,我有一个三维形状(一块骨头)作为STL格式的三角形网格,我正在使用Python语言 然后我有一条光线,它的原点和方向,我需要知道: 网格的哪个面与该光线碰撞 交点坐标 光线与碰撞面的法向量之间的角度 我知道‘pycaster’(),但它只适用于Python2.x,我需要使用Python3.x 我从cgkit知道'trimeshgeom'类(),但PyCharm无法将其作为解释器安装(不理解为什么) 有人知道我要怎么做吗 谢谢, 干杯 Davide我们曾经有过类似的任务,最终实现了相当简单的

我有一个三维形状(一块骨头)作为STL格式的三角形网格,我正在使用Python语言

然后我有一条光线,它的原点和方向,我需要知道:

  • 网格的哪个面与该光线碰撞
  • 交点坐标
  • 光线与碰撞面的法向量之间的角度
我知道‘pycaster’(),但它只适用于Python2.x,我需要使用Python3.x

我从cgkit知道'trimeshgeom'类(),但PyCharm无法将其作为解释器安装(不理解为什么)

有人知道我要怎么做吗

谢谢, 干杯


Davide

我们曾经有过类似的任务,最终实现了相当简单的

代码可能从以下位置被盗:

def射线三角交点(射线近、射线方向、v123):
"""
纯python中的Möller–Trumbore求交算法
基于http://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
"""
v1,v2,v3=v123
每股收益=0.000001
边1=v2-v1
边2=v3-v1
pvec=整数交叉(光线方向,边2)
det=边缘1.点(pvec)
如果abs(det)1:
返回False,无
qvec=数字交叉(tvec,边1)
v=射线方向点(qvec)*反向检测
如果v<0。或u+v>1:
返回False,无
t=边缘2.圆点(qvec)*库存数据
如果t

对于角度计算,您可以使用

Hi Joe的
向量之间的角度()
,谢谢您的回复。你知道什么是“t”吗?这里的事实是这个函数适用于一条光线和一个面。如果我有很多光线和很多面,我必须迭代这个函数一百万次。你知道有没有更高效、更省时的方法?谢谢,是的,我们重新编写了一个矢量化函数,最终为任意形状的三角形和光线生成numpy数组。之后,我们在并行线程中使用该函数。还是不够快。然后我们将这段代码移植到CUDA,从那时起,我们就在GPU上运行它了。:)如果我没记错的话,将其矢量化是一项有趣的任务,我们最终得到了五维数组:)你知道“t”是什么(返回值加上true)?
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