Intersection between line and triangle in 3D

前端 未结 3 1708
盖世英雄少女心
盖世英雄少女心 2020-12-28 23:12

I have a line and a triangle somewhere in 3D space. In other words, I have 3 points ([x,y,z] each) for the triangle, and two points (also [x,y,z]) for the line.

I ne

3条回答
  •  温柔的废话
    2020-12-28 23:57

    @BrunoLevi: your algorithm does not seem to work, see the following python implementation:

    def intersect_line_triangle(q1,q2,p1,p2,p3):
        def signed_tetra_volume(a,b,c,d):
            return np.sign(np.dot(np.cross(b-a,c-a),d-a)/6.0)
    
        s1 = signed_tetra_volume(q1,p1,p2,p3)
        s2 = signed_tetra_volume(q2,p1,p2,p3)
    
        if s1 != s2:
            s3 = signed_tetra_volume(q1,q2,p1,p2)
            s4 = signed_tetra_volume(q1,q2,p2,p3)
            s5 = signed_tetra_volume(q1,q2,p3,p1)
            if s3 == s4 and s4 == s5:
                n = np.cross(p2-p1,p3-p1)
                t = -np.dot(q1,n-p1) / np.dot(q1,q2-q1)
                return q1 + t * (q2-q1)
        return None
    

    My test code is:

    q0 = np.array([0.0,0.0,1.0])
    q1 = np.array([0.0,0.0,-1.0])
    p0 = np.array([-1.0,-1.0,0.0])
    p1 = np.array([1.0,-1.0,0.0])
    p2 = np.array([0.0,1.0,0.0])
    
    print(intersect_line_triangle(q0,q1,p0,p1,p2))
    

    gives:

    [ 0.  0. -3.] 
    

    instead of the expected

    [ 0.  0. 0.]
    

    looking at the line

    t = np.dot(q1,n-p1) / np.dot(q1,q2-q1)
    

    Subtracting p1 from the normal doesn't make sense to me, you want to project from q1 onto the plane of the triangle, so you need to project along the normal, with a distance that is proportional to the ratio of the distance from q1 to the plane and q1-q2 along the normal, right?

    The following code fixes this:

    n = np.cross(p2-p1,p3-p1)
    t = np.dot(p1-q1,n) / np.dot(q2-q1,n)
    return q1 + t * (q2-q1)
    

提交回复
热议问题