【问题标题】:When to do collision detection? I got very low fps, I think I misuse the detection什么时候做碰撞检测?我的 fps 非常低,我认为我滥用了检测
【发布时间】:2015-05-05 15:27:58
【问题描述】:

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

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

由于我的场景很简单,所以我使用了简单的“Minimal Collision Detection”(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
}

一开始我认为物体需要先落在球体上。所以在每一帧之前,我会检测物体是否与某物发生碰撞(我在运动功能中所做的猫和老鼠之间的碰撞,所以我假设如果在这里发生碰撞,那就是物体和球体。)

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

【问题讨论】:

  • 我在碰撞检测(当然还有这个库)方面的经验有限,但我有两个建议要考虑。首先,我会检查以确保您确实只有您期望的节点数量。如果您以某种方式获得了更多,那么您发布的内容可能并不明显。其次,如果基于人脸(而不是边界框)进行碰撞检测,对象几何的复杂性确实会增加碰撞检测的时间。您可能想查看对象的复杂性,看看更简单的对象是否能提供更好的性能。

标签: 3d collision-detection collision ogre bulletphysics


【解决方案1】:

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

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

还有;真实的人不是“不聪明的”——他们不会设定路线,直到他们碰到什么东西,然后设定一个新的路线,然后一直走,直到他们碰到下一个东西,等等。相反,真实的人使用预测——他们会意识到,如果他们继续前进,他们会与某物发生碰撞并改变他们的速度或方向,以避免碰撞发生之前。如果您使用“运动矢量”方法,这相对容易做到; 如果您使用“每个游戏时间点的重叠测试”方法,就不可能对智能实体进行逼真的模拟。这也意味着,如果您使用“运动矢量”方法,您可以避免大多数基于“边界框/球体/圆柱体”测试结果的碰撞,并避免几乎所有非常昂贵的“多边形/网格相交”测试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多