Computer Graphics. Preambolo: piccolo prontuario di JavaScript. Modellazione procedurale di semplici forme

Documenti analoghi
Aggiungiamo attributi (per vertice!)

Computer Graphics. Mesh import. Piano: Let s Import Meshes! Guardiamo dentro la nostra mesh con un plain text editor. 1. Procurarsi alcune mesh

Computer Graphics. Digital representation of 3D objects. 3D Rendering. Scena 3D rendering image. Marco Tarini - univ insubria AA 2016/2017

mat4 m, ma, mb ; vec4 v, u; m *= mb ; // come dire: m = m * mb (non mb * m!) u = m * v ; // prodotto matrice-vettore

Computer Graphics. Stack di matrici di modellazione: reminder! (vedi lez 13) comporre una scena con la Model Transform. Note implementative

Marco Tarini, Università dell'insubria AA 2016/2017. Computer Graphics. Facciamo una primissima applicaizone grafica rasterization based

Mesh triangolari i Modelli 3D universali dei games

Computer Graphics. Reminder: API. Il primo Hello World. Storia. Open Graphic Language Libreria C-like. Specifiche API. ver 4.

Il texture fetch (o: texture lookup) Operazione molto semplice in GLSL, es: e si memorizza le coord texture (s,t) per ogni vertice

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

Programmazione lato client. JavaScript. Applicazioni di Rete M. Ribaudo - DISI. JavaScript

Marco Tarini 10/22/2015

JavaScript JavaScript Programmazione lato client JScript JavaScript ECMAScript

Programmazione web lato client con JavaScript. Marco Camurri 1

Esempio 2: Subtyping

Videogame e rendering 3D. Enrico Colombini (Erix) µhackademy 1 Marzo 2019

Octave. Luca Abeni. Informatica Luca Abeni 1 / 21

Funzioni, Stack e Visibilità delle Variabili in C

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

JavaScript. Caratteristiche del JavaScript. Javascript consente di rendere dinamiche le pagine HTML

Normal maps: come si ottengono (2/4)

Unità A1 Funzioni MODULO Java 2

ma... Computer Graphics Rasterization-based HW-supported rendering Lezione 3: modellare con triangoli Tutto sia composto da triangoli (3D)

Guida introduttiva al PHP

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

I Modelli 3D più comuni: Mesh poligonali

Le basi del linguaggio Java

Programmazione A.A Costrutti di base. ( Lezione XII, parte I ) Gestione dell input. Prof. Giovanni Gallo Dr.

Corso sul linguaggio Java

Introduzione a JavaScript. Prof. Francesco Accarino IIS Altiero Spinelli via leopardi 132 Sesto San Giovani

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Computer Graphics. 3D Rendering. Digital representation of 3D objects. Scena 3D rendering image. Geometry of a 3D object. 3D Model

PHP funzioni. Prof. Francesco Accarino

Esercitazione Fondamenti di Informatica 2

Paradigma a oggetti. Programmazione orientata agli oggetti. Programmazione orientata agli oggetti Paradigma a oggetti 1 / 30

Programmazione ad oggetti. Paradigma a oggetti. Esempio. Esempio L estensione del tipo di dato comporta la ridefinizione del codice

Futures Esempi di codice

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Esercitazione Highcharts

Lab 08 Stringhe e strutture

Introduzione al linguaggio C Primi programmi

Primi programmi in C

Computer Graphics. Memoria RAM nelle schede grafiche. Texture Mapping: paradigma di memoria. Concetto. Tessiture: Caso più comune.

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 05/02/2014/ Foglio delle domande / VERSIONE 1

Esempio: Costruttori ed ereditarietà

Array di array. E' possibile creare strutture a matrice (2D, 3D,..., ND), esempio: double [ ][ ] entrate = new double [NANNI][NMESI];

Variabili intere, funzioni e input/ Alessandra Giordani Lunedì 19 marzo

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Computer Graphics. Computer Graphics. Alcuni argomenti che non abbiamo trattato (o abbiamo trattato poco) Modelling: Rendering:

Informatica per Statistica Riassunto della lezioni del 14/11/2012 e 16/11/2012

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

Lezione 6 Introduzione al C++ Mauro Piccolo

OCA JAVA 8 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Introduzione al C. InformaticaB. Daniele Loiacono

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

Oggetti. Definizioni di Classi II

Funzioni, Stack e Visibilità delle Variabili in C

Programmazione Orientata agli Oggetti in Linguaggio Java

