Часто задаваемые вопросы по irrLicht (FAQ)

Правила форума
Раздел посвящен трехмерному графическому движку Irrlicht.
Перед созданием темы с вопросами, просьба ознакомиться с FAQ и уроками, представленными на сайте.

Сайт | Скачать | API 1.7.2 | API 1.8.0 | Уроки
Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 24 янв 2011, 15:36

То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:20

C чего начать? Code::Blocks

Многие новички не знают с чего начать, а начинать нужно с самого начала - установки понравившейся вам среды разработки и настройки проекта под Irrlicht. Как же это сделать?
Проще всего начать работу с Irrlicht, используя среду разработки Code::Blocks MiniGW. Скачать бинарники можно на офф.сайте, благо Code::Blocks бесплатен.
После установки нужно проверить параметры компилятора, пройдя по меню Settings - Compiler and Debugger и посмотреть соответствует ли путь к MiniGW на вкладке Toolchain executables действительности. Для ленивых есть кнопка Auto-detect :)
Изображение

Подробный туториал.

Готово? Тогда переходим к созданию проекта. Поверьте - нет ничего проще. От вас лишь требуется пройтись по File-New-Project и выбрать тип проекта Irrlicht project, указав в открывшемся диалоге путь к вашему каталогу с Irrlicht.
Пробуем компилировать. Ошибка? Ничего страшного. Нужно лишь заменить:

Код: Выделить всё

IrrlichtDevice *device =
        createDevice(EDT_SOFTWARE, dimension2d<s32>(640, 480), 16,
            false, false, false, 0);
на

Код: Выделить всё

IrrlichtDevice *device =
        createDevice(EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,
            false, false, false, 0);
Вуаля - работает!

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:23

Как ограничить FPS?

Запустили вы своё приложение и видите огромный FPS. "Ура!" - закричат некоторые, но это не есть хорошо, ибо работа приложения будет сильно отличаться на слабых и мощных машинах.
Есть способ ограничить количество кадров в секунду заставляя движок "спать" некоторое время, дожидаясь нужного времени. Сделать это можно так:

Код: Выделить всё

irr::s32 framelimit = 90; //ограничим FPS до 90
irr::s32 now = 0;
irr::u32 sceneStartTime = 0;
irr::u32 sceneSkipTime = 1000 / framelimit;
while(device->run())
{
     //ищем разницу во времени
     now = device->getTimer()->getTime();
     if (now - sceneStartTime > sceneSkipTime)
     {
                sceneStartTime = device->getTimer()->getTime();
                driver->beginScene(true, true, SColor(0,200,200,200));
                smgr->drawAll();
                guienv->drawAll();
                driver->endScene();
     }
}
device->drop();
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:27

Поддерживает ли Irrlicht стереоэффекты?

Речь идет о анаглиф-3D :) Недавно увлекся, пробовал играть в анаглифных очках в Left 4 Dead и немного даже затянуло. Мелькнула мысль: "А чем Irllicht хуже?". Как оказалось - ничем. Не знаю как это правильно назвать, но Irrlicht действительно поддерживает стереоэффекты на основе анаглифного рендеринга. Получается неплохая картинка.
Если у вас видеокарта NVidia и вы хотите попробовать 3D на 3D движке Irrlicht ( :D ), то включить стереоскопический режим в панели управления NVidia и смело запускайте дэмо. Работает в полноэкранном режиме.
Изображение Изображение Изображение
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:31

Как убрать консоль?

Изображение

Консоль, конечно, вещь очень полезная, но иногда требуется её убрать. Как? Это очень просто.
1. Code::Blocks
Идём в Project-Properties, ищем вкладку Build targets и меняем в нужной конфигурации (Debug/Release) Type на Gui и радуемся.
Включить консоль обратно можно поменяв Type на Console application.

///Добавил Bear/// от 8 октября 2011///:
Способ 2 для Code::Blocks+MinGW
Правой кнопкой на проекте->Build options-> вкладка linker settings-> окно other linker options
и тут вписать:
-mwindows

Теперь, хотя приложение консольное, но консоль не... точнее появится. Но только если вы запускаете его из под minGW. Если же просто запустить его exe-шник щелчком - консоли не будет!

2.Visual Studio
Bear писал(а):Попробуйте этот фрагмент:

Код: Выделить всё

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif
он отсюда:
http://www.irrlicht.ru/index.php?vm=26.view.61.
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:33

Минимальный рабочий код?

Создаёте новый проект и лень набирать базовый каркас для работы движка? Можно, конешно, взять за основу код из примера 01.Helloworld, а можно и просто копировать сей код... Не забудьте настроить зависимости и указать пути для поиска инклудов и либов! ;)

Код: Выделить всё

#include <irrlicht.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

int main(int argc, char** argv)
{
    IrrlichtDevice *device =
        createDevice(EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,
            false, false, false, 0);


    IVideoDriver* driver = device->getVideoDriver();
    ISceneManager* smgr = device->getSceneManager();
    IGUIEnvironment* guienv = device->getGUIEnvironment();

    smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

    while(device->run())
    {
        driver->beginScene(true, true, SColor(0,200,200,200));

        smgr->drawAll();
        guienv->drawAll();

        driver->endScene();
    }
    device->drop();

    return 0;
}
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:43

Обработчик событий или как обрабатывать нажатие клавиш?

Итак, создали что-то похожее на 3D-приложение. Хочется все повертеть, подвигать или хотя бы выйти нормальным, человеческим способом по ESAPE, а не ALT+F4... Но как?

Способ №1 - создать новый класс:

Код: Выделить всё

