FBX SDK - 从角色的ENodeId获取FbxNode

4

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

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

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

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

当我在使用Python和Pyfbxsdk在Motionbuilder中编写脚本时,无论骨架对象如何命名,都非常容易,我可以获取其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',
        ...
})

1
这是一个C++还是Python的问题?C++的FBX SDK中有GetCharacterLink(..)和FindCharacterLink(..),它们的参数集合非常不同。请参见http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=cpp_ref/class_fbx_node.html,topicNumber=cpp_ref_class_fbx_node_html6b73528d-77ae-4781-b04c-da4af82b4a08。您可以通过递归下降层次结构并在每个子FBXNode上调用GetName()来简单地提取节点名称。但我不确定这是否能解决您的问题。 - StarShine
1个回答

2
这对我很有用。
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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接