<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MindShake &#187; Gaio Giulio Patrizio</title>
	<atom:link href="http://mindshake.org/author/gaio-giulio-patrizio/feed/" rel="self" type="application/rss+xml" />
	<link>http://mindshake.org</link>
	<description>cosa ci frulla nella testa</description>
	<lastBuildDate>Thu, 05 Jan 2012 15:12:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Introduzione alla grafica 3D (by Patrizio Tamorri)</title>
		<link>http://mindshake.org/introduzione-alla-grafica-3d-by-patrizio-tamorri/</link>
		<comments>http://mindshake.org/introduzione-alla-grafica-3d-by-patrizio-tamorri/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 10:07:57 +0000</pubDate>
		<dc:creator>Gaio Giulio Patrizio</dc:creator>
				<category><![CDATA[Scienza e Tecnologia]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[directx]]></category>
		<category><![CDATA[grafica]]></category>
		<category><![CDATA[ilbloggatore]]></category>
		<category><![CDATA[informatica]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[videogiochi]]></category>

		<guid isPermaLink="false">http://mindshake.org/?p=1151</guid>
		<description><![CDATA[La grafica 3d è una cosa che molti credono un concetto inavvicinabile. Complicate operazioni matematiche e trasformazioni matriciali sembrano in grado di spaventare chiunque&#8230;E&#8217; quindi il momento di farvi passare la paura. Qui vi illustrerò come un triangolo viene disegnato a schermo. Con questo semplice concetto potrete poi disegnare a schermo ciò che vorrete visto [...]]]></description>
			<content:encoded><![CDATA[<p>La grafica 3d è una cosa che molti credono un concetto inavvicinabile. Complicate operazioni matematiche e trasformazioni matriciali sembrano in grado di spaventare chiunque&#8230;<strong>E&#8217; quindi il momento di farvi passare la paura</strong>.</p>
<p>Qui vi illustrerò come un triangolo viene disegnato a schermo. Con questo semplice concetto potrete poi disegnare a schermo ciò che vorrete visto che tutti gli oggetti sono rappresentabili da  triangoli.<br />
 Innanzitutto vediamo i concetti di base. Nel nostro mondo virtuale <strong>ci occorre un origine, un punto 0</strong>.</p>
<p>Matematicamente esso è l&#8217;incrocio degli assi. Rispetto a questo punto definiremo le coordinate <em>X, Y e Z </em>del nostro ipotetico mondo virtuale. Avremo dunque 3 punti nello spazio che identificano il nostro triangolo 3d ognuno con le precedenti 3 coordinate che lo collocano nello spazio rispetto all&#8217;origine.<br />
 Fin qui mi direte: Mamma mia a questo ci arrivavo anche da solo.</p>
<p><strong>Ma come ce lo metto su un o schermo?</strong></p>
<p><span id="more-1151"></span></p>
<p>Qui inizia una parte un po piu complicata. Innanzitutto dovete avere un punto di questo spazio che chiameremo <strong>telecamera</strong>. Il punto telecamera come immaginerete è il punto da cui stiamo vedendo il nostro triangolo.</p>
<p>Ma manca ancora qualcosa per poter vedere il nostro mondo. Manca la direzione in cui stiamo guardando. <strong>Se noi avessimo la nostra testa in un punto di quello spazio e non sappiamo dove stiamo guardando, come faremo a sapere cosa vediamo</strong>?</p>
<p>Qui qualcuno potrebbe pensare a usare un vettore che indichi la direzione ma invece noi useremo una matrice. <strong>AAAAAAHHHHH</strong>. Un boato assordante mi raggiunge mentre leggete questa frase. Tranquilli. <strong>Una matrice è un sistema per risolvere principalmente sistemi di equazioni</strong>.</p>
<p>Una cosa del genere ad esempio:</p>
<blockquote><p>3* X + 5*Y + 3*Z = 4 <br />
 4* X + 1*Y + 3*Z = 6<br />
 3* X + 2*Y + 4*Z = 2</p>
</blockquote>
<p>la potete risolvere facendo la seguente operazione matriciale:</p>
<blockquote><p>|3  5 3 4| <br />
 |4 1  3 6|<br />
 |3 2  4 2|</p>
</blockquote>
<p>e trovandone il determinante.</p>
<p>Difatti potete rappresentare attraverso una serie di matrici particolari le seguenti operazioni: <strong>Traslazione di un punto, Rotazione, Scala</strong> (potete aumentare ogni distanza tra due punti del 50% ad esempio).</p>
<p>Ecco ad esempio la matrice necessaria per effettuare una rotazione su un asse qualsiasi X, Y o Z</p>
<blockquote><p>1 0      0    0<br />
 0 cos  sin  0<br />
 0 -sin cos  0<br />
 0   0    0    1</p>
</blockquote>
<p>Questa matrice di per se non fa niente. Ma se la moltiplicate per il valore della coordinata da ruotare e poi sostituite il valore precendente con quello nuovo otterrete un punto ruotato. In pratica <strong>per ruotare sull&#8217;asse X di 45 gradi un punto T</strong> si deve fare:</p>
<p><strong>X del punto da ruotare</strong> = &#8220;Matrice vista prima con cos e sin sostituiti con cos di 45 e sin di 45 gradi&#8221;<br />
 <strong>moltiplicata con prodotto scalare per il valore della X del punto da ruotare</strong>.</p>
<p>Facile no? Le matrici particolari per fare ogni operazione si trovano in ogni sito internet se volete provare altre. Il funzionamento è uguale. Di bello le matrici hanno che se le moltiplicate tra loro gli effetti si sommano. Ad esempio <strong>moltiplicate una rotazione per una traslazione e avrete una roto-traslazione</strong> ;)</p>
<p>Tornando al discorso di prima al nostro punto camera assoceremo una matrice  che chiameremo di <em>&#8220;World To Camera Space&#8221;</em>. In pratica questa matrice prenderà ogni punto del grafo con le sue coordinate riferite al punto di origine (lo zero di prima) e le trasformerà in <em>camera space</em> (ovvero ogni punto avrà come origine il punto telecamera. Se ci pensate è come se avessimo spostato ogni punto insieme alla telecamera e avessimo posto al telecamera sul punto di origine).</p>
<p>Ora però manca qualcosa. Questa operazione di per se non sembra averci fatto guadagnare molto. <strong>Ora abbiamo ogni punto e la sua posizione rispetto alla telecamera ma non sappiamo ancora dove guarda &#8216;sta telecamera.</strong> Definiamo quindi una matrice che identifichi dove stiamo guardando. La sua derivazione è complicata ma le <em>DirectX</em> se vi può fare comodo usano la seguente definizione:</p>
<p><strong>pEye </strong><br />
 Vettore che contiene la X, Y e Z del punto della telecamera.<br />
 <strong>pAt </strong><br />
 Vettore che identifica dove guarda la telecamera.<strong><br />
 pUp<br />
 </strong>Vettore che punta in alto. In genere è [0, 1, 0], ovvero la Y positiva è l&#8217;alto.<br />
 Potete ottenere effetti carini cambiando questa proprietà come ad esempio rotazioni i quello che vedete.</p>
<blockquote><p>zaxis = normal(At &#8211; Eye)<br />
 xaxis = normal(cross(Up, zaxis))<br />
 yaxis = cross(zaxis, xaxis)</p>
<p>xaxis.x           yaxis.x           zaxis.x          0<br />
 xaxis.y           yaxis.y           zaxis.y          0<br />
 xaxis.z           yaxis.z           zaxis.z          0<br />
 -dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye) 1</p>
</blockquote>
<p>dove quelle indicate sono le classiche operazioni tra vettori come normale, prodotto scalare (<em>dot</em>) e vettoriale (<em>cross</em>).</p>
<p>In genere qualsiasi libreria userete (<em>OpenGL</em> o <em>DirectX</em>) <strong>vi metterà a disposizione una funzione che ve lo fa automaticamente</strong>. In <em>DirectX</em> è <strong>D3DXMatrixLookAtLH</strong>.</p>
<p>Ora che avete questa matrice in genere ogni algoritmo che faccia <em>Rendering</em> (ovvero che scriva a schermo oggetti 3d o 2d) in questa fase fa il cosiddetto <em>clipping</em> ovvero sceglie quali triangoli renderizzare (ovvero disegnare a schermo). A noi non interessa al momento. Abbiamo un solo triangolo =).</p>
<p>Finora abbiamo quindi:<br />
 1) Ottenuto un mondo 3d anche se piccolo con riferimento a un punto origine.<br />
 2) Trasformato ogni punto in camera space.<br />
 3) Creato una matrice che ci indica dove stiamo guardando. In pratica adesso ogni punto verrà ruotato rispetto alla telecamera (che si trova nell&#8217;origine) e avrò quindi un ambiente in cui posso determinare gli oggetti visibili.</p>
<p style="text-align: center;"><img class="size-medium wp-image-1159 aligncenter" title="Grafica 3D" src="http://mindshake.org/wp-content/uploads/2008/09/grafica3d-400x166.jpg" alt="" width="400" height="166" /></p>
<p>Come vedete nell&#8217;ultima immagine ho praticamente solo aggiustato il mondo in modo che abbia la mia visuale centrata sull&#8217;asse Z (la c della figura) dalla situazione scomoda iniziale.</p>
<p>Ora resta un passo da fare. Capire quanto sono vicini e lontani i vari oggetti. Un oggetto lontano appare più piccolo di uno vicino. Questa proprietà è però un po&#8217; complessa perché a differenza di come siamo abituati a disegnare in genere <strong>un oggetto non diventa più piccolo in maniera lineare ma si basa sulle leggi ben più complesse della prospettiva</strong>. Non voglio entrare nei dettagli ma per chi ne vuole sapere di più ecco la descrizione della documentazione <em>DirectX</em> su come computarla.</p>
<p><strong>fovy </strong><br />
 ampiezza campo visivo Y, in radianti<br />
 <strong>Aspect </strong><br />
 Aspetto dello schermo. Vi sarà capitato di vedere che il vostro monitor è a 800/600 = 4/3  =  larghezza/ampiezza. Quelli dei cinema sono più stretti infatti spesso ci mettono le barre sopra e sotto quando  trasportano i film per la tv.<br />
 <strong>zn</strong><br />
 Piano più vicino. In pratica quanto volete vedere vicino (vertici più vicini non li vedrete)<br />
 <strong>zf </strong><br />
 Piano più lontano.</p>
<blockquote><p>yScale = cot(fovy/2) ovvero la cotangente<br />
 xScale = yScale / aspect ratio</p>
<p>xScale     0          0               0<br />
 0        yScale       0               0<br />
 0          0       zf/(zf-zn)         1<br />
 0          0       -zn*zf/(zf-zn)     0<br />
 where:</p>
</blockquote>
<p>Anche qui in genere ci sono le funzioni apposta quindi fanno loro ;)</p>
<p>Ora avete tutto in regola per scrivere a schermo. Basterà far passare ogni vertice per<br />
 1) la trasformazione in camera space (moltiplicazione tra matrice e coordinata) ovvero la funzione vista prima che in <em>DirectX</em> si otteneva chiamando <em>D3DXMatrixLookAtLH</em>.<br />
 2) la trasformazione di proiezione che è l&#8217;ultima che abbiamo visto.</p>
<p>Ora avrete le coordinate fisiche su cui scrivere a schermo i vostri vertici.</p>
<p>Chiaramente questa escursione nel mondo del 3d manca di moltissime cose ma è <strong>una base per farvi capire come funzionano le principali meccaniche</strong> che stanno dietro ai giochi che vedete in giro oggi.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindshake.org/introduzione-alla-grafica-3d-by-patrizio-tamorri/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

