今日はその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のネーミングが一般的な日本人の感覚とはずれているところ。

 

 

09_MarkerSet_01

試しに左肩に登録することを考えてみましょう。

左肩なので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]

 

 

■結果
09_MarkerSet_02

_, ,_
( ・д・) そこ肘やん!!
⊂彡☆))Д´)

ということで万人に理解しやすい様に対応表を書いておくと

 

 

■対応表
09_MarkerSet_03

 

 

■登録したマーカーを解除する方法

[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]