如何使用 pymxs 获取 3ds max 中的最小 XYZ 值?
How can I get the min XYZ values in 3ds max using pymxs?
我正在编写一个 python 脚本来获取所选对象的西南顶点,并获取其坐标 X、Y 和 Z。
从逻辑上讲,西南点将匹配具有最小 X、Y 和 Z 的顶点。如何访问 python 中的这些值?
到目前为止,我已经能够获得对象的最小 XYZ 值,但它产生的边界框值不是预期的结果。相反,我需要顶点值。
有人可以指导我吗?
from pymxs import runtime as rt
aSelect = rt.selection[0]
minX = aSelect.min.x
minY = aSelect.min.y
minZ = aSelect.min.z
'Southwestern' 点有点开放解释(例如,我没有在名称中看到 Z),为了争论,让我们选择最有可能的两个 - 一个获得顶点的是距离对象 max 最远,并且得到 x+y+x 坐标总数最小的顶点:
from pymxs import runtime as rt
obj = rt.selection[0]
mesh = rt.snapshotAsMesh(obj)
minDiagonalVert = max(list(mesh.verts), key=lambda vert: rt.distance(vert.pos, obj.max))
minTotalVert = min(list(mesh.verts), key=lambda vert: vert.pos.x + vert.pos.y + vert.pos.z)
rt.delete(mesh)
很明显,这仅适用于某些类型的网格,但在这种情况下,您可以自行设置要匹配的标准。
非常感谢 Swordslayer,它帮助我了解了如何访问顶点信息。
是的,你是对的 'southwestern' 不一定包括 Z,但隐含地我需要具有最低值的 Z,并且为了我的目的,这个最小 Z 应该等于 0。
无论如何,现在我可以玩了,它完全符合我的需要,使用这些值将枢轴位置移动到我对象的这个西南点:
from pymxs import runtime as rt
from operator import itemgetter
anchor = rt.point3(0,0,0)
if len(rt.selection) == 0:
print('no object selected! please select one object')
elif len(rt.selection) > 1:
print('too much objects selected! please select one object')
else:
aSelect = rt.selection[0]
mesh = rt.convertToMesh (aSelect)
vertices = list(mesh.verts)
positions = []
for i in range(len(vertices)):
positions.append(vertices[i].pos)
positions = sorted(positions, key=itemgetter(2,1,0))
minX = positions[0][0]
minY = positions[0][1]
minZ = positions[0][2]
anchor = rt.point3(minX,minY,minZ)
aSelect.pivot = anchor
print('anchor set @ minX: {}, minY: {}, minZ: {}'.format(minX,minY,minZ))
我正在编写一个 python 脚本来获取所选对象的西南顶点,并获取其坐标 X、Y 和 Z。
从逻辑上讲,西南点将匹配具有最小 X、Y 和 Z 的顶点。如何访问 python 中的这些值?
到目前为止,我已经能够获得对象的最小 XYZ 值,但它产生的边界框值不是预期的结果。相反,我需要顶点值。
有人可以指导我吗?
from pymxs import runtime as rt
aSelect = rt.selection[0]
minX = aSelect.min.x
minY = aSelect.min.y
minZ = aSelect.min.z
'Southwestern' 点有点开放解释(例如,我没有在名称中看到 Z),为了争论,让我们选择最有可能的两个 - 一个获得顶点的是距离对象 max 最远,并且得到 x+y+x 坐标总数最小的顶点:
from pymxs import runtime as rt
obj = rt.selection[0]
mesh = rt.snapshotAsMesh(obj)
minDiagonalVert = max(list(mesh.verts), key=lambda vert: rt.distance(vert.pos, obj.max))
minTotalVert = min(list(mesh.verts), key=lambda vert: vert.pos.x + vert.pos.y + vert.pos.z)
rt.delete(mesh)
很明显,这仅适用于某些类型的网格,但在这种情况下,您可以自行设置要匹配的标准。
非常感谢 Swordslayer,它帮助我了解了如何访问顶点信息。
是的,你是对的 'southwestern' 不一定包括 Z,但隐含地我需要具有最低值的 Z,并且为了我的目的,这个最小 Z 应该等于 0。
无论如何,现在我可以玩了,它完全符合我的需要,使用这些值将枢轴位置移动到我对象的这个西南点:
from pymxs import runtime as rt
from operator import itemgetter
anchor = rt.point3(0,0,0)
if len(rt.selection) == 0:
print('no object selected! please select one object')
elif len(rt.selection) > 1:
print('too much objects selected! please select one object')
else:
aSelect = rt.selection[0]
mesh = rt.convertToMesh (aSelect)
vertices = list(mesh.verts)
positions = []
for i in range(len(vertices)):
positions.append(vertices[i].pos)
positions = sorted(positions, key=itemgetter(2,1,0))
minX = positions[0][0]
minY = positions[0][1]
minZ = positions[0][2]
anchor = rt.point3(minX,minY,minZ)
aSelect.pivot = anchor
print('anchor set @ minX: {}, minY: {}, minZ: {}'.format(minX,minY,minZ))