I/O da tastiera e direttive processore. Alessandra Giordani Lunedì 3 maggio

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Il linguaggio C. Notate che...

COS È UN PRISMA. Due POLIGONI congruenti e paralleli, come basi. È UN POLIEDRO DELIMITATO DA

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Programmazione II. Lezione 23. Daniele Sgandurra 28/1/2011.

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

Evoluzione del C 07/04/2016. LABORATORIO DI PROGRAMMAZIONE Corso di laurea in matematica 16 IL LINGUAGGIO C

Corso di Tecniche Avanzate per la Grafica

Fondamenti di Grafica Tridimensionale

Passaggio dei parametri

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

POLITECNICO DI TORINO. Laboratorio di Compilatori Corso di Linguaggi e Traduttori. Esercitazione 5. a.a 2010 / Controllo dei tipi

Informatica A (per gestionali) A.A. 2004/2005. Esercizi C. Strutture di controllo

Parte 6 JSON, Web Storage API, funzioni JavaScript e user script

Informatica per Statistica Riassunto della lezione del 21/10/2011

Frames. Come organizzare le pagine web usando i frames. Definizione Frame = 1. struttura, armatura, telaio 2. inf. videata, schermata, cornice

-- class -- Verso gli oggetti. struct + metodi = classi?... No!

Informatica B Esercitazione 3

Programmazione in Java e gestione della grafica (I modulo) Lezione 2: Prime nozioni di Java

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Formalismi per la descrizione di algoritmi

Dati aggregati. Violetta Lonati

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 20 Aprile 2016

scrivere window.alert(). 2 Nell esempio sarebbe scritto solo var hello, senza pertanto attribuire alla variabile hello alcun valore

Lezione 8: Stringhe ed array multidimensionali

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Titolo presentazione

Transcript:

Computer Graphics Università dell Insubria Corso di Laurea in Informatica Anno Accademico / Marco Tarini Modellazione procedurale di semplici forme JavaScript ha molti difetti non tipato sintassi molto disinvolte molto facile sbagliare (tradizionalmente) interpretato, no compilato Allora perchè adottarlo WebGL modo migliore di ottenere D sul Web! no plug-ins! su browser! estrema semplicità di deployment cross platform classi e istanze Cenni storici: origins: Netscape non parente di Java (neanche alla lontana) targeted at non-professionist programmers JavaScript non è parte degli scopi del corso Cercheremo di usare solo i costrutti che siano più facili da comprendere partendo da Java / C++ In Java faremmo: class Person public int age; public string name; Person caio; caio.age = ; caio.name = caio ; In JavaScript faremo: var Person age :, name : var caio = Object.create( Person ); caio.age = ; caio.name = caio ;

dichiarazione funzioni (e metodi) Java: una classe (Persona), e le sue istanze (caio) (ogni istanza avrà i suoi campi) JavaScript: definiamo un oggetto stampino (Persona) istanziato, con i suoi campi e lo duplichiamo per avere oggetti istanze (non è l unico modo, o il più diffuso, o il migliore) (solo il più Java-like) nota: istanze e classi sono entrambi oggetti JavaScript per approfondire: prototypes, funzioni come oggetti. In Java faremmo: void invecchia( Persona p ) p.age ++; il compilatore: sa che il paramatro p è di tipo Persona controlla che la classe persona abbia il campo age In JavaScript faremo: function invecchia( p ) p.age ++; il compilatore: non sa cosa sia p (oggetto, numero, array?) l interprete (in esecuz): se la funzione invecchia viene chiamata su qualcosa che non è un oggetto (es, è un int) o non ha il campo age, genera un errore Java: il complitatore sa il tipo (classe, o tipo base) di ogni variabile (o espressione, parametro, campo, etc) JavaScript: a tempo di compilazione non è noto il tipo (oggetto, o tipo base) di una var (o espressione, parametro, campo, etc) (il tipo di una var può anche variare nel corso della sua vita) (es aggiungendo dinamicamente campi) (ma noi non lo faremo vogliamo essere Java-like) a tempo di esecuzione si genera un errore se una variabile non è usata in modo coerente col suo tipo attuale Questo modo di fare le cose si chiama «duck typing» «When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck» James W. Riley, poeta (89 96) «Se vedo (in esecuz) che una varpha un campo age, e vedo questo campo capace di subire l op++, allora è ok passare p alla funzione invecchia (che sia unapersona o no)» JavaScript interpreter (99 )

