2010年11月17日水曜日

Androidでスキンメッシュアニメーション【Collada版】 とりあえず完成!

遂に完成しました。長かった~(ノ△T)

テスト用に作成したColladaファイルをオリジナルバイナリファイルに変換して描画したものです。

本当は実行画面を動画キャプチャしたかったけど、カクカクになっちゃうので1フレームずつイメージキャプチャしてパラパラアニメ風にしました(本当はswf形式でアップロードしたかった・・・)。

箱を移動・回転させるだけの簡単なアニメーションです。形状を変形させるアニメーションをさせればよかったのですが、今回はさせていません。

結局、ここまでやるのに2ヶ月ほど掛かってしまいました。
予想以上のタイムロスです。

まあファイルからデータの抽出を行うのは早い段階で完成してたのですが、
その後のボーンとアニメーションデータの組み合わせ方に時間が掛かってしまいました。

色々あったな~

ただ、ボーン数やボーンの影響度数に制限があるようなので、その制限を越えるデータにどのように対応させるかが今後の課題になりそうです。

最大数の取得方法
int[] params = new int[2];

gl.glGetIntegerv(GL11Ext.GL_MAX_PALETTE_MATRICES_OES, params, 0);
gl.glGetIntegerv(GL11Ext.GL_MAX_VERTEX_UNITS_OES, params, 1);

>> params[0] // GL_MAX_PALETTE_MATRICES_OES 一度の描画で使用できるボーンの最大数
>> params[1] // GL_MAX_VERTEX_UNITS_OES 一頂点に割り当てられるボーンの最大数

IS01で確認したところ、GL_MAX_PALETTE_MATRICES_OES = 20、GL_MAX_VERTEX_UNITS_OES = 4でした。
思ったよりボーン数が少なかったです。

次からはこの制限を越えるデータを描画できるように一工夫入れようと思っています。

----------------------------------作業を行う過程でわかったこと----------------------------------

①Android SDK 1.6はスキンメッシュアニメーションのサポートを行っていない
    ・JavaでMatrixPaletteが使えない
    ・ハードウェアはサポートしているがJavaのライブラリが対応してない
    ・実際に使用すると例外「UnsupportedOperationException」が発生

    解決策
    ・Android NDKを導入してスキンメッシュのコードをC/C++で組む(Native化)

②Colladaのボーンオフセット行列の求め方(コレに気付くまでに2週間かかった・・・)
    ・ボーンオフセット行列はボーンの初期姿勢行列(ベースポーズ)を
     逆行列化したもの(これも今更だな・・・学生時代習ったはずなのに)

    ・Colladaの場合、INV_BIND_MATRIXの転置行列?

テストで使用したColladaファイルのスキン情報

    
      
        1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
        
          Armature_Bone Armature_Bone_001
          
            
              
          
        
        
          1 0 0 0 0 -1 -6.30567e-7 0 0 6.30567e-7 -1 0 0 0 0 1 1 0 0 0 0 -0.999957084655 0.009265959262 -1.392618 0 -0.009265959262 -0.999957025051 -0.012905418872 0 0 0 1
          
            
              
          
        
        
          0.999999642372 0.999999701976 0.999999761581 0.999999761581 0.999999761581 0.999999761581 0.999999821186 0.999999940395 0.99999988079 1 1 1 0.99999988079 0.999999940395 1 0.99999988079
          
            
              
          
        
        
          
          
        
        
          
          
          1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
          1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15
        
      
    
  

関連項目
Android NDK
転置行列

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。