从其名称或MaxScript中的皮肤列表中的索引获取骨骼ID

时间:2014-09-12 23:34:29

标签: scripting 3dsmax maxscript

我有一个骨骼名称(例如Bone002),我想获取它的骨骼ID(不是皮肤列表中的索引,而是skinOps.SetVertexWeights中所需的ID)。< / p>

我知道反向操作看起来像这样:

skinMod = $.modifiers[#skin]
boneListIndex = (skinOps.GetVertexWeightBoneID skinMod v w)
local boneName = skinOps.GetBoneNameByListID skinMod boneListIndex 0

但是如何获得boneID?我已经boneListIndexboneName

我假设所有骨骼都有唯一的名称。

1 个答案:

答案 0 :(得分:3)

您使用的是哪种版本的3dsMax?我记得这里的文档比较混乱。在这种情况下,Bone_ID和vertex_bone_integer是可以互换的 - 我只是在一个简单的网格上测试,而SkinOps.GetVertexWeightBoneID和SkinOps.SetVertexWeights使用相同的骨骼索引。

如果要按名称查找,则需要按名称匹配索引。使用骨骼名称创建一个数组:

boneNames = for i=1 to (skinOps.GetNumberBones skinMod) collect (skinOps.GetBoneName skinMod i 0)

然后你可以使用自己喜欢的搜索方法并检索索引,一个简单的findItem在这里运行良好:

boneIndex = findItem boneNames "Bone002"

请注意, skinOps.GetBoneName 功能略有不足;最后一个参数用于确定是返回实际节点还是其名称 - 无论设置如何,只返回名称字符串。这意味着如果皮肤中有两个具有相同名称的骨骼,那么您必须找到一种如何获取相应节点的巧妙方法。