{"id":108,"date":"2015-11-11T19:07:28","date_gmt":"2015-11-11T18:07:28","guid":{"rendered":"http:\/\/liceocuneo.it\/grafica\/?page_id=108"},"modified":"2015-11-11T19:14:11","modified_gmt":"2015-11-11T18:14:11","slug":"trasformazioni","status":"publish","type":"page","link":"https:\/\/liceocuneo.it\/grafica\/trasformazioni\/","title":{"rendered":"Trasformazioni"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-109\" src=\"https:\/\/liceocuneo.it\/grafica\/wp-content\/uploads\/sites\/43\/Piramide.png\" alt=\"Piramide\" width=\"405\" height=\"379\" srcset=\"https:\/\/liceocuneo.it\/grafica\/wp-content\/uploads\/sites\/43\/Piramide.png 405w, https:\/\/liceocuneo.it\/grafica\/wp-content\/uploads\/sites\/43\/Piramide-300x281.png 300w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/p>\n<p>All&#8217;interno del metodo <strong>init<\/strong> viene attivato il test di profondit\u00e0 per disegnare solo le parti visibili. Il\u00a0disegno che si vuole realizzare viene definito all&#8217;interno del metodo <strong>display<\/strong> della classe\u00a0<strong>GLRenderer<\/strong> che implementa l\u2019interfaccia\u00a0<strong>GLEventListener<\/strong>. Prima del disegno vengono cancellati, sia l&#8217;immagine visualizzata (GL_COLOR_BUFFER_BIT), sia il buffer per il test di profondit\u00e0 (GL_DEPTH_BUFFER_BIT), quindi vengono applicate 2 trasformazioni geometriche (rotazioni) alla figura che verr\u00e0 rappresentata.\u00a0Nel nostro esempio disegniamo una piramide a partire dal quadrilatero di base, seguito dalle 4 facce laterali; il listato \u00e8 riportato di seguito. All&#8217;interno del metodo\u00a0<strong>reshape<\/strong> viene impostata una trasformazione di visualizzazione di tipo proiezione ortogonale:\u00a0<strong>glOrtho(x1, x2, y1, y2, z1, z2)<\/strong> passando come parametri i limiti reali x e y della finestra di rendering e le posizioni dei 2 piani di &#8220;clipping&#8221; z1 e z2\u00a0all&#8217;interno dei quali viene rappresentata la scena.<\/p>\n<p><strong>GLRenderer.java<\/strong><\/p>\n<pre>public class GLRenderer implements GLEventListener {\r\n\r\n\tint a = 0;\r\n\r\n\t@Override\r\n\tpublic void init(GLAutoDrawable drawable) {\r\n\t\tGL2 gl = drawable.getGL().getGL2();\r\n\r\n\t\t\/\/ attiva il test di profondit\u00e0 per disegnare solo le parti visibili\r\n\t\tgl.glEnable(GL2.GL_DEPTH_TEST);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void dispose(GLAutoDrawable drawable) {\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void display(GLAutoDrawable drawable) {\r\n\t\tGL2 gl = drawable.getGL().getGL2();\r\n\r\n\t\t\/\/ cancella l'immagine e il buffer per il test di profondit\u00e0\r\n\t\tgl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);\r\n\r\n\t\tgl.glLoadIdentity();\r\n\t\tgl.glRotatef(10, 0, 0, 1);\t\/\/ rotazione fissa di 10\u00b0 intorno a Z\r\n\t\tgl.glRotatef(a, 1, 0, 0);\t\/\/ rotazione variabile di a intorno a X\r\n\r\n\t\t\/\/ la base della piramide \u00e8 blu, ma il 4\u00b0 vertice \u00e8 pi\u00f9 scuro\r\n\t\tgl.glBegin(GL2.GL_QUADS);\r\n\t\tgl.glColor3d(0, 0, 1);\r\n\t\tgl.glVertex3d(1, 1, 0);\r\n\t\tgl.glVertex3d(-1, 1, 0);\r\n\t\tgl.glVertex3d(-1, -1, 0);\r\n\t\tgl.glColor3d(0, 0, 0.1);\r\n\t\tgl.glVertex3d(1, -1, 0);\r\n\t\tgl.glEnd();\r\n\r\n\t\t\/\/ la 1\u00b0 faccia \u00e8 rossa, ma il 3\u00b0 vertice \u00e8 pi\u00f9 scuro\r\n\t\tgl.glBegin(GL2.GL_TRIANGLES);\r\n\t\tgl.glColor3d(1, 0, 0);\r\n\t\tgl.glVertex3d(0, 0, 1);\r\n\t\tgl.glVertex3d(1, 1, 0);\r\n\t\tgl.glColor3d(0.1, 0, 0);\r\n\t\tgl.glVertex3d(-1, 1, 0);\r\n\t\tgl.glEnd();\r\n\r\n\t\t\/\/ la 2\u00b0 faccia \u00e8 verde, ma il 3\u00b0 vertice \u00e8 pi\u00f9 scuro\r\n\t\tgl.glBegin(GL2.GL_TRIANGLES);\r\n\t\tgl.glColor3d(0, 1, 0);\r\n\t\tgl.glVertex3d(0, 0, 1);\r\n\t\tgl.glVertex3d(-1, 1, 0);\r\n\t\tgl.glColor3d(0, 0.1, 0);\r\n\t\tgl.glVertex3d(-1, -1, 0);\r\n\t\tgl.glEnd();\r\n\r\n\t\t\/\/ la 3\u00b0 faccia \u00e8 magenta, ma il 3\u00b0 vertice \u00e8 pi\u00f9 scuro\r\n\t\tgl.glBegin(GL2.GL_TRIANGLES);\r\n\t\tgl.glColor3d(1, 0, 1);\r\n\t\tgl.glVertex3d(0, 0, 1);\r\n\t\tgl.glVertex3d(-1, -1, 0);\r\n\t\tgl.glColor3d(0.1, 0, 0.1);\r\n\t\tgl.glVertex3d(1, -1, 0);\r\n\t\tgl.glEnd();\r\n\r\n\t\t\/\/ la 4\u00b0 faccia \u00e8 gialla, ma il 3\u00b0 vertice \u00e8 pi\u00f9 scuro\r\n\t\tgl.glBegin(GL2.GL_TRIANGLES);\r\n\t\tgl.glColor3d(1, 1, 0);\r\n\t\tgl.glVertex3d(0, 0, 1);\r\n\t\tgl.glVertex3d(1, -1, 0);\r\n\t\tgl.glColor3d(0.1, 0.1, 0);\r\n\t\tgl.glVertex3d(1, 1, 0);\r\n\t\tgl.glEnd();\r\n\r\n\t\ta++;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {\r\n\t\tGL2 gl = drawable.getGL().getGL2();\r\n\r\n\t\t\/\/ imposta la matrice di trasformazione per la proiezione\r\n\t\tgl.glMatrixMode(GL2.GL_PROJECTION);\r\n\t\tgl.glLoadIdentity();\r\n\t\tgl.glOrtho(-2.0 * w \/ h, 2.0 * w \/ h, -2.0, 2.0, -2.0, 2.0);\r\n\r\n\t\t\/\/ imposta la matrice di trasformazione per gli oggetti\r\n\t\tgl.glMatrixMode(GL2.GL_MODELVIEW);\r\n\t\tgl.glLoadIdentity();\r\n\t}\r\n\r\n}<\/pre>\n<p>Progetto Eclipse:\u00a0<a href=\"https:\/\/liceocuneo.it\/grafica\/wp-content\/uploads\/sites\/43\/Piramide.zip\">Piramide.zip<\/a><a href=\"https:\/\/liceocuneo.it\/grafica\/wp-content\/uploads\/sites\/43\/Esempio2D.zip\"><br \/>\n<\/a>(controllare nelle <strong>Referenced Libraries<\/strong> che i percorsi dei file <strong>gluegen-rt.jar<\/strong> e <strong>jogl-all.jar<\/strong>\u00a0siano corretti)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>All&#8217;interno del metodo init viene attivato il test di profondit\u00e0 per disegnare solo le parti visibili. Il\u00a0disegno che si vuole realizzare viene definito all&#8217;interno del metodo display della classe\u00a0GLRenderer che implementa l\u2019interfaccia\u00a0GLEventListener. Prima del disegno vengono cancellati, sia l&#8217;immagine visualizzata &hellip; <a href=\"https:\/\/liceocuneo.it\/grafica\/trasformazioni\/\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":50,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-108","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/pages\/108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/comments?post=108"}],"version-history":[{"count":0,"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/pages\/108\/revisions"}],"wp:attachment":[{"href":"https:\/\/liceocuneo.it\/grafica\/wp-json\/wp\/v2\/media?parent=108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}