introduzione a panda3d -...
TRANSCRIPT
Introduzione a Panda3DIntroduzione a Panda3D
Davide GadiaDavide Gadia
Corso di Ambienti Virtuali Immersivi e InterattiviCorso di Ambienti Virtuali Immersivi e Interattivi
Laurea Magistrale in Informatica per la ComunicazioneLaurea Magistrale in Informatica per la Comunicazione
a.a. 2012/2013a.a. 2012/2013
• 3D engine sviluppato attualmente da Disney and Carnegie Mellon University's Entertainment Technology Center
• Utilizzato anche per prodotti commerciali
• http://www.panda3d.org
Panda3D
• Sviluppato in C++• Possibilità di utilizzare C++ o Python
• Python utilizzato per scripting Binding al core dell'engine, che è sviluppato in C++ Permette sviluppo codice in maniera + facile e + veloce
Panda3D: C++ o Python ?
• Python per tutto quello che non è calcolo matematico computazionalmente complesso
• C++ per parti di calcolo complesso
• Chiamare C++ da Python SWIG http://www.swig.org Ctypes http://docs.python.org/library/ctypes.html
• Alternativa per velocizzare conti senza usare C++ Numpy http://numpy.scipy.org/
• Vedremo qualcosa di questo.....
Panda3D: strategia per progetti complessi
• Formati nativi : EGG BAM
Panda3D: modelli e animazioni
• ASCII• File di produzione e debugging• Contiene:
Geometria Animazioni Joint Parametri textures ....
• Spesso geometria e animazione sono su file diversi In relazione a separazione tra Models e Actors in Panda3D
Panda3D: formato EGG
• Plugin per diversi software di CG Maya
http://www.panda3d.org/manual/index.php/Converting_from_Maya Blender
http://www.panda3d.org/manual/index.php/Converting_from_Blenderhttp://sourceforge.net/projects/chicken-export/ (Blender 2.49)https://code.google.com/p/yabee/ (Blender 2.6x)
......
• Applicativi Panda3D per conversione diretta in EGG http://www.panda3d.org/manual/index.php/List_of_Panda3D_Executables
• Forum Panda3D su questioni esportazione in EGG: http://www.panda3d.org/forums/viewforum.php?f=2
• Applicativo pview: preview modelli EGG http://www.panda3d.org/manual/index.php/Previewing_3D_Models_in_Pview
Panda3D: formato EGG
• Binario• File di rilascio• EGG file vengono convertiti in BAM al primo caricamento• Processo può essere lungo• BAM sono legati alla versione di Panda3D
Se cambia la versione bisogna generare nuovamente i file
Panda3D: formato BAM
• Formato nativo DirectX Formato complesso ma ben supportato dai vari software Esportazione da Blender Attenzione: vanno esportati tutti i frame di un'animazione Può essere convertito in BAM tramite comando x2egg
http://www.panda3d.org/manual/index.php/List_of_Panda3D_Executables
Panda3D: supporto file X
• Opzione 1: Fate voi modellazione, texturing e animazione Sconsigliato se non siete già esperti o se non avete MOLTO tempo
per occuparvene OLTRE allo sviluppo del progetto
• Opzione 2: Cercate modelli già fatti, possibilmente privi di vincoli di copyright Cercate su forum Panda3D, community Blender, web in generale
Modelli per progetto finale
• Link a modelli gratuiti, suoni, tutorial, ecc http://homes.dico.unimi.it/~gadia/avii/aa_1213/index.html#link Qualità varia, con o senza animazioni Controllate eventuali aggiunte durante il corso
Link utili
• “Config.prc” Windows: ...\cartella_installazione_Panda3D\etc\ Linux: /etc/ OSX: /Developer/Panda3D/etc/
• Controlla molte impostazioni globali Scelta tra OpenGL o DirectX Risoluzione finestra Opzione fullscreen Opzioni su messaggi output Attivazione e scelta visualizzazione stereo ..... http://www.panda3d.org/manual/index.php/Configuring_Panda3D
Panda3D: file di configurazione
• Non opportuno modificare il file globale per ogni applicazione• Possibili approcci:
Utilizzare file di default, e modificare singole opzioni all'interno del codice Python, chiamando loadPrcFileData
I cambiamenti non vengono scritti sul file esterno
Caricare da codice Python un nuovo file di configurazione locale tramite loadPrcFile
Permette di gestire localmente applicazioni con molti parametri diversi dai valori standard del file di configurazione globale
Possibilità di creare variabili di configurazioni ad-hoc tramite ConfigVariableString, ConfigVariableInt, ecc....
Panda3D: file di configurazione
• Queste slide (e quelle della prossima lezione) NON sostituiscono la documentazione di Panda3D E non comprendono TUTTI gli aspetti implementativi che
potrebbero servire per il progetto finale
• Servono solo come punto di riferimento per gli aspetti principali di un'applicazione Panda3D e con la sua documentazione Gli studenti sono invitati ad approfondire altri aspetti che possono
essere importanti (es: simulazione fisica, AI, ...) Una volta acquisiti gli aspetti base
Tramite la consultazione della documentazione, dei forum e degli eventuali esempi
Slide vs documentazione di Panda3D
• Queste slide (e quelle della prossima lezione) NON affrontano tutti gli aspetti tipici della programmazione di videogiochi E di quello che viene presentato, non entrano eccessivamente nel
dettaglio
• Gli studenti sono invitati ad approfondire altri aspetti che possono essere importanti per il progetto Es: shader, gestione avanzata collisioni, ecc Nella valutazione del progetto verrà valutata la capacità di
approfondimento, e l'eventuale integrazione di tecniche avanzate Non è richiesta l'implementazione da zero di tecniche aggiuntive
non direttamente essenziali agli obiettivi finali del progetto una integrazione “cosciente” di codice già esistente è
accettata Parlarne comunque per tempo con il docente!
Slide vs programmazione grafica real-time
• E' la classe principale di Panda3D Carica la maggior parte dei moduli principali Crea la finestra di disegno Crea e gestisce una camera Avvia il task manager e alcuni task di base Avvia un loop di esecuzione tramite il metodo run()
• DirectStart Scorciatoia per ShowBase Istanzia ShowBase direttamente dall'importazione Permette di snellire il codice di inizializzazione
Classe ShowBase
• Panda3D organizza gli oggetti in una struttura ad albero
• Istanze di PandaNode Superclasse per altre classi relative a Modelli, Camera, ecc...
• La radice è un nodo chiamato render
• Posizioni, attributi, ecc applicati in maniera gerarchica Se applicati a un nodo padre, vengono applicati a tutto il
sottoalbero
SceneGraph
• NodePath Contiene puntatore ad un PandaNode Più altri dati
• Rappresentano una interfaccia con i PandaNode Applico operazioni e altro ai NodePath Sono poi applicate ai rispettivi PandaNode
• Alcune operazioni sono specifiche di un certo tipo di nodo Devo applicarle direttamente al PandaNode nodePath.node().callsomemethod(...)
SceneGraph
SceneGraph
SceneGraph
• Diverso da sistema utilizzato da OpenGL o DirectX
Sistema di riferimento di Panda3D
• Traslazione cube.setPos(x,y,z) cube.setX(x), cube.setY(y), cube.setZ(z)
• Scala cube.setScale(s) cube.setSx(sx), cube.setSy(sy), cube.setSz(sz)
• Rotazione cube.setHpr(h,p,r) cube.setH(h), cube.setP(p), cube.setR(r)
Trasformazioni
• myNodePath.lookAt(....) Setta la matrice di trasformazione in modo da rivolgere l'oggetto
verso un altro oggetto NodePath, coordinate 3D, ecc
Particolarmente utile per camera
• myNodePath.setPos(otherNodePath, X, Y, Z) Posiziona l'oggetto in (X,Y,Z) rispetto alla posizione di un altro
NodePath Anche relativamente a se stesso
• Tutte le trasformazioni assieme: cube.setPosHprScale( x, y, x, h, p, r, sx, sy, sz )
Trasformazioni
• Parametri di scala, posizione e rotazione vanno inseriti manualmente Può essere un problema capire bene con i modelli dell'ambiente,
soprattutto se piuttosto grandi
• Per gestire almeno la traslazione iniziale (per visualizzare tutto il modello) Visualizzo il modello in pview
shift+b fornisce le informazioni sulla bounding box Utilizzo i dati nel codice
nodepath.getBounds().getRadius() Fornisce il diametro della bounding sphere del modello Posso traslare il modello sulle Y per poi rifinire meglio i parametri di rotazione e scala
Gestione posizione iniziale modelli
• Posizionamento iniziale del modello può richiedere un po' di tentativi In alcuni casi si può parametrizzare In altri va fatto manualmente
• Posizionamento di oggetti su piani/pavimenti/terreno
Può essere difficile evitare compenetrazioni o fluttuazioni Si possono utilizzare strumenti per la collision detection
CollisionHandlerFloor CollisionRay
Raggio da oggetto in verticale verso terreno Determino punto di intersezione e posiziono di
conseguenza Ottimo per terreni non planari
Ved esempio RoamingRalph
Gestione posizione iniziale modelli
• Modelli con animazione keyframing Figure antropomorfe Rigging e skinning creati in SW di animazione CG Esportati in formato egg
Di solito, 1 modello con la geometria Modelli separati con parametri di animazione dei joint
• Possibilità di: caricare attivare interpolare diverse animazioni
• http://www.panda3d.org/manual/index.php/Loading_Actors_and_Animations
(e pagine seguenti)
Actors
• Funzioni che vengono eseguite in ogni frame Ottimo per animazioni, controlli, ecc... Può continuare sempre (ritorna task.cont) Può fermarsi (ritorna task.done) Si può controllare da quanto tempo è eseguito (task.time) O da quanti frame (task.frame)
• Do-later task Task che vengono eseguiti una volta sola dopo un certo tempo Possono essere ripetuti (ritorna task.again)
Task
• Task specifici per la gestione di azioni, interpolate lungo un intervallo temporale
Posizione Rotazione Scala Parametri di funzione Suono .....
• Utili per la creazione di animazioni e sequenze di animazioni• http://www.panda3d.org/manual/index.php/Intervals
(e pagine seguenti)
Intervals
• Controlli con cui specificare l'attivazione di diversi intervalli In sequenza (Sequences) O in parallelo (Parallels) Anche in maniera annidata (diversi Parallels dentro una Sequence,
ecc) Possibilità di temporizzarne la partenza
• Possibilità di creare sequenze di animazioni complesse e scriptabili
• http://www.panda3d.org/manual/index.php/Sequences_and_Parallels
(e pagine seguenti)
Sequence e Parallels
• Input di mouse e tastiera, definiti dall'utente• Gestiti dal “messenger”• Deve essere definita una classe che eredita da DirecObject
Il gestore dell'evento sarà un metodo della classe myDirectObject.accept('Event Name',myDirectObjectMethod) Può essere gestito una volta sola (myDirectObject.acceptOnce(..)) Può essere ignorato (myDirectObject.ignore('Event Name'))
• L'evento viene inviato al gestore tramite myDirectObject.accept('Event Name') Messenger mantiene riferimento al gestore anche se viene
cancellato Bisogna chiamare prima myDirectObject.ignoreAll()
Gestione eventi
• Eventi Mouse: Tasti premuti, rilasciati, movimento rotella Impostazioni di default: mouse controlla movimento camera
base.disableMouse() per disabilitare la funzionalità (non il mouse)
http://www.panda3d.org/manual/index.php/Mouse_Support per dettagli
• Eventi tastiera: Tasto premuto, rilasciato, o tenuto premuto (sequenza di eventi) http://www.panda3d.org/manual/index.php/Keyboard_Support
Per dettagli
Mouse e Tastiera
• Possibilità di caricare suoni per background, effetti, ecc... http://www.panda3d.org/manual/index.php/Loading_and_Playing_Sounds_and_Music e seguenti.....
• Audio 3D Seleziono oggetto “listener”
Di solito, la camera Seleziono oggetto sorgente
Un Nodepath Associo un suono all'oggetto sorgente (NB: suono deve essere MONO) Intensità suono varierà allo spostarsi della camera Spostandosi tra le varie casse http://www.panda3d.org/manual/index.php/3D_Audio
• Supporto Surround 5.1 Inserire fmod-use-surround-sound true in file Config.prc
Audio
• Impostazioni di default: mouse controlla movimento camera base.disableMouse() per disabilitare la funzionalità (non il
mouse) Altrimenti ogni comando viene ignorato
• base.useDrive() Abilita altro controllo camera usando mouse e tastiera
Camera – gestione base
• base.cam vs base.camera Il primo è il NodePath della camera Il secondo è un NodePath di livello superiore
Di solito è quello che viene utilizzato per muovere la camera
• base.oobe() Il codice controlla base.camera Mouse controlla base.cam “Out of the body experience” utile per debug
Camera – gestione base
Camera – gestione base
Camera – gestione base
Camera – gestione base
Camera – gestione base
Camera – gestione base
Camera – gestione base
• Devo attivare la modalità stereo in Config.prg Imposto framebuffer-stereo #t (quadbuffer in Teatro Virtuale) Oppure red-blue-stereo #t (anaglifo)
• Posso impostare interoculare e convergenza In Config.prc:
default-iod valore default-converge valore
Nel codice dell'applicazione: base.camLens.setInterocularDistance(valore) base.camLens.setConvergenceDistance(valore)
Camera – gestione stereo
• Panda3D utilizza camera off-axis per stereoscopia Il parametro di convergenza è relativo alla distanza dal piano di
parallasse zero Non a un'effettivo angolo di convergenza delle camere
• Panda3D utilizza un'unità di misura fittizia chiamata pm Panda meters 1 pm = 1 piede = 0.3038 metri Si può comunque utilizzare la scala desiderata, basta mantenere
coerenza nella scena
Camera – gestione stereo
• Sistema che permette la rilevazione delle compenetrazioni tra i modelli E di implementare l'eventuale simulazione in risposta
Es: rimbalzo, respinta, acquisizione di punti, ecc
• Computazionalmente costoso da fare in real-time
• Di solito si utilizzano tecniche di approssimazione Bounding spheres, Bounding box Suddivisione gerarchica (octree, BSP-tree) della scena
• Per testare la possibilità di collisione, ed eventualmente evitare di fare calcoli complessi su tutta la geometria
Collision detection
Bounding Sphere Test
No intersezione BS
No intersezione oggetti
Faccio test su oggetti
Intersezione BS
No intersezione oggetti
Intersezione BS
Faccio test su oggetti
Intersezione oggetti
• Collision Solids: Solidi legati alla geometria del modello per determinare in
maniera semplificata l'eventuale collisione Diverse tipologie a disposizione Distinzione tra solidi “from” (modelli attivi, che provocano la
collisione), e solidi “into” (modelli passivi, che ricevono la collisione)
Posso assegnare diversi solidi allo stesso modello, per esempio una sfera grande per tutto il modello, più sfere piu' piccole sulle mani o i piedi, ecc
http://www.panda3d.org/manual/index.php/Collision_Solids
Collision detection in Panda3D
• Collision Traverser: È il task che, definiti i collision solids, controlla le collisioni tra i
solidi, e passa le informazioni al Collision Handler definito L'effettiva distinzione tra solidi from e into avviene assegnando al
Traverser solo i solidi che voglio considerare from Tutti gli altri collision solids vengono considerati into Se non viene indicato il contrario, un solido from viene anche
trattato come into, rispetto agli altri solidi from presenti nella scena
http://www.panda3d.org/manual/index.php/Collision_Traversers
Collision detection in Panda3D
• Collision Handler: Specifica cosa fare in risposta alla collisione Diversi tipi disponibili Generici:
CollisionHandlerQueue : i record delle collisioni sono messe in una queue. Devo attraversare la struttura dati e implementare manualmente le funzioni di risposta
CollisionHandlerEvent : al posto di salvare i dati delle collisioni, lancia un evento quando viene rilevata una collisione
Specifici: CollisionHandlerPusher e PhysicsCollisionHandler: gestisce
anche la risposta, respingendo automaticamente l'oggetto from dall'oggetto into
CollisionHandlerFloor: mantiene un oggetto posizionato sul modello del pavimento
http://www.panda3d.org/manual/index.php/Collision_Handlers
Collision detection in Panda3D
• Possibilità di considerare collisioni solo tra sottogruppi di solidi Il Traverser di default controlla tutti i from con tutti gli into Utilizzo di Bitmask per selezionare/vincolare relazioni di collisione
tra i solidi http://www.panda3d.org/manual/index.php/Collision_Bitmasks
Collision detection in Panda3D
• Gestire le collisioni utilizzando la geometria reale del modello è costoso computazionalmente Ma è necessario se oggetto molto complesso e difficile da
“approssimare” con un solido di collisione Può essere necessario comunque accedere alle informazioni
precise su vertici e facce coinvolte Dopo i test preliminari sui solidi di collisione
• Se faccio collision testing direttamente sulla geometria Utilizzare la BitMask specifica per limitare quanto più possibile
test inutili e costosi
• Posso impostare direttamente nel file egg la creazione di collision surface che seguano topologia e gerarchia della geometria Devo inserire <Collide> { Polyset keep descend } dopo il tag Group
e prima del tag VertexPool Per tutti i Group, usare search/replace su tutto il file
••
Collision detection in Panda3D
• Collision solids possono essere utilizzati anche per funzionalità particolari Portali Trigger di eventi (non legati all'effettivo feedback di una
collisione) Selezione, misura distanza (CollisionRay) …..
• Post con esempi di collisioni da scaricare: http://www.panda3d.org/forums/viewtopic.php?t=....
Collision detection in Panda3D