Integração do Motor Irrlicht com Qt para Renderização em Janelas Específicas

Instalação e Configuração de Bibliotecas e Plugins

Este guia aborda a integração do motor Irrlicht em aplicações Qt 5 para exibir a saída gráfica em uma janela Qt dedicada, considerando o ambiente de desenvolvimento com Visual Studio 2012.

Primeiramente, instale o Qt 5.2.0 a partir do instalador oficial. Em seguida, adicione o plugin do Qt para o Visual Studio 2012, disponível na página de downloads do Qt. Para o motor Irrlicht, utilize a versão 1.8.1, que já inclui bibliotecas pré-compiladas. Caso deseje compilar manualmente, será necessário o DirectX SDK, ou você pode desativar o suporte ao Direct3D no arquivo de configuração do Irrlicht.

Para desativar o Direct3D e forçar o uso do OpenGL, edite o arquivo IrrCompileConfig.h localizado no diretório de include do Irrlicht. Comente as linhas referentes à compilação com Direct3D:

// Comentando suporte ao Direct3D 9
// #define _IRR_COMPILE_WITH_DIRECT3D_9_

#ifdef NO_IRR_COMPILE_WITH_DIRECT3D_9_
#undef _IRR_COMPILE_WITH_DIRECT3D_9_
#endif

Após a instalação, configure o Visual Studio 2012 para reconhecer o Qt: no menu Qt5, selecione "Qt Options" e adicione o caminho de instalação do Qt.

Preparação do Ambiente de Desenvolvimento

Crie um novo projeto Qt no Visual Studio, nomeando a solução como "IrrlichtSolution" e o projeto como "IrrlichtHelloWorld". Durante a criação, selecione a opção de suporte a OpenGL. Em seguida, cnofigure os diretórios de include e bibliotecas no projeto.

Nas propriedades do projeto, adicione os caminhos de include do Irrlicht e do Qt. Para as bibliotecas, especifique os diretórios onde estão localizados os arquivos .lib do Irrlicht. Nos campos de dependências adicionais do linker, inclua as bibliotecas necessárias, como Irrlicht.lib.

Design e Implementação

Baseado no exemplo "HelloWorld" do Irrlicht, o objetivo é adaptá-lo para:

  • Renderizar a saída do Irrlicht em uma janela Qt específica.
  • Permitir iniciar e parar o motor de renderização.
  • Controlar a posição da câmera na cena.

Para renderizar em uma janela Qt, utilize a estrutura SIrrlichtCreationParameters do Irrlicht, passando o identificador da janela Qt. Em seguida, crie um dispositivo Irrlicht com createDeviceEx.

irr::SIrrlichtCreationParameters config;
config.WindowId = reinterpret_cast<void*>(qtWindowHandle);
IrrlichtDevice* device = createDeviceEx(config);

Para controlar a câmera, armazene a referência ao nó da câmera e atualize sua posição conforme necessário:

irr::core::vector3df camPos(0, 30, -40);
irr::scene::ICameraSceneNode* camera = sceneManager->addCameraSceneNode(0, camPos, irr::core::vector3df(0, 5, 0));

A renderização é realizada em uma thread separada, herdando de QThread. A thread gerencia o loop principal do Irrlicht, permitindo iniciar e pausar a renderização.

class IrrlichtRenderThread : public QThread {
public:
    void run() override {
        irr::SIrrlichtCreationParameters params;
        params.WindowId = reinterpret_cast<void*>(targetWindowId);
        IrrlichtDevice* dev = createDeviceEx(params);
        if (!dev) return;

        dev->setWindowCaption(L"Demo Irrlicht com Qt");
        IVideoDriver* drv = dev->getVideoDriver();
        ISceneManager* smgr = dev->getSceneManager();
        IGUIEnvironment* gui = dev->getGUIEnvironment();

        gui->addStaticText(L"Renderizando via Irrlicht em janela Qt",
            irr::core::rect<s32>(10, 10, 260, 22), true);

        IAnimatedMesh* meshData = smgr->getMesh("modelo.md2");
        if (!meshData) {
            dev->drop();
            return;
        }

        IAnimatedMeshSceneNode* meshNode = smgr->addAnimatedMeshSceneNode(meshData);
        if (meshNode) {
            meshNode->setMaterialFlag(EMF_LIGHTING, false);
            meshNode->setMD2Animation(scene::EMAT_STAND);
            meshNode->setMaterialTexture(0, drv->getTexture("textura.bmp"));
        }

        irr::core::vector3df initialCamPos(0, 30, -40);
        ICameraSceneNode* cam = smgr->addCameraSceneNode(0, initialCamPos, irr::core::vector3df(0, 5, 0));

        while (dev->run() && renderActive) {
            drv->beginScene(true, true, SColor(255, 100, 101, 140));
            smgr->drawAll();
            gui->drawAll();
            drv->endScene();
        }
        dev->drop();
    }

    bool renderActive = true;
    void* targetWindowId = nullptr;
};

Para ativar ou desativar a renderização, modifique a flag renderActive da thread. A posição da câmera pode ser ajustada diretamente no nó da câmera após a captura da referência.

Tags: Qt5 Irrlicht C++ Visual Studio 2012 3D Rendering

Publicado em 6-1 18:26 por Thomas