Introduzione a Panda3D -...

Post on 10-Jul-2020

4 views 0 download

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