如何使用 pymxs 获得 3ds max 中的最小 XYZ 值?

Posted

技术标签:

【中文标题】如何使用 pymxs 获得 3ds max 中的最小 XYZ 值?【英文标题】:How can I get the min XYZ values in 3ds max using pymxs? 【发布时间】:2021-10-29 10:09:48 【问题描述】:

我正在编写一个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

【问题讨论】:

【参考方案1】:

非常感谢剑客,它帮助我了解了如何访问顶点信息。

是的,你说得对,“西南”不一定包括 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))

【讨论】:

【参考方案2】:

'Southwestern' 点有点容易解释(例如,我没有看到名称中的 Z),为了争论,让我们选择最有可能的两个 - 一个得到最远离的顶点最大对象,以及获得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)

很明显,这仅适用于某种网格,但在这种情况下,您可以自行设置要匹配的标准。

【讨论】:

以上是关于如何使用 pymxs 获得 3ds max 中的最小 XYZ 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 3ds Max 材质到模型的映射

如何将网游<天龙八部>中的人物和珍兽模型导入至3DS Max并进行编辑?

3ds Max 中的导航控件SteeringWheels入门介绍

如何在 3Ds Max 中查看边长

在 3ds max 2016 中如何纠正 VRay 渲染的鱼眼图像?

如何将彩色网格从 meshlab 导入统一!(可能到 3ds max)