ページ

2012年3月31日土曜日

MiniatureGarden using Ogre

IrrlichtからOgre3Dへの移行を始めてはや半年。
やっといろいろ遊べる形になってきました。
まずは、サッカーでも作って基本的な機能を揃えたいところです。



CPU: Intel(R) Core(TM) i3 CPU  530  @ 2.93GHz
Mem: 2G
Video: GeForce 7600 GS
OS: Ubuntu

Ogre3Dは、影を使った時の性能がIrrlichtより圧倒的に良いですね。
まだ速度的な最適化をやっていないのに、影を入れたまま11vs11で遊べそうです。



2012年3月29日木曜日

シャギーなアニメーションになったら

Boneに関連付けられていない(Vertex Groupに所属していない)浮いているVertexがあるMeshをOgre Mesh Exporterなどでexportさせてアニメーションさせると下図のように飛び出ることがあります。



対策: どこかのVertex GroupにAssignさせてあげると解決します。


2012年3月21日水曜日

blender 2.62 で ogre mesh を exportする

Blender 2.5 exportの最新版を使ってmeshを出力する事に少し手間取ったのでメモ。

1. 最新のexporterは、最新のtreeにあるので
 hg clone https://bitbucket.org/sinbad/ogre
2. Tools/Blender2.5Export/の下にある全ファイルをblenderのaddonを置く場所にコピー
    例えば、blender/blender-2.62-linux-glibc27-i686/2.62/scripts/addons/ogre_mesh_exporter/
3. blender起動
4. File->User Preference->addonsで、Ogre Mesh Exporterを有効にする
5. 再立ち上げ (いらないかな)
6. cube作る
7. cubeにMaterialを作り、名前をOgre/SkinなどのOgre環境上のMaterial Nameにしておく。
6. cubeを選択して、"T"を押す。
7. 出たメニューの下の方に、Ogre Mesh Exporterがある。
8. 書き出すパス(Export Path)指定。
8. exportボタンをぽちっと押す。
9. できたmesh.xmlをOgreXmlConverterで.meshにする

という手順で作成したmeshをOgre Engineで表示できるところまで確認。
また、Properties->ObjectData にもなにやらメニューがあるが、今のところ使い方がよく分からない。

P.S.
どうやら、Textureを適切に貼るには、UV設定にして出力する必要があるようなのですが、現在のscriptでは対応していないようです。なので、お急ぎの方はblender-2.49bとTools/BlenderExportで出力させるのが無難なようです。


参考

Good work, lf3thn4d



2012年3月19日月曜日

blenderで3D Viewにテクスチャが表示されない

プログラムの基盤環境の方の目処が立ってきたので、素材作りのためにBlender 2.6を入れてみた。1年ぶりぐらいなのですがI/Fが変わって、格好良くなっている!
(まぁ、どんなにツールが良くなっても、私のセンスじゃどうしようもないのですが...)

ところで、Texture張っても、3D Viewに表示されない (1年前もハマった気が =)ことで
1時間ぐらい浪費したので、メモ。

ググったところ、対策の7番目
7.3D View画面でNキーを押してShadingをGLSLにする
が今回の原因でした。




2012年3月4日日曜日

Swig対処メモ

Swig 2.0.4を対象としています。
  • privateコンストラクタだから生成できない
    %templateでそのクラスのwrapperを作成している。(wrapper作るとinstantつくるので)
    対策: wrapperを作らない。必要なら、コンストラクタをpublicに置いたclassをswig用interfaceファイル内で再定義。
  • allocate がかぶる
    wrapper作成対象クラスにallocate関数があると、swigが内部生成するallocate関数とかぶる模様。
    対策: クラスのallocate関数を%rename。
  • typedefで定義された別名クラス名でインスタンスは作れない
    そもそも、その別名クラス名のwrapperが作成されない。(元の型と別名型の共通性はswig内で管理されている)
    対策: 元の名前のクラスを使う。
  • template内typedefを利用した何か
    概ねswigでうまく扱えない。もしかしたらできるのかもしれないが、%templateの展開地獄と型不一致地獄に延々巻き込まれるので、精神衛生上swigのversion upを待った方が良い。(2.0.5でtypedef絡みのpatchがありそうなので)。
    対策: そのクラスのwrappingを諦める。伝家の宝刀 %extendを使い、その諦めたクラスを使っているクラスに諦めたクラスに対する代替I/Fを追加する。
    • 例1: map::mapped_typeを使ってごちゃごちゃするOgre::MapIterator
      対策: Managerクラス内のデータ参照に使っているので、Managerクラスにeach_datatypeを作る。
    • 例2: Ogre::vector::typeを使うStringVector
      対策: StringVector自体は、RubyのArrayと等価。なので、StringVectorの代わりにArrayを受け取る/返す操作をするI/Fを追加する。もしくはArrayの代わりに別途StringVectorを内部で使用している新しいクラスを自作、それ向けのI/Fを同様に追加。
  • Listener/Handler対策
    C++側にListenerクラスを継承したRubyクラスを登録し、C++側からRuby側のクラスを呼び出すタイプの話。SwigのドキュメントのCross language polymorphismに対策が書いてある。
    対策
    1. トップの%moduleにdirectors="1"
      %module(directors="1") "MyNameSpace"
    2. Ruby側で継承するListenerクラスwrapperにdirector
      %feature("director") Ogre::FrameListener;