----------------------------------------------------------------------
(---)BVHのように毎フレームの情報じゃなくベジェ曲線を使ったモーション
     キャプチャデータのフォーマットが欲しい．MMDのVMDは良いかと思った
     けど，ちょっといまいち．やっぱり独自フォーマット考えてみる．
     ただし，まったりと．．．名前はQIBVHにしようかな．
     (Quaternion Interpolation BVH:QIBVH)
     * BVHをお手本にする(バイナリでなくテキスト)
     * 回転は四元数を使うことにする．
     * ベジェ曲線でデータを補完する．
     * BVHと同じく，HIERARCHYとMOTIONのパートで構成
     * 全てのBoneで省略なく，移動(x,y,z)，回転，拡大(x,y,z)を保存
     * MOTIONパートはフレームごとでなくBoneごとに記述される．
----------------------------------------------------------------------
(---)またメモ．blender2.5対応にあたって，正式な方法でのリリース方法を
     検討する．
     <http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Guidelines/Addons>
     カテゴリは「Import-Export」かな．スクリプト名は「BVH_Expoter_A3」
     ぐらいかな．
     <http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Import-Export/BVH_Exporter_A3>
     <http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Import-Export/BVH_Exporter_A3>
     スクリプト名もio_export_bvh_a3.pyに変更かな．
     ああ．Wikiのページを作ったけどミススペルした！！！なんと面倒な．
     (2011,05追記)ちょっと前までなかったんだけどblender2.5にBVHのexporterが
     追加されている．Wikiページも間違えたので，とりあえず中止にして
     ページ削除依頼のメールを出した．
----------------------------------------------------------------------
(---)TODOというかメモ．Armature,Pose,Actionが少しわかってきた気がする．
     ActionStrip(s)も重要．全部Object経由でゲットしたほうが安全みたい．
     Blender.Armature.Get()だと，リンクされていないArmatureも出てきてしまう．
     Object.getData()でArmatureを取り出せる．Object.getAction()で
     Actionを取り出せるけど，このActionはアクティブなActionで，
     NLAを使ってActionStripを設定している場合にはObject.actionStripsから
     アクセスすることでアクティブでないActionも取り出せる．
     BVHのフレーム数はActionかActionStripから取って来た方が良い．
     厳密にはArmatureとActionの二つを指定しないとBVHの出力はできない．
     Armatureが入っているObjectの名前がArmatureなどになるので混乱する．
     ArmatureとArmatureが入っているObjectを混同しないこと．
     たぶんPoseは使わなくても済みそう．
----------------------------------------------------------------------
(---)Blender.Draw.PupBlock関数で，exportのプログラムにしても
     入力がゲットできるかも．未確認．
----------------------------------------------------------------------
(---)今まで，BoneBaseってクラスで保存していたhead,tail,gQuatは，
     head = bone.head['ARMATURESPACE']
     tail = bone.tail['ARMATURESPACE']
     gQuat = bone.matrix['ARMATURESPACE'].toQuat()
     で大丈夫みたい．BoneBaseクラスは廃止かな．
----------------------------------------------------------------------
(---)ArmatureからgetAction()でActionを取り出して，
     Action.getChannelIpo('Bone名')でIpoを取り出し，
     ipo[Ipo.PO_QUATX]とかでIpoCurveを取り出し，
     icu[12.5]とかで実際の値を取り出すのが正攻法
     だと思う．
     どのチャンネルが使えるのかは，Ipoの
     ipo.curvesの配列にIpoCurveが入ってるので，これを
     確認．(まあ，ipo[Ipo.PO_QUATX]でNoneが返ってくる
     かどうかを確認しても良いと思う．)
----------------------------------------------------------------------
(---)このスクリプトに入れるかどうかはわかんないけど，
     Blender.Object.parentbonenameで，オブジェクトと
     Boneの関係がゲットできるので，A3ファイル自動作成
     に使える．
----------------------------------------------------------------------
(---)blender2.41に対応させる．まだ，やっつけ．
     いろいろ便利な機能もあるようなので再検討すべし．
----------------------------------------------------------------------
(---)pluginの形での提供も考えてみるかな…(blender-memoのページに
     解説があった。けど…(2004/12)blender-memoのページがなくなった！
     残念すぎる。)
(*--)よくわからないバグ。ある関節だけ回転方向が逆？深刻なバグ
     本当に謎。最近はBoneのrollがあやしいという気になってきた。
     なおったような気がするけど、厳重にチェックする必要あり。
----------------------------------------------------------------------
整理(実は謎のまま作業してる)
以下が真か偽かはっきりさせる必要がある
(***)Bone.getTail()やBone.getHead()は，ポーズを付けたりしても変化しない
(***)Bone.getQuat()やBone.getLoc()は，ポーズを付けたりすると変化する
(***)Bone.getRoll()は，ポーズを付けたりしても変化しない
(***)Bone.getRoll()とは，骨の回転のこと，Y軸を中心に右ネジの方向で，
     単位はラジアン
(*--)Bone(骨)のローカル座標系っていうのは，骨の太い方の端が原点で，
     骨の軸がY軸，X,Z軸は，たぶん親の座標系から，なるべくすなおに
     受け継ぐものかと思われる．つまり，Y軸を合せるための最小の回転
     により定義される？(回転が180度だと一意に定まらないけど…)でも，
     それがだめらしい．
(*--)Bone.getHead()とかBone.getTail()とかで得られる情報は親の骨
     をY軸とし，親の骨の尾を原点とする座標系に対する座標．
     ただ，それだけでは一意に定まらない．
----------------------------------------------------------------------
終了〜
(***)blender2.33aに一応対応
(***)blender2.33aからMathutilsモジュールが付いた。使えそうか？
(***)MOTIONのフレーム数(Frames)とフレーム間隔(Frame Time)
     も入力できるようにする。
(***)Armature変更をサポートする
(***)Scale変更をサポートする
(***)ファイル名変更をサポートする
(***)Armatureに入っているBoneはひとまとめにして
     BVHに出力するほうが良いと思う。つまり、Hierarchyの
     暗黙のrootをかってに作ってしまう
(***)メッセージが出力されるステータスバーみたいな
     場所を用意する。
(***)親と子の間の座標系の回転をvec_vec2quatなんかで計算しないで，
     Bone.getQuat()でゲットできない？<--できません！
----------------------------------------------------------------------

