いろいろ試した結果…

Ogre3D触ったりOpenSceneGraph触ったりした結果、GamePlay3Dが割とすんなりいけて楽しい。
しかしながら、この辺のエンジンやフレームワークは日本語がほとんど無いに等しい…。(一生懸命英語読んでた

で、この数日GamePlay3Dで遊んでて最初に嵌ったことを備忘録がてらまとめ。

  • 基本サンプルはQtCreatorでビルドするエディタで作られたバイナリっぽいシーンファイルで書かれているので、空のシーンを作るのどうしたらいいのよ?
    • Scene::create () 使いましょう
  • フルスクリーンモードにするのはどうしたらいいの?
    • 新規プロジェクト作る時にGamePlay/newproject.shを使用した前提で行くと、プロジェクトフォルダ直下にgame.configってのがあるので、fullscreen: trueにしたらいけます。 但し、 そのままだとviewportが反映されていないので、initialize関数で setViewport(Rectangle (0, 0, getWidth(), getHeight())); して上げましょう。じゃないと、viewportずれずれで悲しみ。
  • 行列変換とかは?
    • Matrixクラスはあるので、普通にそれで慣れてる人はいけるかと。ビューポート変換はCameraクラスにproject関数があるのでそれっぽい。 camera->project (getViewport (), worldPosition, buffer) とかそんな感じ。XNAのViewportクラスとかあんなん。
  • fbxはどうやって表示したらいいの?
    • GamePlay/bin/PF/gameplay-encoder fbxファイル でgpbファイルに変換して、 Bundle::create ("変換ファイル")->loadNode ("ルートNode名") とかでいちころ。シェーダーとか後で弄りたい人はencoderに-mオプションつけてmaterial出力してテキストエディタでいじっていく感じ。付属のシェーダはdefineでlighting指定とかになっていくので、最初material見た時にん?ん?ってなった。Untiy慣れしすぎてるのか、loadNodeした後はclone (Instantiate的な)してしまう。
  • lightingを有効にしたいけど、lightつけたのにならないよ?
    • nodeからgetDrawable ()して取得したものをModel*にcastして、getMaterialでマテリアル取得後、そのマテリアルにlightの光源変更イベントつけないとダメっぽいです。
MaterialParameter* colorParam = material->getParameter("u_directionalLightColor[0]");
colorParam->bindValue(_scene->findNode("directionalLight1")->getLight(), &Light::getColor);
MaterialParameter* directionParam = material->getParameter("u_directionalLightDirection[0]");
directionParam->bindValue(_scene->findNode("directionalLight1"), &Node::getForwardVectorView);
  • ただ、↑のやーつが厄介で、そのメソッド中でMaterialクラスを明示的に作ってるのならば、そのメソッド中の呼び出しでいけるのですが、Bundle::loadNodeとかだとそのメソッド実行中はMaterialがnullptr...
    • なので、_scene->visit(this, &Main::initializeMaterials); シーンのvisit関数から別途マテリアル初期化関数をinitializeの最後に呼ぶとかしてあげるとうまくいく

とりあえず、直近嵌った内容まとめでしたー