使用射线投射测量点到表面的距离

时间:2018-10-04 20:27:10

标签: python 3d blender raycasting

我正在尝试测量从给定点到网格中每个顶点的距离,并获取与要测量顶点距离的网格中包含的网格的相交点。

我启动一个新的Blender文件,并删除默认对象。然后,我创建一个圆柱体和一个圆,然后将圆放大两倍。我首先选择圆,然后选择圆柱,然后运行以下脚本。我得到了输出:

31.999999889172614
127.99999830127179

然后选择两个对象,并将它们在x方向平移一个。选择圆,然后选择圆柱,然后再次运行脚本,给出以下输出:

0.154086219612509
127.99999919534139

我将第二个数字的变化归因于光线投射,因为它永远不会变化太多,因此有些不精确。但是,第一个数字会根据我将对象移动到哪里而发生巨大变化,这让我感到困惑。

import bpy
import mathutils
import bmesh

def bmesh_copy_from_object(obj):
    me = obj.data
    bm = bmesh.new()
    bm.from_mesh(me)

    bm.transform(obj.matrix_world)

    return bm

inner = bpy.context.object
outer = (ob for ob in bpy.context.selected_objects if ob != inner).__next__()

inner_bm = bmesh_copy_from_object(inner)
outer_bm = bmesh_copy_from_object(outer)

inner_tree = mathutils.bvhtree.BVHTree.FromBMesh(inner_bm)
outer_tree = mathutils.bvhtree.BVHTree.FromBMesh(outer_bm)

cl = bpy.context.scene.cursor_location

innermw = inner.matrix_world
innermw_inv = innermw.inverted()

sum = 0

for v in outer_bm.verts:
    origin = innermw_inv * cl 
    dest = innermw_inv * v.co
    direc = (dest - origin).normalized()

    res, co, no, index = inner_tree.ray_cast(origin, direc)
    if res:
        co_adj = innermw * co
        between = co_adj.dot(co_adj)
        sum += between
    else:
        print(res)

print(sum)

sum = 0

for v in outer_bm.verts:
    vec = v.co - cl
    between = vec.dot(vec)
    sum += between

print(sum)

我希望两个数字保持完全相同,因为我只是在不进行任何缩放的情况下平移形状。显然,我误解了射线广播到底是怎么回事。我曾尝试在起点/终点位置绘制空容器,但这完全没有帮助我理解。

0 个答案:

没有答案