如何使用 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))