【问题标题】:FBX SDK - Get the FbxNode from an ENodeId of a CharacterFBX SDK - 从角色的 ENodeId 获取 FbxNode
【发布时间】: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() 来提取节点名称。但我不确定这是否能解决您的问题。

标签: python c++ autodesk fbx motionbuilder


【解决方案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))

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2018-11-28
    • 2013-11-07
    • 2011-07-04
    • 2021-09-30
    • 2012-06-11
    • 2018-04-11
    • 2019-05-21
    • 2021-04-07
    相关资源
    最近更新 更多