何时进行碰撞检测?我的fps非常低,我想我误用了检测

时间:2015-05-05 15:27:59

标签: 3d collision-detection collision ogre bulletphysics

我现在正在学习Ogre进行3D编程。

在我的场景中,现在只有三个实体,一个球体,一个鼠标和一只猫。猫在球体上奔跑。

由于我的场景非常简单,我使用简单的“最小碰撞检测”(http://www.ogre3d.org/forums/viewtopic.php?f=5&t=80829),根据其指示,性能良好。

在使用碰撞检测之前,fps为60(默认为最大值),使用后,fps降至13-15。 我在渲染每个帧之前使用它。

bool GeneratorFrameListener::frameRenderingQueued(const Ogre::FrameEvent& evt){
    Ogre::SceneNode::ChildNodeIterator it = RootSceneNode->getChild("planetSphere")->getChildIterator();
    while(it.hasMoreElements())
    {
        Ogre::Vector3 oldPosition = it.current()->second->getPosition();
        it.current()->second->setPosition( oldPosition*0.98 );

        Collision::SCheckCollisionAnswer ret = collision_tools->check_ray_collision(oldPosition, it.current()->second->getPosition(),0.4F);
        if (ret.collided)
        {
            it.current()->second->setPosition(oldPosition);
        }
        it.getNext();
    }
    //other code like listen the keyboard
}

在开始时我认为物体首先需要落在球体上。所以在每一帧之前,我会检测物体是否与某物碰撞(我在运动函数中做了猫与鼠之间的碰撞,所以我假设如果在这里碰撞,它将是物体和球体。)

我想知道在每帧之前进行碰撞检测是否太昂贵,有更好的解决方案吗?谢谢!

1 个答案:

答案 0 :(得分:2)

进行碰撞的方法是移动实体,然后使用“边界框”(或球体或圆柱体)来确定它们是否可能重叠,然后使用更精确和更昂贵的测试(例如多边形/网格交叉)当且仅当你已经确定它对于那对特定实体是必要的时候。

进行碰撞的正确方法是完全不同的。你真正想做的是为每个实体保留一个“运动矢量”(例如“实体#2开始在X方向移动,在时间T开始Y的速度”)并计算当你在它时与其他东西碰撞的瞬间设置运动矢量;这样你就不会在每一个游戏时都进行碰撞检测,你可以准确地处理2个实体在帧之间发生碰撞的情况。 注意:您是否见过快速移动物体“穿过”其他物体而不会发生碰撞的游戏?这是因为实体在碰撞之前没有在框架中重叠,并且在碰撞之后在框架中没有重叠。

也;真正的人不是“愚蠢的” - 他们没有设定路线,直到他们碰到某些东西,然后设定新的路线,直到他们接下来的事情等等。相反真正的人使用预测 - 他们会意识到,如果他们继续前进,他们会碰撞某些东西并改变它们的速度或方向,以避免碰撞发生之前。如果使用“运动矢量”方法,这相对容易;并且如果您使用“每次游戏时重叠测试”方法,则无法对智能实体进行真实模拟。这也意味着如果你使用“运动矢量”方法,你可以根据“边界框/球体/圆柱”测试的结果避免大多数碰撞,并避免几乎所有非常昂贵的“多边形/网格交叉”测试。

当然正确地做一些令人印象深刻/复杂的数学技能(这意味着在4维而不是3维中进行碰撞检测);所以几乎所有游戏开发者都使用破碎/狡猾的“每次游戏重叠测试”方法。