Войти
IrrlichtФорум

Коллизии с ландшафтом

#0
11:03, 29 янв. 2010

Изучаю Irrlicht уже несколько недель. Решился начать свой проект (собственно для него и выбрал Irr). Первая трудность с которой столкнулся - определение коллизии луча (к примеру от камеры) с нодом ландшафта (ITerrainSceneNode). Фактически пытаюсь собрать воедино два примера: по ландшафту и по коллизиям... Как и сказано в мануалах вешаю на ITerrainSceneNode несколько ITriangleSelector'ов через IMetaTriangleSelector. В результате пересечение с лучом камеры детектится только для моделей, а для меша ITerrainSceneNode игнорируется. Тогда как аниматор CollisionResponseAnimator для камеры работает нормально (т.е. камера "ходит" по ландшафту).
Очень хочется услышать совета от опытных людей.


#1
12:15, 29 янв. 2010

У меня похожая проблема. Есть модель, которая реагирует на нажатия клавиш: ходит, атакует, прыгает... сделан вид от 3 лица. Загрузил сцену loadScene("terrain.irr").  Камера тоже работает нормально, но если поменять ее на эту модель, то если не включена гравитация - модель не может двигаться или коллизии не детектируются для нее, или если включена, то модель либо проваливается, либо взлетает вверх). Я еще не долго с этим пока что разбирался,  за подсказку буду благодарен.

#2
17:27, 29 янв. 2010

Уже все работает.)

#3
18:04, 29 янв. 2010

PaGRom, такого быть не должно, выкладывайте код - будем разбираться.

#4
22:49, 29 янв. 2010

вот создание селектора и подключение его к камере
ITriangleSelector * selector = mngr->createTerrainTriangleSelector(terrain,0);
terrain->setTriangleSelector(selector);

ISceneNodeAnimator * anim = mngr->createCollisionResponseAnimator(selector,camera[1],vector3df(60,100,60),vector3df(0,0,0),vector3df(0,50,0));
camera[1]->addAnimator(anim);
anim->drop(); 
selector->drop();

а вот так пытаюсь определить коллизию
line3df ray;
ray.start = camera[1]->getPosition();
ray.end = ray.start + (camera[1]->getTarget() - ray.start).normalize() * 1000000.0f;
vector3df intersection;
triangle3df hitTriangle;       
ISceneNode * selectedNode=cmngr->getSceneNodeAndCollisionPointFromRay(ray,intersection,hitTriangle,ID_FLAG_PICKABLE,0);

идентификатор узла ID_FLAG_PICKABLE описан и в конструкторе ITerrainSceneNode...

Кроме того загружается ещё три модели из примеров SDK. К ним присоединяются TriangleSelector'ы как в примере...
Независимо от того вешаю ли я на террайн ещё один селектор (TriangleSelector) или нет коллизии с лучом не происходит.

Подозреваю, что что-то упустил))) но не могу понять что....
Заранее благодарен за внимание.

#5
12:28, 30 янв. 2010

Вы упоминали MetaSelector, в приведенном коде его не заметно. После создания каждого селектора, для общей коллизии его необходимо добавлять в МетаСелектор. МетаСелектор же в свою очередь должен быть связан с аниматором:

ITriangleSelector * selector = mngr->createTerrainTriangleSelector(terrain,0); 
terrain->setTriangleSelector(selector); 

IMetaTriangleSelector *world = smgr->createMetaTriangleSelector();
world->addTriangleSelector(selector);

ISceneNodeAnimator * anim = mngr->createCollisionResponseAnimator(world,camera[1],vector3df(60,100,60),vector3df(0,0,0),vector3df(0,50,0)); 
camera[1]->addAnimator(anim); 
anim->drop();  
selector->drop();
#6
11:17, 1 фев. 2010

Проблема разрешилась после добавления одной строчки кода))):

camera[1]->setTriangleSelector(metaSelector);

Volard спасибо за внимание.

#7
7:10, 14 июня 2010

Спасибо! Все коллизии запахали!!! ваще четко щаз... Токо на счет анимаций ппц :(. Создавать анимацию бег+атака, бег+атака2, атакаБ атака2, вытащить оружие, вытащить оружие+БЕГ... нереально =( мб есть какой то способ? я думал мб модель на две части разделить(ноги, ТОРС).... вот еще вопросик а можно хотябы двигать скелетом через ИррЛич Например открывать рот когда говорит в диалогах(вне анимации, через КОД)...

IrrlichtФорум

Тема в архиве.