少しでも自動的に動かそうと思ったと時に何気なく困るのがActor人形。

その4で説明したとおりTRS(Translation,Rotation,Scale)をGetVectorで取得することはできるのですが、 SetVectorは機能しません。 なぜなのか?

わかりません!

なぜなら・・・FBActorクラスはBlackBoxなのです!

説明になっていませんが謎だらけなのであまり深く考えない方向で。

というわけで、SetVectorの代わりになるAttributeがあります。

 

 

■アクターボディのTRSを設定するAttribute

[python]
SetActorTranslation #Hipsにしか対応していません
SetDefinitionScaleVector
SetDefinitionRotationVector
[/python]

アクター人形のTranslationはHipsに集約されています。

実際のキャラモデルの構造と比較しても一般的なのでしょうね。

なのでアクター人形は各パーツ毎の移動は基本的にはご法度のようです。

しかし、アクターボディは各アクターの体の形に合わせて体を作ってあげる事が目的のはず。

マニピュレーターを使ってボディパーツ毎の移動なんてのは常套手段なのでこれまた謎。

ただし、pivotの位置だけは移動できます。寄り道なのでこれは最後に書きます。

 

 

■アクターボディのTRSを設定する

[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pyfbsdk import FBSystem,FBApplication,FBActor,FBVector3d,FBSkeletonNodeId,FBModelTransformationType

## get method
def GetTRS( pObj, pBool ):
lTransform = [
FBModelTransformationType.kModelTranslation,
FBModelTransformationType.kModelRotation,
FBModelTransformationType.kModelScaling
]
lTRS = [FBVector3d(),FBVector3d(),FBVector3d()]
for i in range(len(lTRS)):
pObj.GetVector(lTRS[i],lTransform[i],pBool)
return lTRS

## main
IS_GLOBAL = True
lComps = FBSystem().Scene.Components
lBodyTRSDic = {};
lActor = FBApplication().CurrentActor
if not lActor:
lActor = FBActor("mike")
FBApplication().CurrentActor = lActor

for lComp in lComps:
if lComp and "ActorBodyMesh" in lComp.LongName:
lTRS = GetTRS(lComp, IS_GLOBAL)
lBodyTRSDic[lComp.Name] = lTRS #Dictionary型にkeyとvalueを設定する

lActor.SetActorTranslation(lBodyTRSDic["Hips"][0]) #HipsにしかTransは設定できない。

for enum in FBSkeletonNodeId.values:
lNodeId = FBSkeletonNodeId.values[enum] #nodeの名前を取得
lDicName = lNodeId.name.split("kFBSkeleton")[1].split("Index")[0] #node名をDictionary型に登録したkeyの名前と同じにする
if lBodyTRSDic.has_key(lDicName):
lRot = lBodyTRSDic[lDicName][1]
lScl = lBodyTRSDic[lDicName][2]
lRot[0] += 10
lScl[0] += 10
lActor.SetDefinitionRotationVector(lNodeId,lRot) #nodeを指定して値を設定する
lActor.SetDefinitionScaleVector(lNodeId,lScl) #nodeを指定して値を設定する

[/python]

 

 

■pivot位置に関するAttribute

[python]

FBPropertyVector3d ChestPosition
FBPropertyVector3d HeadPosition
FBPropertyVector3d HipsPosition
FBPropertyVector3d LeftAnklePosition
FBPropertyVector3d LeftCollarPosition
FBPropertyVector3d LeftElbowPosition
FBPropertyVector3d LeftFootPosition
FBPropertyVector3d LeftHipPosition
FBPropertyVector3d LeftKneePosition
FBPropertyVector3d LeftShoulderPosition
FBPropertyVector3d LeftWristPosition
FBPropertyVector3d NeckPosition
FBPropertyVector3d RightAnklePosition
FBPropertyVector3d RightCollarPosition
FBPropertyVector3d RightElbowPosition
FBPropertyVector3d RightFootPosition
FBPropertyVector3d RightHipPosition
FBPropertyVector3d RightKneePosition
FBPropertyVector3d RightShoulderPosition
FBPropertyVector3d RightWristPosition
[/python]

移動させるときの注意点としては

①オブジェクトの中央がpivot位置じゃない
②値はLocal表示
③Global座標軸に沿って動く

という3点でしょう。

①ありえる話
②Motionbuilderでは日常茶飯事
③・・・え?

③はもしかしてpivotに関して僕が知識不足なだけなのかも・・・?

使いにくいったらありゃしないですね。