Digan
getSceneNodeAndCollisionPointFromRay() или getSceneNodeFromRayBB() эти функции работаю с лучами а у меня объекты! Не понимаю:(
Так эти функции возвращают указатель на нод с которым пересекся луч.
Задаешь луч.
irr::core::line3d<f32> ray;
У этого луча можно задать начало и конец. Например пускаешь луч от персонажа.
Метод getSceneNodeFromRayBB() возвратит первый нод с которым луч пересекся.
Пересечение с лучом считай это столкновение с нодом.
Может я чего то не догоняю! Допустим я сделаю луч направлю его в сторону объекта А и получится такая ситуация что луч постоянно его будет пересекать! Это для меня не сильно подходит! В irrlicht что нельзя определить соприкосновение двух сеток?
>Все объекты типа сетка
по подробнее про хитрый тип "сетка" пожалуйста
Andeksan, простое столкновение между нодами реализуются с помощью селекторов и аниматора.
Если нужно определить столкновение с конкретным нодом, то обычно используется пуск луч. Луч можно пускать все время в одном направлении, я например делал чтобы луч всегда был направлен по направлению движения персонажа.
Если этот луч передать в качестве параметра в метод getSceneNodeFromRayBB(), то при пересечении с каким-нибудь нодом он возвратит указатель на этот нод. Так же можно пускать сразу несколько лучей.
Digan
вобщем сделал так
core::line3df rayCast_(IAnimatedMeshSceneNode *node_A, IAnimatedMeshSceneNode *node_obj, f32 distance) { core::line3df line; vector3df dist(node_Obj->getPosition() - node_A->getPosition()); dist.normalize(); dist *= distance; //вобщем линия начинается с центра объекта(node_Obj), а заканчивается на каком то //расстоянии по напровлению к объекту А line=core::line3df(node_Obj->getPosition(), dist); return line; } //-- scene::ITriangleSelector* obl_Selector = smgr->createTriangleSelectorFromBoundingBox(node_Obj); node_Spider->setTriangleSelector(obl_Selector); ISceneNodeAnimatorCollisionResponse *CollisionAnimator = smgr->createCollisionResponseAnimator(obl_Selector, node_A); node_A->addAnimator(CollisionAnimator); obl_Selector->drop(); CollisionAnimator->setGravity(vector3df(0.0f,0.0f,0.0f)); в цикле { ..... line3df line = rayCast_(node_Obj, node_A, 80); scene::ISceneCollisionManager* collMan = smgr->getSceneCollisionManager(); scene::ISceneNode * selectedSceneNode = collMan->getSceneNodeAndCollisionPointFromRay(line, intersection, hitTriangle); if(selectedSceneNode) { //отлавил коллизию } .... }
При таком варианте постоянно срабатывает коллизия! где я не правильно делаю
в *.obj нельзя, dae можно. При этом все меши вытаскиваются из кэша. Только вроде надо полный путь к мешам указывать: .......Release/maya.dae#cubeShape. Т.е. в имени указывается не имя объекта, а имя меша(или как это называется). При этом теряется отностельная ориентация объектов в сцене - надо в Irrlicht по новой всё выставлять=( Также вроде можно все меши разом загрузить - на офиц форуме упомянули про это, а как сделать, не показали.
Поэтому как ты и написал, проще через irrEdit.
Вот пример кода для загрузки. В сцене 2 объекта ball и point
smgr->getMesh("maya.dae"); IMeshCache *cache = smgr->getMeshCache(); scene::IAnimatedMesh* m1=cache->getMeshByName("D:/Documents and Settings/gg/My Documents/CodeBlocks/irrlicht/bin/Release/maya.dae#cubeShape"); IAnimatedMeshSceneNode* n1 = smgr->addAnimatedMeshSceneNode( m1 ); n1->setMaterialFlag(video::EMF_LIGHTING, false); scene::IAnimatedMesh* m2=cache->getMeshByName("D:/Documents and Settings/gg/My Documents/CodeBlocks/irrlicht/bin/Release/maya.dae#ballShape"); IAnimatedMeshSceneNode* n2 = smgr->addAnimatedMeshSceneNode( m2 ); n2->setMaterialFlag(video::EMF_LIGHTING, false);
Andexsan
почему ты создаешь селектор из одного объекта, а потом устанавливаешь его для другого?
Вообще я не понимаю что тебе нужно в сцене. Опиши подробней желаемую сцену -тогда может кодом помогу.
Объект А неподвижен? Объекты к нему приближаются со всех сторон?
Если так то можно пустить несколько лучей небольшой длины из объекта А в разных направлениях. Каждый из лучей обрабатывать вышеприведеными функциями. Если другие объекты пересекуться с одним из лучей метод возвратит указатель на этот объект.
Там все понятно есть! Объект - А (сетка, 3д модель) к нему двигается другой объект другой формы такого же типа, определить коллизии! В общем коллозии получились но карявые! Вобщем у объекта А есть анимация, меш сдвигается на какое то расстояние, центр на том же месте(он никуда не двигался)! Карявость заключается в том что коллизия происходит с центром объекта А! Как сделать чтобы определять соприкосновения 2-х сеток
И еще как отключить отсечение граней для всей сцены или для конкретного нода?
>Как сделать чтобы определять соприкосновения 2-х сеток
надо описать их контур
ты создаешь селектор с параметрами по умолчанию
>smgr->createCollisionResponseAnimator(obl_Selector, node_A);
а надо
>smgr->createCollisionResponseAnimator(obl_Selector, node_A, irr::core::vector3df(x,y,z));
где xyz - радиусы элипсоида в который вписывается твой объект
читай
либо здесь http://www.gamedev.ru/community/irrlicht/articles/?id=2705
либо там http://www.irrlicht.ru/index.php?vm=7.view.22.
на мой взгляд ТАМ по приятнее :)
Да кстати. В иррлихте столкновение обсчитывается для элипсойда вокруг меша, а не для самих полигонов меша. Хотите более точного обсчета столкновений -используйте дополнительно физ. движки. Повезло еще что в иррлихте хоть какая-та физика есть. В некоторых движках вообще никакой нет.
Подскажите пожалуйста в чем различия форматов .3ds и .max? и почему везде в движках поддерживаются модели 3ds формата а не мах, ведь мах это родной формат 3dsmax.Расскажите про эти форматы пожалуйста.
физика? в иррлихте? Где?
maxfate
в формате 3ds содержатся информация о полигонах и кординаты текстур и иногда бипеды(кости). а в max полигоны, тестуры, все возможные эффекты, частицы, фильтры, источники света... дело в том что не всякая игра может повторить то что может творить 3дмах... естественно сложность чтения и объем файлов отличается... поэтому и придумали экспорты в более легкий формат 3ds который содержит базовые данные о моедли.
Тема в архиве.