bullet組み込み成功

ついにツインテールが揺れるようになった。

重力がおかしい主要な原因は、剛体の初期位置指定で位置と回転を逆に指定するというミスのせいだった。どういうことかというと剛体のオイラー角と位置の読み込みデータを同じ型の構造体(三次元ベクトル)に格納していたので間違えて指定してもコンパイルが通ってしまうという。しょうも無さ過ぎて発見に手間取ってしまったが、おかげでだいぶBulletが判ったので結果オーライということにしておくしかあるまい。
一応プログラムは当初の目的を達成した。わりとBulletで遅くなったのでハードウェアスキニングをいれたり細部を整理して最適化したほうがよさげではある。あとは、BlenderのPMDエクスポータを仕上げたりとかマテリアルとかライティングあたりをちゃんとやるといった周辺作業を詰めたいところ。


あとbulletのstepSimulationの引数についてもなんとなく判ったのでメモを残しておく。
http://www.continuousphysics.com/Bullet/BulletFull/classbtDiscreteDynamicsWorld.html#a9776089cc4e4a767ff43147127444773

virtual int 	stepSimulation  (btScalar  timeStep, int maxSubSteps=1, btScalar  fixedTimeStep=btScalar(1.)/btScalar(60.))

timeStepはシミュレーションを進める時間のミリ秒指定だからいいとして問題は後ろの2つの指定の仕方となる。
たぶんだが、3つ目のfixedTimeStepはBulletでの内部計算での1フレームの長さを秒で指定している。デフォルトは1/60なので60フレーム時の1フレーム長である0.016秒くらい。
2つ目は、1つ目の引数が3つ目で指定したフレーム長を超える場合に最大で何回シミュレーションステップを進めるかという指定だと思う。
引数が(40, 1, 1.0f/60.0f)だったとすると、1フレームが16ミリ秒なので2ステップシミュレーションを進める必要があるが最大回数が1に制限されているのでシミュレーションは16ミリ秒1回しか進まないことになる。つまり、処理が遅くなればなるほど第1引数が大きくなるのだが1回に16ミリ秒しか物理シミュレーションが進まないので物体の速度(落下など)がどんどん遅くなる。
今回は、可変フレームレート(間に合わないフレームを捨てる)で実装しているので2つ目の引数は1でなければならない。1つ目の引数は経過時間そのままなので3つ目の引数を調整してやる必要がある。
具体的には、第1引数に0.001を乗算した値を入れといた。今やっているプログラムの用途ではシミュレーションとしての正確さはどうでもいいのでこれでいける。