python - 使用光线投射测量点到表面的距离
问题描述
我正在尝试测量从给定点到网格中每个顶点的距离,以及获取与我正在测量顶点距离的网格中包含的网格的交点。
我启动了一个新的搅拌机文件,并删除了默认对象。然后我创建一个圆柱体和一个圆,并将圆放大两倍。我先选择圆,然后选择圆柱,然后运行以下脚本。我得到输出:
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)
我希望这两个数字保持完全相同,因为我只是在翻译形状而没有任何缩放。显然,我误解了光线投射的情况。我曾尝试在起点/终点位置绘制空箱,但这对我的理解毫无帮助。
解决方案
推荐阅读
- prolog - 我想知道是否有任何方法可以在 prolog 中动态存储谓词然后调用它
- rust - 局部变量的 Rust 异步问题
- node.js - 根据推送的反应/应用程序机器人将用户添加到角色
- android - 有什么方法可以在 Android 中检测单个片段的 userInterations 吗?
- oracle - JSON 完整性检查触发“表或视图不存在”
- javascript - React Native Tab View:如果嵌套在FlatList中,如何弯曲1场景?
- javascript - 如何在 ApexCharts.js 中的图例系列上悬停时显示图例工具提示
- c++ - Curl 二进制链接错误:LNK1104: 无法打开文件 myproject\externals\curl-7.71.1-win32-mingw\lib.obj
- python - 如何从此数据类型中提取十六进制值?- Python cantools
- javascript - 更新 axios 请求分页