今日はその8の続きでMarkerSetにObjectを登録する方法のお話。
やばい、中身濃いです。。。
■MarkerSetにObjectを登録する
[python]
from pyfbsdk import FBApplication,FBActor,FBMarkerSet,FBModelMarker,FBSkeletonNodeId
lActor = FBApplication().CurrentActor
lMkSet = None
if not lActor:
lActor = FBActor("mike")
lMkset = FBMarkerSet("mike_Mkset")
lActor.MarkerSet = lMkset
if not lMkSet:
lMkSet = lActor.MarkerSet
#print FBSkeletonNodeId.names
for enum in FBSkeletonNodeId.values:
lSkelNode = FBSkeletonNodeId.values[enum]
if "Hips" in lSkelNode.name:
lObj = FBModelMarker("Hip")
lMkSet.AddMarker(lSkelNode, lObj)
print "add %s to %s MarkerSet"%(lObj.Name,lMkSet.Name)
[/python]
FBMarkerSetのAttributeにはAddMarkerがあってそれを使って登録します。
ここで厄介なのが第一引数にFBSkeletonNodeIdなるものを指定しなければいけないこと。
存在を知っている人のほうが少ない気がしますが、アクター人形の骨を管理しているenum(構造体)です。
FBSkeletonNodeIdのAttributeに関しては13行目のプリントを実行して確認してください。
※ここに書くと見にくい事この上ない状態になるので許してください
ここで注意しなければならないのが肩、肘のFBSkeletonNodeIdのネーミングが一般的な日本人の感覚とはずれているところ。
試しに左肩に登録することを考えてみましょう。
左肩なのでSDK Documentを参照すると、
FBSkeletonNodeId.kFBSkeletonLeftShoulderIndexがありました。
という事はこのIDを使ってマーカーを登録すると考えるのが妥当ですよね?
ということで実際に登録してみると。。。。
■MarkerSetのLeftShoulderにマーカーを登録する。
[python]
from pyfbsdk import FBApplication,FBActor,FBMarkerSet,FBModelMarker,FBSkeletonNodeId
lActor = FBApplication().CurrentActor
lMkSet = None
if not lActor:
lActor = FBActor("mike")
lMkset = FBMarkerSet("mike_Mkset")
lActor.MarkerSet = lMkset
if not lMkSet:
lMkSet = lActor.MarkerSet
lObj = FBModelMarker("LeftShoulder")
lSkelNode = FBSkeletonNodeId.kFBSkeletonLeftShoulderIndex
lMkSet.AddMarker(lSkelNode, lObj)
[/python]
_, ,_
( ・д・) そこ肘やん!!
⊂彡☆))Д´)
ということで万人に理解しやすい様に対応表を書いておくと
■登録したマーカーを解除する方法
[python]
from pyfbsdk import FBApplication,FBActor,FBMarkerSet,FBModelMarker
lActor = FBApplication().CurrentActor
lMkSet = None
if not lActor:
lActor = FBActor("mike")
lMkset = FBMarkerSet("mike_Mkset")
lActor.MarkerSet = lMkset
if not lMkSet:
lMkSet = lActor.MarkerSet
lName = "LeftShoulder"
lObj = FBModelMarker(lName)
lIndex = 1
lIsUse = False
lMkSet.PropertyList.Find("%s%d.Used"%(lName,lIndex)).Data = lIsUse
lMkSet.PropertyList.Find("%s%d.Name"%(lName,lIndex)).Data = ""
lProp = lMkSet.PropertyList.Find("%s%d.Model"%(lName,lIndex))
lProp.remove(lMdl)
[/python]
めちゃくちゃ重要なんですがFBMarkerSetの各部位のPropertyにアクセスする際、
部位名.Model
ではなく、
部位名1.Model
部位名2.Model
になります。
これさえ理解していればいろいろと捗ります。
皆さん気づきましたか?
FBSkeletonNodeId登録を解除するときには使ってないんですよねぇ。
ということで登録もFBSkeletonIdを使わずに実はできちゃいます!
■FBMarkerSetにオブジェクトを登録する(PropertyList ver)
[python]
from pyfbsdk import FBApplication,FBActor,FBMarkerSet,FBModelMarker
lActor = FBApplication().CurrentActor
lMkSet = None
if not lActor:
lActor = FBActor("mike")
lMkset = FBMarkerSet("mike_Mkset")
lActor.MarkerSet = lMkset
if not lMkSet:
lMkSet = lActor.MarkerSet
lIndex = 1
lIsUse = True
lName = "LeftShoulder"
lMkSet.PropertyList.Find("%s%d.Used"%(lName,lIndex)).Data = lIsUse
lMkSet.PropertyList.Find("%s%d.Name"%(lName,lIndex)).Data = lName
lProp = lMkSet.PropertyList.Find("%s%d.Model"%(lName,lIndex))
lProp.add(lMdl)
[/python]
- 投稿タグ
- AddMarker, FB, FBSkeletonNodeId, MB, MotionBuilder, Propety, py, pyfbsdk, python