Нарыл ответ на форумах, и чуть переделал функцию. Выглядит теперь так:
void rotateNodeToTarget(IAnimatedMeshSceneNode *node, IAnimatedMeshSceneNode *target) { vector3df diff = node->getPosition() - target->getPosition(); node->setRotation(diff.getHorizontalAngle()); node->updateAbsolutePosition(); }
Я бы вместо нодов в параметры передавал сразу их позиции :)
Просто передавать целый объект в метод ради одного поля не очень хорошо.
Ну пардон, передаётся не объект, а указатель на него. А это всего 4 байта =)
Мне нужно удалить нод, когда он достигнет конечной точки.
Как можно забиндить каллбэк на окончание передвижения? Или может можно как-то вообще без каллбэка поставить опцию, чтобы по окончанию он удалялся?
Если пользуешься аниматором, то у него есть свойство isFinished. Ставь в условие и удаляй.
Так что, мне постоянно в цикле этот isFinished проверять? Иначе низзя?
можно
написать свой аниматор оттолкнувшись от CSceneNodeAnimatorDelete
заменив проверку времени на проверку isFinished
и далее добавлять его к ноду в начале движения
А в какую сторону копать по поводу отслеживания коллизии двух моделей?
В сторону примера 07.Collision.
Я сам до конца не понимал как работает столкновение в иррлихте пока не изучил внимательно тот пример.
Если конкретней по твоей теме, то надо создать селектор из BB каждой модели методом createTriangleSelectorFromBoundingBox. И все селекторы запихать в метаселектор. А потом этот метаселектор передать аниматору.
Побился пол-дня над этим - и добился только того, что фигурка падает сквозь пол и улетает вниз далеко-далеко =))
Может кто-нибудь объяснить как-нибудь на пальцах принцип обнаружения коллизий в ирлихте? Я так понимаю, что ноды подразделяются на мелкие треугольники, и при столкновении какого-то треугольника одного нода с треугольником другого нода происходит коллизия. Или я понял неправильно? =)
И можно какой-нибудь пошаговый алгоритм, как организовать реакцию на коллизию двух мешей? Или какой-то набросок кода? На практике мне просто легче разобраться будет =)
Есть, конечно, пример 07. Collision, но там отслеживаются коллизии с ландшафтом, и я не совсем улавливаю связь.
если у тебя плоский мир, то не проще было фиксировать одну ось ноды фигурки между getPosition и setPosition ?
Я в идеале хочу сделать так, чтобы при соприкосновении одной фигурки с другой вызывалась callback функция. Если не ошибаюсь, то в аниматоре коллизий есть такая фича. Только мне бы научиться с этим работать. У меня пока опыта слишком мало, чтобы самому во всём разобраться =)
Столкновение двух моделей.
scene::ITriangleSelector* faerieSelector = 0; scene::ITriangleSelector* dwarfSelector = 0; scene::IMetaTriangleSelector* metaselector = 0; scene::ISceneNodeAnimator* CollisionAnimator = 0; scene::IAnimatedMeshSceneNode* faerieNode = smgr->addAnimatedMeshSceneNode(smgr->getMesh( "faerie.md2")); if( faerieNode) { faerieSelector = smgr->createTriangleSelectorFromBoundingBox( faerieNode); faerieNode->setTriangleSelector( faerieSelector ); metaselector->addTriangleSelector( faerieSelector); faerieSelector->drop( ); } scene::IAnimatedMeshSceneNode* dwarfNode = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "dwarf.x")); if( dwarfNode) { dwarfSelector = smgr->createTriangleSelectorFromBoundingBox( dwarfNode); dwarfNode->setTriangleSelector( dwarfSelector); metaselector->addTriangleSelector( dwarfSelector); dwarfSelector->drop( ); } if( metaselector) { CollisionAnimator = smgr->createCollisionResponseAnimator( metaselector, faerieNode); faerieNode->addAnimator( CollisionAnimator); CollisionAnimator = smgr->createCollisionResponseAnimator( metaselector, dwarfNode); dwarfNode->addAnimator( CollisionAnimator); metaselector->drop( ); anim->drop( ); }
А для того, чтобы модели не проваливались сквозь пол, нужно ещё и колизию моделей с полом сделать, я так понимаю?
Решил нулевой гравитацией
Тема в архиве.