Скажите, пожалуйста, irrlicht поддерживает бленд-анимацию?
>подскажите пожалуйста-как сделать так что бы в запущенной игре в настройках менять разрешение экрана и эти изменения вступали в силу без перезапуска игры,заранее спасибо
>В общих словах нужно сначала сохранить состояние сцены, потом пересоздать устройство.
А ещё можно разрешить пользователю менять размеры окна самостоятельно.
IrrlichtDevice::setResizeable(). Эта ф-ция разрешает изменять размер окна рендеринга.
В мешвиевере она применяется так:
if (Device == 0) return 1; //не удалось создать выбранный драйвер. Device->setResizable( true);
>Скажите, пожалуйста, irrlicht поддерживает бленд-анимацию?
Пока считается, что нет. Приходится людям анимировать отдельные части тела и собирать их потом воедино.
А почему "пока считается, что нет"?
Возможно будет поддержка в будущем?
Интересно почему при клике на нод и обработки клика следующей строчкой
SelectedNode = CollMan->getSceneNodeFromScreenCoordinatesBB(Device->getCursorControl( )->getPosition( ),0,true);
Иногда выбранным нодом стает камера. Хотя нод довольно массивный и промахнуться по нему невозможно. Это баг движка или что-то у меня в коде не так? Кстати и при клике на гуи выбранным нодом стает камера.
>Возможно будет поддержка в будущем?
Как звёзды сложатся....
>Иногда выбранным нодом стает камера.
В смысле становится.
У вашей камеры создан селектор треугольников? 100% создан.
Скорее всего большой габаритный контейнер камеры.
1. Способ. Брать глубину(старт луча) > размеров габаритного контейнера камеры.
2. Способ как в примере Collision. Рекомендую. Там определены 3 флага для всех нодов:
enum { // Я использую этот ISceneNode ID для идентификации нода //который НЕ может быть выбран //getSceneNodeAndCollisionPointFromRay() ID_IsNotPickable = 0, // Я использую этот флаг ISceneNode IDs чтобы // указать нод, который может быть выбран. IDFlag_IsPickable = 1 << 0, // может быть выбран И ПОДСВЕЧЕН IDFlag_IsHighlightable = 1 << 1 };
Ну и далее:
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, 0, 0, true, 3.f);
т.е. камера указана как объект который НЕ может быть выбран.
Ф-ции луча флаг тоже надо указать:
scene::ISceneNode * selectedSceneNode = collMan->getSceneNodeAndCollisionPointFromRay(ray, intersection, // Позиция столкновения hitTriangle, // Треугольник с которым произошло столкновение IDFlag_IsPickable, // Указать какие ноды могут быть выбраны // а какие не могут 0);
Спасибо за подсказку по флагу в параметре. Раньше у меня там стоял просто ноль. Думал, что за bitMask, а в документацию заглянуть не догадался.
Но я оставил все таки метод getSceneNodeFromScreenCoordinatesBB(). Им попроще как-то выбирать ноды какая бы не была камера, и не надо явно определять начало луча.
И да. Селектора камеры у меня не было и нет.
>И да. Селектора камеры у меня не было и нет.
Тьфу запарился. Надо было спросить установлен ли аниматор столкновений. Просто у меня камера в подобной ситуации не выделялась. Возможно размерность сцены и элементов были другие.
Ну вот для примера, как устанавливается аниматор столкновения камере в 7 туториале(где про столкновения):
scene::ITriangleSelector* selector = 0; if (q3node) { q3node->setPosition( core::vector3df( -1350,-130,-1400)); selector = smgr->createOctreeTriangleSelector( q3node->getMesh( ), q3node, 128); q3node->setTriangleSelector( selector); //Мы пока что не закончили с этим селектором, //поэтому нельзя освободить его переменную прямо сейчас. } scene::ICameraSceneNode* camera = camera = smgr->addCameraSceneNodeFPS( 0,100.0f,300.0f); scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( selector, camera, core::vector3df( 30,50,30), core::vector3df( 0,-3,0), core::vector3df( 0,50,0)); camera->addAnimator( anim); anim->drop( ); selector->drop( );
В принципе, камера и не имеет к треугольникам никакого отношения, столкновение с ней фиксируется по радиусу элипса. Но хоть бы аниматор столкновений должен быть? Или по лучу камера выделяется и без аниматора столкновений?
Мне в редакторе пока столкновения не нужны. Ни аниматоров ни селекторов нет. Просто ,пока не поставил флаг, по клику мыши выделялась камера т.к. это тоже нод.
Могу для убедительности привести код обработчика клика мыши:)
case EMIE_LMOUSE_PRESSED_DOWN : { LMouseButtonDown = true; SelectedNode = CollMan->getSceneNodeFromScreenCoordinatesBB(Device->getCursorControl( )->getPosition( ),IDFlag_IsPickable,true); if( SelectedNode) { initialCursorPosition = Device->getCursorControl( )->getPosition( ); initialObjectPosition = CollMan->getScreenCoordinatesFrom3DPosition( SelectedNode->getAbsolutePosition( ), Manager->getActiveCamera( )); menuBar->setSelectedNode( SelectedNode); } } break;
Может быть в вашем случае луч фиксирует столкновение не с мешем состоящим из треугольников, а с габаритным контейнером модели. И поэтому корректно возвращает тот нод, с которым реально произошло столкновение.
А для того, чтобы получить ТРЕУГОЛЬНИК, с которым произошло столкновение селектор видимо всё же нужен.
Для моделей тоже нужно было создавать селекторы в 7 туториале:
//Теперь создадим селекор треугольников для //персонажа. Селекор должен знать с каким //анимированным узлом он связан, тогда он //скорректирует себя по необходимости. selector = smgr->createTriangleSelector(node); node->setTriangleSelector( selector); selector->drop( ); //Мы закончили с этим селекором, так что освобождаем его.
и так с каждой моделью. Т.е. не создавая селекторы можно получить столкновение с моделью по её габаритному контейнеру(боундингбоксу). Но чтобы получить столкновение конкретно с треугольником меша без селектора не обойтись.
А иначе зачем бы его было нужно создавать.
В данном случае мне нужно было пока только возможность выбирать объекты мышью и возможность перемещать, вращать и масштабировать ноды на карте. Это уже успешно достигнуто без селекторов. Проблема с выделением камеры так же решена с помощью флага.
Теперь мне видимо предстоит написание своего МешВьювера.
Сцена в модели состоит из 3-х объектов. Экспортнул её в *.obj. Может Irrlicht работать с этими объектами по отдельности? один повернуть так,, другой по другому и т.д. Если да, как это делается?
Если ты грузишь эти три объекта как один нод, то нет не может. Хотя если как-то удасться запихнуть вершины одного объекта в один мешбуфер, то думаю возможно будет управлять вершинами на низком уровне.
Вообще не может или для *.obj? С collada существует возможность простыми средствами вынуть ноды?
Народ нужна помощь короче такая ситуация. Есть объект(А) и к ниму приближаются другие объекты и надо определять какой объект столкнулся с объектом А! Все объекты типа сетка. Я вот не могу понять как заставить irrlicht определять столкновения.
DFooz, не пользовался этим форматом не могу сказать. Если объекты в сцене динамически должны менять свое положение не проще собрать сцену например в IrrEdit и потом из кода управлять ими как отдельными нодами?
Andeksan, если нужно определять с каким имеено нодом столкнулся объект А, то используй методы класса irr::scene::ISceneCollisionManager - например getSceneNodeAndCollisionPointFromRay() или getSceneNodeFromRayBB()
Тема в архиве.