遊べるとこまで持ってこうと思ってたけど、このペースじゃとても無理。

だめだめ

void CRayCollisionAnimator::animateNode(ISceneNode* node, u32 timeMs)
{
  vector3df intersection;
  triangle3df tri;

  if (smgr->getSceneCollisionManager()->
      getCollisionPoint(line3d<f32>(curr, prev), selector, intersection, tri))
    {
      smgr->addToDeletionQueue(node);
      return;
    }
  prev = curr;
  curr = node->getPosition();
}

こんな感じで衝突判定Animatorを作った。クリックしたらFlyStraightAniamtorとこの衝突判定Animatorをくっつけたビルボードをつくるようにした。10こほど飛ばしたところでFPSが60を切った。200ぐらいはできてほしいのに、使えなさすぎる。

解決案

重いところは言うまでもなくgetCollisionPointで、selectorの元が1万ポリゴンを越す巨大なメッシュってのが重さを助長してる。でも、巨大っていっても動かないんだから

  • Demoと同じように、巨大で静的なメッシュ(TerrainとかBSPとか)に対する判定は発射時にする
  • 動的なメッシュはgetSceneNodeFromRayBBかなんかで衝突可能性を調べてから細かい判定をする

これで結構マシになるんじゃないかな?
Demoの衝突判定がインチキだなんて書いたけど、そりゃそうやわ。もしDemo見てなかったら今頃詰んでたにちがいない! てかこれって当たり前?