2012年11月29日木曜日

etc - QUMARION to Blender(1)

QUMARIONのSDKが学術目的または評価目的で使用するユーザ向けに、 無償で公開されました!

ただしC++用です!


早速Pythonで使えるか、Blenderで使えるかを評価するためハックを始めましょう!

この技術情報は、SDKを入手する前に知り得た情報であるので、公開しても問題ないであろうと思いますが、問題あった場合は直ちに公開停止されることでしょう。



Blenderから使うには、Pythonからアクセスできねばなりません。
Pythonから使うには、Pythonのctypeを使ってネイティブのDLLにアクセスするとか、
Boost.Pythonを使ってラップしたDLLを作る(最近覚え中)などがあります。

では、早速dependencywalkerでDLLを開きます。


開きました。これはなにやらシンプルな記述の関数がならんでいますね。
これはctypeでさくっといけそうな感じです。
しかしこれはちょっとシンプルすぎて使えません。右クリックして「Undecorate C++ Functions」のチェックを外しましょう

外しました。


これです!これが必要らしいのです。ctypeとかいうやつには。

早速QmPdkDll.dllがある場所でコンソールでPythonを開き、以下のように打ち込みます。



なんとかInitとかいう初期化っぽいのを呼んでみました。
「0」が返ってきました。ちょっと成功したのか分からんですね。
まぁそういうときはヘッダがあるのでヘッダファイルを見ます。
すると、どうやら成功しているようです。


といった感じでゴリゴリ書いていきます。
折角なのでクラス化しておきましょう。


class QmPdk:

 def __init__(self):
  """
   The constructor.
  """
  qmpdk = CDLL("QmPdkDll.dll")
  self.QmPdkCalibratePose = \
   getattr(qmpdk, "?QmPdkCalibratePose@@YAHH@Z")
  self.QmPdkCharacterCreate = \
   getattr(qmpdk, "?QmPdkCharacterCreate@@YAHPAHH0PAPBD@Z")
  self.QmPdkCharacterDestroy = \
   getattr(qmpdk, "?QmPdkCharacterDestroy@@YAHH@Z")
  self.QmPdkCharacterGetHandle = \
   getattr(qmpdk, "?QmPdkCharacterGetHandle@@YAHHPAH@Z")
  self.QmPdkCharacterGetLocalMatrix = \
   getattr(qmpdk, "?QmPdkCharacterGetLocalMatrix@@YAHHHQAY03M@Z")
  self.QmPdkCharacterGetName = \
   getattr(qmpdk, "?QmPdkCharacterGetName@@YAHHHPADH0H@Z")
  self.QmPdkCharacterGetNumOfHandle = \
   getattr(qmpdk, "?QmPdkCharacterGetNumOfHandle@@YAHPAH@Z")
  self.QmPdkCharacterGetQumaHandle = \
   getattr(qmpdk, "?QmPdkCharacterGetQumaHandle@@YAHHPAH@Z")
  self.QmPdkCharacterGetRotate = \
   getattr(qmpdk, "?QmPdkCharacterGetRotate@@YAHHHQAY03M@Z")
  self.QmPdkCharacterMemorizeInitialPose = \
   getattr(qmpdk, "?QmPdkCharacterMemorizeInitialPose@@YAHH@Z")
  self.QmPdkCharacterRecallInitialPose = \
   getattr(qmpdk, "?QmPdkCharacterRecallInitialPose@@YAHH@Z")
  self.QmPdkCharacterSetLocalMatrix = \
   getattr(qmpdk, "?QmPdkCharacterSetLocalMatrix@@YAHHHQAY03M@Z")
  self.QmPdkCharacterSetRotate = \
   getattr(qmpdk, "?QmPdkCharacterSetRotate@@YAHHHQAY03M@Z")
  self.QmPdkCopyPose = \
   getattr(qmpdk, "?QmPdkCopyPose@@YAHH@Z")
  self.QmPdkEnable = \
   getattr(qmpdk, "?QmPdkEnable@@YAHHH@Z")
  self.QmPdkEnableAccelerometer = \
   getattr(qmpdk, "?QmPdkEnableAccelerometer@@YAHHH@Z")
  self.QmPdkFinal = \
   getattr(qmpdk, "?QmPdkFinal@@YAHXZ")
  self.QmPdkGetVersionStr = \
   getattr(qmpdk, "?QmPdkGetVersionStr@@YAHPADPAH@Z")
  self.QmPdkInit = \
   getattr(qmpdk, "?QmPdkInit@@YAHXZ")
  self.QmPdkIsEnable = \
   getattr(qmpdk, "?QmPdkIsEnable@@YAHHPAH@Z")
  self.QmPdkLoadCalibrationDataFile = \
   getattr(qmpdk, "?QmPdkLoadCalibrationDataFile@@YAHHPBD@Z")
  self.QmPdkNnbCreateGroup = \
   getattr(qmpdk, "?QmPdkNnbCreateGroup@@YAHHHPAH@Z")
  self.QmPdkNnbIsValid = \
   getattr(qmpdk, "?QmPdkNnbIsValid@@YAHHPAH@Z")
  self.QmPdkNnbLoadFromFile = \
   getattr(qmpdk, "?QmPdkNnbLoadFromFile@@YAHHPBD0@Z")
  self.QmPdkNnbLoadFromMem = \
   getattr(qmpdk, "?QmPdkNnbLoadFromMem@@YAHHPBDH@Z")
  self.QmPdkNnbOpenMappingWindow =\
   getattr(qmpdk, "?QmPdkNnbOpenMappingWindow@@YAHHI@Z")
  self.QmPdkNnbSaveToFile = \
   getattr(qmpdk, "?QmPdkNnbSaveToFile@@YAHHHPBD@Z")
  self.QmPdkNnbSaveToMem = \
   getattr(qmpdk, "?QmPdkNnbSaveToMem@@YAHHHPADPAH@Z")
  self.QmPdkNnbSetGroup = \
   getattr(qmpdk, "?QmPdkNnbSetGroup@@YAHHHHPAHH0@Z")
  self.QmPdkQumaAttachInitPoseModel = \
   getattr(qmpdk, "?QmPdkQumaAttachInitPoseModel@@YAHHH@Z")
  self.QmPdkQumaDetachModel = \
   getattr(qmpdk, "?QmPdkQumaDetachModel@@YAHH@Z")
  self.QmPdkQumaGetButtonState = \
   getattr(qmpdk, "?QmPdkQumaGetButtonState@@YAHHHPAH@Z")
  self.QmPdkQumaGetHandle = \
   getattr(qmpdk, "?QmPdkQumaGetHandle@@YAHHPAH@Z")
  self.QmPdkQumaGetNumOfHandle = \
   getattr(qmpdk, "?QmPdkQumaGetNumOfHandle@@YAHPAH@Z")
  self.QmPdkQumaIsPoseChanged =\
   getattr(qmpdk, "?QmPdkQumaIsPoseChanged@@YAHHPAH@Z")
  self.QmPdkSaveCalibrationDataFile = \
   getattr(qmpdk, "?QmPdkSaveCalibrationDataFile@@YAHHPBD@Z")


ひたすらコピーペーストしていくだけの簡単かつ面倒な作業です。 まぁこれ↑実はSDK公開前にせこせこmaya用についてたDLLをハックしてたやつなので、今の関数と違うかもしれませんが、それは(2)とか(3)とかで直していきます。ではまた後日!

0 件のコメント: