• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Tutorial di base 1
#1
Prerequisiti
In questo tutorial si presume che tu abbia delle conoscenze sul c++ e che tu sia abile di settare ee compilare un progetto con Ogre.

Questo tutorial usa il progetto predefinito Dell Appwizard o del OGRE WIKI TUTORIAL FRAMEWORK guarda QUI per info.

Prepariamoci
Codice inizialei

Per questoTutorial useremo il codice di base Pre-Costruito di cui dovrete ignorare la maggior parte tranne che il metodo CreateScene()

IniziamoSadsaltate questa parte se usate l'Appwizard)

Create un nuovo progetto chiamato tutorial(o come meglio credete)

Aggiungete le intestazione del tutorial framework nel vostro codice(nel .cpp)

Codice:
BaseApplication.h
BaseApplication.cpp
TutorialApplication.h
TutorialApplication.cpp

Il file TutorialApplication.cpp sarà l'unico file che useremo in questo tutorial e dovrebbe essere così formato :
Codice:
#include "TutorialApplication.h"

TutorialApplication::TutorialApplication(void)
{
}

TutorialApplication::~TutorialApplication(void)
{
}

//-------------------------------------------------------------------------------------
void TutorialApplication::createScene(void)
{
    Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");

    Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    headNode->attachObject(ogreHead);

    // Set ambient light
    mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

    // Create a light
    Ogre::Light* l = mSceneMgr->createLight("MainLight");
    l->setPosition(20,80,50);
}



#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
    int main(int argc, char *argv[])
#endif
    {
        // Create application object
        TutorialApplication app;

        try
        {
            app.go();
        } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR| MB_TASKMODAL);
#else
            std::cerr << "An exception has occured: " << e.getFullDescription().c_str() << std::endl;
#endif
        }

        return 0;
    }

#ifdef __cplusplus
}
#endif

Fatto questo compilate e dovrebbe uscirvi il testone di ogre :
[Immagine: dl2015&display&x=300&y=225]

Premete esc quando volete uscire

Come Ogre Funziona
Adesso adrò a spiegare come Ogre funziona tramite le sue tre classi fondamentali:
SceneManager Basics
Entity Basics
SceneNode Basics

SceneManager Basics
Il SceneManager Basics è quello che controlla tutto quello appare nello schermo , quando piazzi un oggetto nella scena il SceneManager Basics è quello che ne controlla la posizione la rotazione etc. etc.
Quando crei una Cam il SceneManager Basics ne tiene conto della posizione, così come quando crei un piano, una luce, o tutto quello che appare nella scena
Entity Basics
Un'entità è il tipo di oggetto che può essere renderizzato nella scena
Puoi pensare ad un entità come una qualsiasi mesh : un robot è un entità un pesce è un entità persino un terreno è un enorme entità
Si sbaglia invece a pensare che le particelle, le Cam e le luci siano entità
Ricordati che però ogre non renderizza un entità direttamente dopo averla caricata : hai bisogno infatti di collegarla ad un nodo nella scena

SceneNode Basics

Come detto sopra il scene node tiene conto della posizione dell'orientamento di tutti gli oggetti attacati ad esso .
Quando carichi un entità non viene renderizzata finchè non viene attacata allo scene node, lo scene node non è una cosa visibile nello schermo: solo quando attacchi qualcosa ad esso ci sarà qualcosa visibile nella scena.
Lo scene node può avere qualsiasi numero di oggetti attacati ad esso .

La tua prima applicazione Ogre

Ora tornate al codice che abbiamo creato in precedenza. Trovate il
metodo createScene
In questo tutorial manipoleremo solo questo metodo.
La prima cosa che vogliamo fare è impostare la luce ambiente per la scena in modo che possiamo vedere quello che stiamo facendo. Facciamo questo chiamando la funzione setAmbientLight e specificando che colore che vogliamo.
Aggiungete le seguenti righe al metodo:
Codice:
mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0));

La prossima cosa da fare è creare un entità tramite la funzione membro
SceneManager createEntity
Codice:
Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");

Ok adesso vi chiederete da dove è spuntato fuori questo msceneMgr
ed i suoi parametri
allora i parametri sono questi :
il primo è il nome dell'oggetto NOTA CHE OGNI OGGETTO DEVE AVERE UN NOME UNICO!
il secondo è il percorso del modello 3d

Caricato il modello bisogna creare il nodo da attaccargli
Codice:
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");

alla fine bisogna attaccare l'oggetto al nodo per renderizzare l'oggetto

Codice:
headNode->attachObject(ogreHead);

ed è tutto !

adesso potete compilare e vedrete questo :
[Immagine: dl2015&display&x=300&y=225]


Coordinate e vettori

Prima di andare avanti dobbiamo parlare di coordinate e dei vettori di ogre:
Ogre (come molti altri engine) usa gli assi X e Z sul piano orizzontale e l'asse Y su quello verticale

Mentre si sta guardando il monitor ora, l'asse x sarebbe dal lato sinistro al lato destro del monitor, con il lato destro è la direzione x positivo. L'asse y correva dalla parte inferiore del monitor per la parte superiore del monitor, con la parte superiore è la direzione y positiva. L'asse z sarebbe dentro e fuori dello schermo, con fuori dello schermo è la direzione positiva z.

[Immagine: display1921]
Notate come il nostro Capo Ogre è rivolto verso di noi lungo la direzione z? Questa è una proprietà della rete e la posizione della telecamera e di fronte. Telecamere sono coperti in un altro tutorial, ma per ora solo riconoscere che la testa del Ogre si trova nella posizione (0,0,0) e che la nostra visione di esso è da davanti diversi modi. La direzione che la testa si trova ad affrontare è il risultato di come la rete è stata orientata quando è stato creato e salvato dall'artista. Orco non fa ipotesi su come orientare i vostri modelli. Ciascuna maglia che si carica può avere una diversa "direzione di partenza", che si sta affrontando.

Ogre utilizza la classe Vector per rappresentare sia la posizione e la direzione (non c'è classe Point). Ci sono vettori definiti per 2 (Vector2), 3 (Vector3), e 4 (Vector4) dimensioni, con Vector3 è il più comunemente usato. Se non si ha familiarità con Vettori, forse si dovrebbe ripassare su di esso prima di fare qualcosa di serio con Ogre. La matematica dietro Vettori diventa molto utile quando si inizia a lavorare su programmi complessi.

aggiungere un altro oggetto

Ora che avete capito come funzionano i sistemi di coordinate, possiamo tornare al nostro codice. Nelle tre linee che abbiamo scritto, da nessuna parte abbiamo specificare il luogo esatto in cui abbiamo voluto la nostra testa Ogre a comparire. La maggior parte delle funzioni in Ogre hanno parametri di default per loro. Ad esempio, il SceneNode:: funzione membro createChildSceneNode in Ogre ha tre parametri: il nome del SceneNode, la posizione del SceneNode, e la rotazione iniziale (orientamento) SceneNode sta affrontando. La posizione, come potete vedere, è stato impostato per noi alle coordinate (0, 0, 0). Creiamo un altro SceneNode, ma questa volta faremo specificare il luogo di partenza per essere qualcosa di diverso da quello di origine:
Codice:
Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( "Head2", "ogrehead.mesh" );
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );
headNode2->attachObject( ogreHead2 );
Questo dovrebbe essere familiare. Abbiamo fatto la stessa cosa di prima, con due eccezioni. Prima di tutto, abbiamo chiamato l'entità e SceneNode qualcosa di leggermente diverso. La seconda cosa che abbiamo fatto è specificato che la posizione di partenza sarà di 100 unità nella direzione x lontano dalla SceneNode radice (ricordiamo che tutte le posizioni SceneNode sono relativi ai loro genitori). Compilare ed eseguire il demo. Ora ci sono due teste Ogre side-by-side. Potrebbe essere necessario tornare indietro utilizzando il tasto 's' o la freccia in basso per vedere entrambe le teste.

approfondimento sulle entità

Questo dovrebbe essere familiare. Abbiamo fatto la stessa cosa di prima, con due eccezioni. Prima di tutto, abbiamo chiamato l'entità e SceneNode qualcosa di leggermente diverso. La seconda cosa che abbiamo fatto è specificato che la posizione di partenza sarà di 100 unità nella direzione x lontano dalla SceneNode radice (ricordiamo che tutte le posizioni SceneNode sono relativi ai loro genitori). Compilare ed eseguire il demo. Ora ci sono due teste Ogre side-by-side. Potrebbe essere necessario tornare indietro utilizzando il tasto 's' o la freccia in basso per vedere entrambe le teste.

La classe Entity è molto ampia, e non saremo copertura come utilizzare ogni parte dell'oggetto qui ... quanto basta per cominciare. Ci sono alcune funzioni membro immediatamente utile in Entity che vorrei sottolineare.

Il primo è Entity:: setVisible e Entità:: IsVisible. È possibile impostare qualsiasi entità per essere visibile o meno, semplicemente chiamando questa funzione. Se avete bisogno di nascondere un entità, ma più tardi lo schermo, quindi chiamare questa funzione invece di distruggere l'entità e in seguito ricreare. Si noti che non c'è bisogno di "pool" Enti in su. Una sola copia di maglia di ogni oggetto e la struttura sono sempre caricati in memoria, quindi non sono da soli risparmiando molto, cercando di salvarli. L'unica cosa che veramente è salvare i costi di creazione e distruzione per l'oggetto stesso Ente, che è relativamente basso.

La funzione getName restituisce il nome di entità, e la funzione restituisce il getParentSceneNode SceneNode che l'Ente è collegato.

approfondimento sulle scene nodes

La classe SceneNode è molto complesso. Ci sono un sacco di cose che si possono fare con uno SceneNode, quindi dovremo coprire solo alcune delle più utili.

È possibile ottenere e impostare la posizione di uno SceneNode con getPosition e setPosition (sempre relativo allo SceneNode genitore). È possibile spostare l'oggetto relativamente alla sua posizione corrente utilizzando il metodo del tradurre.

SceneNode non solo impostare la posizione, ma anche gestire la scala e la rotazione dell'oggetto. È possibile impostare la scala di un oggetto con la funzione di scala. È possibile utilizzare il beccheggio, imbardata, rollio e funzioni per ruotare gli oggetti. È possibile utilizzare resetOrientation per ripristinare tutte le rotazioni fatto per l'oggetto. È inoltre possibile utilizzare la, getOrientation setOrientation, e rotazione per rotazioni più avanzate. Non saremo coprire fino quaternioni un tutorial molto più tardi però.

Hai già visto la funzione attachObject. Queste funzioni relative sono utili anche se si sta cercando di manipolare gli oggetti che sono collegati a uno SceneNode: numAttachedObjects, getAttachedObject (ci sono più versioni di questa funzione), detachObject (anche più versioni), detachAllObjects. Ci sono anche tutta una serie di funzioni per trattare con i genitori e SceneNode figlio pure.

Poiché tutti posizionamento e la traduzione è fatta rispetto al SceneNode genitore, possiamo fare due SceneNode si muovono insieme molto facilmente. Al momento abbiamo questo codice nella domanda:

Codice:
mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0));

Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");
headNode->attachObject(ogreHead);

Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( "Head2", "ogrehead.mesh" );
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );
headNode2->attachObject( ogreHead2 );
se cambiamo la sesta linea da questo
Codice:
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );
in questo
Codice:
Ogre::SceneNode* headNode2 = headNode->createChildSceneNode( "HeadNode2", Ogre::Vector3( 100, 0, 0 ) );

Poi abbiamo fatto headNode2 un figlio di headNode. HeadNode in movimento si sposta headNode2 con essa, ma headNode2 movimento non avrà effetto headNode. Per esempio questo codice si muoverebbe solo headNode2:

Codice:
headNode2->translate( Ogre::Vector3( 10, 0, 10 ) );

Il codice seguente si muoverebbe headNode, e dato che headNode2 è un figlio di headNode, headNode2 sarebbe mosso anche:

Codice:
headNode->translate( Ogre::Vector3( 25, 0, 0 ) );

Se si hanno problemi con questo, la cosa più semplice da fare è iniziare al SceneNode radice e andare verso il basso. Diciamo che (come in questo caso), abbiamo iniziato con headNode in (0, 0, 0) e tradotto da (25, 0, 0); nuova posizione headNode sarebbe (25, 0, 0) rispetto al suo genitore. headNode2 iniziato a (100, 0, 0) e lo abbiamo tradotto da (10, 0, 10), quindi la sua nuova posizione (110, 0, 10) rispetto al suo genitore.

Ora cerchiamo di capire dove queste cose sono realmente. Inizia il SceneNode radice. La sua posizione è sempre (0, 0, 0). Ora, la posizione headNode è (root + headNode): (0, 0, 0) + (25, 0, 0) = (25, 0, 0). Non sorprende.

Ora, headNode2 è un bambino di headNode, quindi la sua posizione è (root + + headNode headNode2): (0, 0, 0) + (25, 0, 0) + (110, 0, 10) = (135, 0, 10).

Questo è solo un esempio per spiegare come pensare eredità posizione SceneNode. Raramente si avrà mai bisogno di calcolare la posizione assoluta del vostro nodi. Infine, si noti che è possibile ottenere sia SceneNode ed Enti con il loro nome chiamando i metodi getSceneNode e GetEntity della SceneManager, in modo da non dover tenere un puntatore ad ogni SceneNode si crea. Si deve aggrapparsi a quelle che uso spesso però.

questo è tutto !
divertitevi con OGRE !
 
Rispondi
#2
scusate se ci ho messo tanto ma adesso il primo tutorial è finito è solo da ritoccare =)
 
Rispondi
#3
bravo zap!
 
Rispondi
#4
(20-01-2012, 10:58 AM)Zapetino Ha scritto: è solo da ritoccare =)

Concordo xd.

 
Rispondi
#5
xd mi sono reso conto di averlo lasciato in sospeso per troppo e allora provvisoriamente lo ho tradotto con google translate, ma al più presto lo finisco di mano mia promesso !
 
Rispondi
  


Vai al forum:


Browsing: 1 Ospite(i)