■
遊べるとこまで持ってこうと思ってたけど、このペースじゃとても無理。
だめだめ
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見てなかったら今頃詰んでたにちがいない! てかこれって当たり前?