member functions (cioè methods) In Java faremmo: class Person public int age; public string name; public void setbirthdate( int k ) this.age = k; Person caio; caio.setbirthdate( 98 ); In JavaScript faremo: var Person age :, name : "", setbirthdate: function( k ) this.age = k; var caio = Object.create( Person ); caio.setbirthdate( 98 ); Oggetti stampino e oggetti copie sì: si copiano anche i metodi (membri che sono funzioni). Pazienza (non ci interessa imparare a far meglio su JS) no: non sarebbe necessario mettere i campi nello stampino. caio.age = ; funzionerebbe anche se age non esistesse prima (verrebbe aggiunto al volo, solo in questa istanza). (lo facciamo solo per chiarezza, e per manteresi Java-like) convenzione: useremo nomi con la Maiuscola per gli oggetti che fanno da classi (usati come stampini) useremo nomi con la minuscola per gli oggetti che fanno da istanze (usati come copie) dividere il progetto in più files <html> <head> <script src="person.js"></script> <script> var caio = Object.create( Person ); caio.setbirthdate( 98 ); </script> </head> <body> </body> </html> file: index.html var Person age :, name :, setbirthdate: function( k ) this.age = k; file: person.js es: un file per classe (alla Java) Una classe per le mesh (anzi due) La prima: per mesh in system memory usata per lavorarci in CPU (es, costruzione procedurale, preprocessing) var CpuMesh /* campi */ verts : new FloatArray, // geom + attr tris : new Uint6Array, // connetività /* metodi per riempire i campi */ makecube: function() makecone: function( res ) makecylinder: function( res ) file: mesh.js

Una classe per le mesh (anzi due) La seconda: per mesh in video memory usata per madarla al pipeline GPU contiene: indici per riferirsi ai buffer allocati in Video RAM si costruisce a partire dalla classe precedente var GpuMesh file: mesh.js (proseguo) /* campi */ bufferverts :, buffertris :, ntris :, // devo ricordare quanti sono /* metodi */ draw: function() storefromcpu: function( cpumesh ) Classe CpuMesh var CpuMesh /* costruzione procedurale: funz che fanno diventare questa mesh un */ makecube: function() // solo sup laterale (per ora) // approssimando con un prisma a res lati makecylinder: function( res ) // idem makecone: function( res ) // etc Funzioni helpers (per aiutarci nella costruzione procedurale) var CpuMesh /* metodi (che sarebbero) privati */ Un cubo: geometria e connettività 6 7 y // prepara spazio per tot vertici e triangoli allocate: function( nverts, ntris ) // setta il triangolo i-esimo come (va,vb,vc) settri: function( i, va,vb,vc ) // setta due triangoli, di indici i e i+ setquad: function( i, va,vb,vc,vd ) // setta il vertice i-esimo setvert: function( i, x,y,z, r,g,b) quad = tris (diagonal split) 6 7 x 6 7 z

Un cono: geometria e connettività Note: N N- y = + y = - y (N vertici di base, + di apex) x z N vertici nella base (numerati da a N - ) vertice di apex (di indice N ) sulla base, chi è il successore del vertice i? risposta: ( con i < N ) ( i + ) modulo N (i+)%n Un cilindro: geometria e connettività Scena con oggetti multipli (piano) N+ N+ N+ N+ N- N- N y = + y = - y (N vertici base inf, + N in base sup) x z Nella preparewhattodraw Creare tre GpuMesh (cono, cilindro, cubo) (attraverso CpuMesh usa-e-getta) Aggiungere matrice di modellazione cumularla nella matrice MVP (reminder: porterà ciascuna istanza di mesh dal suo spazio oggetto, in cui l abbiamo definito, al world space comune) Nella draw: ( set MVP, draw object ) x enne volte

Effetto «fog» (aspettando il lighting) Idea: tanto più un frammento è in profondità, (Z in spazio vista, o clip, o viewport) tanto più lo coloriamo scuro Implementazione (un hack): // fragment shader void main() float fog = gl_fragcoord.z; fog *= fog; fog *= fog; fog =.6-fog; gl_fragcolor = vec( fog,fog,fog,.); in coord Viewport. x e y: pos del pixel z: profondità ( = min, = max) per escerbare l effetto Linking di vertex e fragment shader Vertex Shader: input: gli attributes gli uniforms LINK output: i varyings gl_position (vec) Fragment Shader: input: i varyings gli uniforms (gli stessi) gl_fragcoord (vec) output: gl_fragcolor (vec) gl_depth (float) (opzionale) Per i dettagli, vedere l implementazione sul sito (come al solito): lez 6