• Benvenuto in Making Videogames!
  • Condividi la tua passione!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati



Valutazione discussione:
  • 1 voto(i) - 5 media
  • 1
  • 2
  • 3
  • 4
  • 5
Title: Tutorial 15 - Loading Scenes from .irr Files
Modi discussione
#1
Tutorial 15: Loading Scenes from .irr Files

[Immagine: 015shot.jpg]

Dalla versione 1.1, Irrlicht è capace di salvare e caricare una intera scena in un file .irr, un formato basato sul xml. Esiste un editor, chiamato irrEdit (http://www.ambiera.com/irredit) in grado di editare questi files e che può anche essere usato come editor per i nostri mondi virtuali e come editor di sistemi particellari. In questo tutorial mostreremo come usare i file .irr.
Cominciamo: Creiamo un device Irrlicht e impostiamo la nostra finestra.
Codice PHP:
#include <irrlicht.h>
#include "driverChoice.h"

using namespace irr;

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

int main(int argcchar** argv)
{
    
// ask user for driver
    
video::E_DRIVER_TYPE driverType=driverChoiceConsole();
    if (
driverType==video::EDT_COUNT)
        return 
1;

    
// create device and exit if creation failed

    
IrrlichtDevicedevice =
        
createDevice(driverTypecore::dimension2d<u32>(640480));

    if (
device == 0)
        return 
1// could not create selected driver.

    
device->setWindowCaption(L"Load .irr file example");

    
video::IVideoDriverdriver device->getVideoDriver();
    
scene::ISceneManagersmgr device->getSceneManager(); 
Carichiamo il nostro file .irr I file di tipo .irr possono contenere un'intera scena di Irrlicht incluso: animators, materiali e sistemi particellari. C'è anche la possibilità di salvare dati utenti arbitrari per ciascun nodo della scena. Per semplicità in questo esempio caricheremo comunque solo dati di scena. Si rimanda alla documentazione su IsceneManager::loadScene e ISceneManager:ConfusedaveScene per maggiori informazioni. In ogni caso per caricare e mostrare una enorme, complicata e singola scena, dobbiamo solo richiamare loadScene().
Codice PHP:
// load the scene
    
if (argc>1)
        
smgr->loadScene(argv[1]);
    else
        
smgr->loadScene("../../media/example.irr"); 
Creiamo la camera, e diamole un collision response animator costruito a partire dal nodo mesh presente nella scena che abbiamo caricato.
Codice PHP:
scene::ICameraSceneNode camera smgr->addCameraSceneNodeFPS(050.f0.1f);

    
// Create a meta triangle selector to hold several triangle selectors.
    
scene::IMetaTriangleSelector meta smgr->createMetaTriangleSelector(); 
Andiamo a cercare tutti i nodi della scena e creiamoci tanti triangle selectors per ciascun nodo che vogliamo collida. Li andiamo poi a far confluire in un unico 'meta' selector. Tipicamente, anche per ottimizzare, si cerca di avere maggiori informazioni su quale nodo vada elaborato per controllare le collisioni; queste informazioni le possiamo ottenere passando dal nome del nodo o dal suo Id.
Codice PHP:
core::array<scene::ISceneNode *> nodes;
    
smgr->getSceneNodesFromType(scene::ESNT_ANYnodes); // Find all nodes

    
for (u32 i=0nodes.size(); ++i)
    {
        
scene::ISceneNode node nodes[i];
        
scene::ITriangleSelector selector 0;

        switch(
node->getType())
        {
        case 
scene::ESNT_CUBE:
        case 
scene::ESNT_ANIMATED_MESH:
            
// Because the selector won't animate with the mesh,
            // and is only being used for camera collision, we'll just use an approximate
            // bounding box instead of ((scene::IAnimatedMeshSceneNode*)node)->getMesh(0)
            
selector smgr->createTriangleSelectorFromBoundingBox(node);
        break;

        case 
scene::ESNT_MESH:
        case 
scene::ESNT_SPHERE// Derived from IMeshSceneNode
            
selector smgr->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
            break;

        case 
scene::ESNT_TERRAIN:
            
selector smgr->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node);
            break;

        case 
scene::ESNT_OCTREE:
            
selector smgr->createOctreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
            break;

        default:
            
// Don't create a selector for this node type
            
break;
        }

        if(
selector)
        {
            
// Add it to the meta selector, which will take a reference to it
            
meta->addTriangleSelector(selector);
            
// And drop my reference to it, so that the meta selector owns it.
            
selector->drop();
        }
    } 
Ora che ai nodi di tipo mesh sono stati aggiunti i rispettivi triangle selectors, formando una specie di meta selector, creiamo un collision response animator a partire proprio da questo meta selector.
Codice PHP:
scene::ISceneNodeAnimatoranim smgr->createCollisionResponseAnimator(
        
metacameracore::vector3df(5,5,5),
        
core::vector3df(0,0,0));
    
meta->drop(); // I'm done with the meta selector now

    
camera->addAnimator(anim);
    
anim->drop(); // I'm done with the animator now

    // And set the camera position so that it doesn't start off stuck in the geometry
    
camera->setPosition(core::vector3df(0.f20.f0.f));

    
// Point the camera at the cube node, by finding the first node of type ESNT_CUBE
    
scene::ISceneNode cube smgr->getSceneNodeFromType(scene::ESNT_CUBE);
    if(
cube)
        
camera->setTarget(cube->getAbsolutePosition()); 
Fatto. Disegniamo il tutto e finiamo come di consueto.
Codice PHP:
int lastFPS = -1;

    while(
device->run())
    if (
device->isWindowActive())
    {
        
driver->beginScene(truetruevideo::SColor(0,200,200,200));
        
smgr->drawAll();
        
driver->endScene();

        
int fps driver->getFPS();

        if (
lastFPS != fps)
        {
            
core::stringw str L"Load Irrlicht File example - Irrlicht Engine [";
            
str += driver->getName();
            
str += "] FPS:";
            
str += fps;

            
device->setWindowCaption(str.c_str());
            
lastFPS fps;
        }

    }

    
device->drop();

    return 
0;


Versione scaricabile da QUI
 
Reply
  


Vai al forum:


Browsing: 1 Ospite(i)