class MyReceiver : public IEventReceiver
{
public:
    MyReceiver(){};
    ~MyReceiver(){};
    bool OnEvent(const SEvent& event)
    {
        if(event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown)
        {
            switch (event.KeyInput.Key)
            {
                case KEY_ESCAPE:
                    //device->closeDevice();
                    break;
                default:
                    break;
            }
        }
        return false;
    }
private:
};
И указать нашему драйверу, что нужно слушаться этого обработчика:

Код: Выделить всё

MyReceiver myRec;
IrrlichtDevice *device = createDevice(EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,false, false, false, &myRec);
Способ №2. Можно унаследовать ваш класс от IEventReceiver, создать функцию OnEvent и указать драйверу в качестве рецейвера this. На пальцах:

Код: Выделить всё

#include <irrlicht.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

class MyClass : public IEventReceiver //на собственный класс
{
public:
     MyClass(){};
     ~MyClass(){};
     void Run() //здесь мы подготовим и запустим наш движок
     {
          device =createDevice(EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,false, false, false, this); // Обратите внимание на последний параметр
          IVideoDriver* driver = device->getVideoDriver();
          ISceneManager* smgr = device->getSceneManager();
          IGUIEnvironment* guienv = device->getGUIEnvironment();

          IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");
          IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
          node->setMaterialFlag(EMF_LIGHTING, false);
          node->setFrameLoop(0, 310);
          node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );

          smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

          while(device->run())
          {
               driver->beginScene(true, true, SColor(0,200,200,200));
               smgr->drawAll();
               guienv->drawAll();
               driver->endScene();
          }
          device->drop();
     }

private:
     IrrlichtDevice *device;

     bool OnEvent(const SEvent& event) //функция рецейвера - именно здесь и будут обрабатываться все клавишные и "мышиные" события, события GUI
     {
          if(event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown)
          {
               switch (event.KeyInput.Key)
               {
                    case KEY_ESCAPE:
                         device->closeDevice();
                         break;
                    default:
                         break;
               }
          }
     return false;
     }
};

int main(int argc, char** argv)
{
     MyClass myClass;
     myClass.Run();
     return 0;
}
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 10:54

Как привязать один объект к другому?

Хотите "прикрепить", например, руки к камере, голову к телу, колеса к машине..., но как это сделать? Задать объекту родителя. Для головы, например, родителем является тело. И не наоборот, заметьте...
В Irrlicht это делается либо же при создании Node:

Код: Выделить всё

//прикрепим дварфа к камере
scene::IAnimatedMeshSceneNode* dwarfNode = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/dwarf.x"), camera);
Либо же отдельной функцией:

Код: Выделить всё

//прикрепим дварфа к камере
scene::IAnimatedMeshSceneNode* dwarfNode = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/dwarf.x"));
dwarfNode->setParent(camera);
Стоит отметить, что у прикрепленного объекта (child) координаты позиции будут высчитываться не относительно глобальных/мировых осей, а осей родителя (parent).

Добавлено от Bear:
А отсоединить обратно, либо присединить другому объекту можно так:
forum/viewtopic.php?f=1&t=84&start=50#p1289
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 11:04

Как изменить клавиши управления FPS-камерой?

Обратите внимание на параметры keyMapArray и keyMapSize при создании камеры.

Код: Выделить всё

			SKeyMap keyMap[9];
			keyMap[0].Action = EKA_MOVE_FORWARD; //вперед
			keyMap[0].KeyCode = KEY_UP;
			keyMap[1].Action = EKA_MOVE_FORWARD;
			keyMap[1].KeyCode = KEY_KEY_W;

			keyMap[2].Action = EKA_MOVE_BACKWARD; //назад
			keyMap[2].KeyCode = KEY_DOWN;
			keyMap[3].Action = EKA_MOVE_BACKWARD;
			keyMap[3].KeyCode = KEY_KEY_S;

			keyMap[4].Action = EKA_STRAFE_LEFT; //стрейф влево
			keyMap[4].KeyCode = KEY_LEFT;
			keyMap[5].Action = EKA_STRAFE_LEFT;
			keyMap[5].KeyCode = KEY_KEY_A;

			keyMap[6].Action = EKA_STRAFE_RIGHT; //стрейф вправо
			keyMap[6].KeyCode = KEY_RIGHT;
			keyMap[7].Action = EKA_STRAFE_RIGHT;
			keyMap[7].KeyCode = KEY_KEY_D;

			keyMap[8].Action = EKA_JUMP_UP;  //прыжок
			keyMap[8].KeyCode = KEY_KEY_J;
			//addCameraSceneNodeFPS(parent, rotateSpeed, moveSpeed, id, keyMapArray, keyMapSize, noVerticalMovement, jumpSpeed, invertMouse, makeActive)
			scene::ICameraSceneNode* camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap, 9, false, 3.f);
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Аватара пользователя
disaipe
Сообщения: 1507
Зарегистрирован: 02 янв 2011, 20:32
Откуда: Ковров
Контактная информация:

Re: Часто задаваемые вопросы по irrLicht (FAQ)

Сообщение disaipe » 25 янв 2011, 11:08

Не отображаются русские буквы?
nikolas писал(а):Возьми Font Editor, сделай нормальный шрифт с русскими буквами, и установи.
Например, так:

Код: Выделить всё

IGUIEnvironment* guienv=device->getGUIEnvironment();
IGUISkin* skin=guienv->getSkin();
IGUIFont *font =guienv->getFont("твой шрифт.xml");
if(font)   skin->setFont(font);
Использовать, как L"Кириллица".

Стандартный шрифт Иррлихта русский не поддерживает.
Вложения
arial.rar
шрифт Arial с кириллицей
(54.63 КБ) 568 скачиваний
То самое чувство, когда программа работает правильно из-за ошибок в коде...

Закрыто

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя