3

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

我知道反向操作是这样的:

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

但如何获得boneID?我已经有了boneListIndexboneName

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

4

1 回答 1

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函数有点无聊;最后一个参数用于确定是否返回实际节点或其名称 - 无论设置如何,都只会返回名称字符串。这意味着,如果皮肤中有两个具有相同名称的骨骼,则必须找到一种巧妙的方法来获取适当的节点。

于 2014-10-31T01:27:06.487 回答