FBX SDK - 从角色的 ENodeId 获取 FbxNode

Posted

技术标签:

【中文标题】FBX SDK - 从角色的 ENodeId 获取 FbxNode【英文标题】:FBX SDK - Get the FbxNode from an ENodeId of a Character 【发布时间】:2015-11-09 07:44:52 【问题描述】:

是否可以从枚举 ENodeId 中获取关联的 FbxNode ? 例如,如果我想从 Character::eLeftHand 获取 FbxNode

我尝试使用Character::GetCharacterLink(ENodeId, FbxCharacterLink) 然后通过调用FbxCharacterLink::mNodeFbxCharacterLink提取FbxNode

但是,对于大多数 ENodeIds,此函数返回 False,因此不会创建 FbxCharacterLink

character = myScene.GetCharacter(0)
lefthand = character.eLeftHand
lefthand_node = FbxCharacterLink()
character.GetCharacterLink(lefthand, lefthand_node) # False
lefthand_node = lefthand_node.mNode

当我在 Motionbuilder 中使用 Python 和 Pyfbxsdk 编写脚本时,非常简单,无论骨架对象如何命名,我都可以得到它的 FBXObject

m = character.GetModel(self.BodyNodeObject[o])

BodyNodeObject 是用

生成的
def BodyNodes(self):
    for i in dir(FBBodyNodeId):
        if i[0] == 'k':
            try:
                self.BodyNodeObject[BodyNodesId[i]] = getattr(FBBodyNodeId, i)
            except:
                pass

BodyNodesId 只是一个字典

BodyNodesId = OrderedDict(
        'kFBChestNodeId':'Spine1',
        'kFBHeadNodeId':'Head',
        'kFBHipsNodeId':'Hips',
        'kFBLeftAnkleNodeId':'LeftFoot',
        'kFBLeftCollarNodeId':'LeftShoulder',
        'kFBLeftElbowNodeId':'LeftForeArm',
        ...
)

【问题讨论】:

这是一个 c++ 还是 python 问题? c++ 的 FBX SDK 声明 GetCharacterLink(..) 和 FindCharacterLink(..) 的参数集完全不同。见docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/…。您可以简单地通过递减层次结构并在每个子 FBXNode 处调用 GetName() 来提取节点名称。但我不确定这是否能解决您的问题。 【参考方案1】:

这对我有用

from fbx import *

for i in range(myscene.GetCharacterCount()):
    character = myscene.GetCharacter(i)
    node = character.eHips
    link = FbxCharacterLink()
    while (character.GetCharacterLink(node, link)):
        print node, link.mNode.GetName()
        node = character.ENodeId(int(node+1))

【讨论】:

以上是关于FBX SDK - 从角色的 ENodeId 获取 FbxNode的主要内容,如果未能解决你的问题,请参考以下文章

FBX SDK:如何逐点变换矩阵?

使用 fbx sdk c++ 从 fbx 读取纹理文件名

使用 FBX SDK 获取索引

FBX SDK 从2012.1 到 2013.3 变化

如何使用 FBX SDK 在 fbx 文件中加载嵌入的纹理? [关闭]

fbx sdk 支持ios android吗