Когда делать обнаружение столкновений? У меня очень низкий fps, я думаю, что неправильно использую обнаружение

Сейчас я изучаю Ogre для 3D-программирования.

В моей сцене сейчас только три сущности, сфера, мышь и кошка. кошка бежит по сфере.

Поскольку моя сцена очень проста, я использую простое «Минимальное обнаружение столкновений» (http://www.ogre3d.org/forums/viewtopic.php?f=5&t=80829), производительность соответствует инструкции.

До того, как я использую обнаружение столкновений, частота кадров составляет 60 (максимально по умолчанию), после того, как я использую ее, частота кадров падает до 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
}

В начале я думал, что объекты должны сначала упасть на сферу. поэтому перед каждым кадром я определяю, столкнулся ли объект с чем-то (столкновение между кошкой и мышью я сделал в функции движения, поэтому я предполагаю, что если здесь произойдет столкновение, это будет объект и сфера.)

Интересно, слишком ли дорого делать обнаружение столкновений перед каждым кадром? Есть ли лучшее решение для этого? Спасибо!


person Pingjiang Li    schedule 05.05.2015    source источник
comment
Мой опыт обнаружения столкновений (и, конечно, этой библиотеки) ограничен, но у меня есть два предложения для рассмотрения. Во-первых, я бы проверил, чтобы убедиться, что у вас действительно есть только то количество узлов, которое вы ожидаете. Если вы каким-то образом получили больше, это может быть неочевидно из того, что вы опубликовали. Во-вторых, сложность геометрии объекта может действительно увеличить время обнаружения столкновений, если это делается на основе грани (а не ограничивающей рамки). Возможно, вы захотите взглянуть на сложность объектов и посмотреть, дают ли более простые объекты лучшую производительность.   -  person    schedule 16.05.2015


Ответы (1)


Способ сделать коллизии состоит в том, чтобы переместить ваши объекты, затем использовать «ограничивающий прямоугольник» (или сферу, или цилиндр), чтобы определить, могут ли они перекрываться, а затем использовать более точные и гораздо более дорогие тесты (например, пересечение полигона/сетки), если и только если вы уже определили, что это необходимо для этой конкретной пары сущностей.

Правильный способ делать коллизии совсем другой. Что вы действительно хотите сделать, так это сохранить «вектор движения» для каждого объекта (например, «объект № 2 начал двигаться в направлении X и со скоростью Y в момент времени T») и вычислить момент, когда он столкнется с чем-то еще, когда вы задать вектор движения; так что вы не выполняете обнаружение столкновений каждый отдельный игровой тик, и вы можете точно обрабатывать случай, когда 2 объекта сталкиваются между кадрами. Примечание. Видели ли вы когда-нибудь игры, в которых быстро движущиеся объекты «проходят сквозь» другие объекты, не сталкиваясь с ними? Это связано с тем, что объекты не перекрываются в кадре до столкновения и не перекрываются в кадре после столкновения.

Также; настоящие люди не «неразумны» — они не устанавливают курс и идут, пока не наткнутся на что-то, затем устанавливают новый курс и идут, пока не наткнутся на следующую вещь, и т. д. Вместо этого настоящие люди используют предсказание — они поймут, что если они продолжают двигаться, они столкнутся с чем-то и изменят свою скорость или направление, чтобы избежать столкновения до того, как оно произойдет. Это относительно легко сделать, если вы используете подход «вектор движения»; и невозможно получить реалистичную симуляцию интеллектуальных объектов, если вы используете подход "тест на перекрытие для каждого игрового тика". Это также означает, что если вы используете подход «вектор движения», вы избегаете большинства столкновений на основе результатов тестов «ограничивающая рамка/сфера/цилиндр» и избегаете почти всех очень дорогих тестов «пересечение многоугольника/сетки».

Конечно, чтобы сделать это правильно, требуются впечатляющие/сложные математические навыки (это означает обнаружение столкновений в 4 измерениях, а не в 3 измерениях); поэтому почти все разработчики игр используют неверный/хитрый подход «тест на перекрытие каждого игрового тика».

person Brendan    schedule 16.05.2015