<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://wiki.cifprodolfoucha.es/index.php?action=history&amp;feed=atom&amp;title=LIBGDX_Camara3D</id>
	<title>LIBGDX Camara3D - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cifprodolfoucha.es/index.php?action=history&amp;feed=atom&amp;title=LIBGDX_Camara3D"/>
	<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;action=history"/>
	<updated>2026-10-17T05:24:43Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;diff=8099&amp;oldid=prev</id>
		<title>Wiki: /* PerspectiveCamera */</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;diff=8099&amp;oldid=prev"/>
		<updated>2018-12-18T14:12:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;PerspectiveCamera&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 14:12 18 dic 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l826&quot; &gt;Línea 826:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 826:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Se agora cambiamos o viewport &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;width &lt;/del&gt;e poñemos dous:&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Se agora cambiamos o viewport &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;height &lt;/ins&gt;e poñemos dous:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l832&quot; &gt;Línea 832:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 832:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;br/&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;br/&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;O cubo se deforma xa que coa cámara estamos a dicirlle que pode debuxar, para cubrir todo o ancho da pantalla, un obxecto con dúas unidades de ancho (2f) e o cubo ten unha polo que para adaptalo a ese ancho &amp;#039;o deforma&amp;#039;. Se queremos que o cubo sempre se vexa ben teremos que adaptar o ancho da pantalla en función da relación de aspecto (ancho e alto da resolución de pantalla).&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;O cubo se deforma xa que coa cámara estamos a dicirlle que pode debuxar, para cubrir todo o ancho da pantalla, un obxecto con dúas unidades de ancho (2f) e o cubo ten unha polo que para adaptalo a ese ancho &amp;#039;o deforma&amp;#039;. Se queremos que o cubo sempre se vexa ben teremos que adaptar o ancho da pantalla en función da relación de aspecto (ancho e alto da resolución de pantalla).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wiki</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;diff=592&amp;oldid=prev</id>
		<title>Wiki en 14:27 14 dic 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;diff=592&amp;oldid=prev"/>
		<updated>2015-12-14T14:27:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 14:27 14 dic 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l396&quot; &gt;Línea 396:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 396:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Relación de aspecto===&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Relación de aspecto===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Sobre este punto xa falamos no [http://&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;manuais&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;iessanclemente&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;net&lt;/del&gt;/index.php?title=LIBGDX_A_c%C3%A1mara_2D#O_tama.C3.B1o_da_pantalla._A_relaci.C3.B3n_de_aspecto desenvolvemento dos xogo 2D].&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Sobre este punto xa falamos no [http://&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;wiki&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;cifprodolfoucha&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;es&lt;/ins&gt;/index.php?title=LIBGDX_A_c%C3%A1mara_2D#O_tama.C3.B1o_da_pantalla._A_relaci.C3.B3n_de_aspecto desenvolvemento dos xogo 2D].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wiki</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;diff=573&amp;oldid=prev</id>
		<title>Wiki: Página creada con «&lt;span style=&quot;font-size:150%;&quot;&gt;UNIDADE 4: A cámara en 3D.&lt;/span&gt;  ===OrthographicCamera===   Clase: http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/grap...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Camara3D&amp;diff=573&amp;oldid=prev"/>
		<updated>2015-12-14T14:19:39Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;span style=&amp;quot;font-size:150%;&amp;quot;&amp;gt;UNIDADE 4: A cámara en 3D.&amp;lt;/span&amp;gt;  ===OrthographicCamera===   Clase: http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/grap...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:150%;&amp;quot;&amp;gt;UNIDADE 4: A cámara en 3D.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===OrthographicCamera===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Clase: http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/OrthographicCamera.html&lt;br /&gt;
&lt;br /&gt;
Información na wiki: https://github.com/libgdx/libgdx/wiki/Orthographic-camera&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Agora mesmo estamos a ver unha Proxección Ortográfica. Neste tipo de proxección, non existe unha perspectiva dos obxectos que se visualizan na pantalla.&lt;br /&gt;
&lt;br /&gt;
Dita cámara por defecto visualiza o seguinte espazo:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Mesh_1.jpg | 200px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Sendo a coordenada Z a que sairía da pantalla, indo dende +1 (mirando cara nós, saíndo da pantalla) ata -1 (cara dentro da pantalla).&lt;br /&gt;
&lt;br /&gt;
Podemos comprobar como se posicionamos o noso triángulo na coordenada Z = -1.1f xa non se visualiza (comprobádeo).&lt;br /&gt;
&lt;br /&gt;
Do anterior podemos concluír que a cámara visualiza un volume:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_1.jpg | 600px | center]]&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.elai.upm.es/webantigua/spain/Asignaturas/InfoInd/teoria/Apuntes%20de%20OpenGL.pdf Imaxe obtida dos apuntes de Cristina Cañero Morales]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fixarse onde está a cámara e o resultado da proxección. Ó ter unha cámara ortográfica (en 2D) todo o que visualiza a cámara (estea diante ou detrás) se vai plasmar sobre un plano, levando os punto de forma paralela.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Para determinar o tamaño do volume do que se ve, se ten que indicar o plano NEAR (preto) e o plano FAR (afastado).&lt;br /&gt;
&lt;br /&gt;
O plano NEAR se determina por catro coordenadas (left, top, right, bottom) e despois indicamos dúas distancias (near / far). O tamaño do plano far é igual o tamaño do plano near.&lt;br /&gt;
&lt;br /&gt;
Fixarse como neste tipo de perspectiva podemos ter un near que quede por detrás da cámara (como&lt;br /&gt;
é o exemplo anterior). O que fai dita perspectiva será coller todo o que hai dentro deste volume e&lt;br /&gt;
visualizalo de forma &amp;#039;plana&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_2.jpg | 600px | center]]&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.elai.upm.es/webantigua/spain/Asignaturas/InfoInd/teoria/Apuntes%20de%20OpenGL.pdf Imaxe obtida dos apuntes de Cristina Cañero Morales]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; A todo o volume que se visualiza e o que se coñece coma &amp;#039;&amp;#039;&amp;#039;[http://en.wikipedia.org/wiki/Viewing_frustum View Frustrum]&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Neste caso se visualiza o mesmo que no caso anterior xa que segue &amp;#039;collendo&amp;#039; os dous obxectos.&lt;br /&gt;
Imos crear dous triángulos (de cores vermello e verde) sen texturas e imos colocalos nas coordenadas Z -3 e -5 respectivamente, situando o triángulo verde na coordenada X dende a posición 0 ata a posición 1f e deixando o triángulo vermello na posición do exercicio anterior (-0,5 a +0,5 en X).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación do exercicio:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Crear uhna nova clase de nome UD4_2_Camara2D que derive da clase Game e cambiade os diferentes proxectos para que executen dita clase.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_2_Camara2D&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Visualizar dous triángulos.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.OrthographicCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.PerspectiveCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Traballos coa clase Mesh para definir un triángulo en 3D&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_2_Camara2D extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed,trianguloGreen; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private PerspectiveCamera camara3d;&lt;br /&gt;
	private OrthographicCamera camara2d;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		// create shader program&lt;br /&gt;
		String vertexShader = &amp;quot;attribute vec4 &amp;quot;+ ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;attribute vec4 &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;uniform mat4 u_worldView;    \n&amp;quot; &lt;br /&gt;
				+ &amp;quot;varying vec4 v_color; 		\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;	gl_Position = u_worldView *&amp;quot; + ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; v_color = &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;\n&amp;quot; 	&lt;br /&gt;
				+&amp;quot;}								\n&amp;quot;;&lt;br /&gt;
		String fragmentShader = &amp;quot;#ifdef GL_ES 	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;precision mediump float;		\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;#endif						\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;varying vec4 v_color;		\n&amp;quot;  &lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; gl_FragColor = v_color; \n&amp;quot;&lt;br /&gt;
				+ &amp;quot;}							\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		// Creamos o ShaderProgram en base ós programas definidos anteriormente&lt;br /&gt;
		shaderProgram = new ShaderProgram(vertexShader, fragmentShader);&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, -3f, 1f,0f,0f,1f,&lt;br /&gt;
				0.5f, -0.5f, -3f, 1f,0f,0f,1f,&lt;br /&gt;
				0f, 0.5f, -3f, 1f,0f,0f,1f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		trianguloGreen = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloGreen.setVertices(new float[] { // É o verde, se ve detrás&lt;br /&gt;
				0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				1.0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				0.5f, 0.5f, -5f, 0f,1f,0f,1f });&lt;br /&gt;
		trianguloGreen.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
		trianguloGreen.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora chega o momento de indicarlle a cámara cal é o seu volume de visualización.&lt;br /&gt;
Isto o podemos facer cun obxecto cámara ou directamente no método render.&lt;br /&gt;
Pero antes disto temos que falar doutro concepto que existe en OPEN GL ES que son as [https://open.gl/transformations matrices].&lt;br /&gt;
Todas as modificacións que se fan sobre os obxectos que se van visualizar (cambio de perspectiva, movemento da cámara, cambiar o tamaño do que se visualiza, rotar ou trasladar,...) se fai mediante unha serie de operacións matemáticas con matrices. Ditas matrices sofren modificacións e se aplican a cada un dos vértices que conforman a figura xeométrica que queremos debuxar.&lt;br /&gt;
&lt;br /&gt;
Os tres tipos de matrices que existen son: matriz de proxección (GL_PROJECTION), matriz de modelado (GL_MODELVIEW) e matriz de textura (GL_TEXTURE).&lt;br /&gt;
No caso de querer cambiar o tamaño de visualización o temos que facer sobre a matriz de proxección, mentres que o debuxado (render) dos obxectos o temos que facer na matriz de modelado.&lt;br /&gt;
&lt;br /&gt;
Imos definir unha cámara ortográfica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
private OrthographicCamera camara2d;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
camara2d = new OrthographicCamera(2f,2f);&lt;br /&gt;
camara2d.near=0.1f;&lt;br /&gt;
camara2d.far=100f;&lt;br /&gt;
camara2d.update();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Como vemos estamos a definir o seu ViewFrustum o área de visualización.&lt;br /&gt;
A cámara vai ver 100 unidades de distancia cara a adiante (plano near e far) e o seu plano near (igual en tamaño ó plano far) terá un tamaño de 2x2 unidades.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;IMPORTANTE:&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt; É necesario chamar ó método update cando se fagan modificacións sobre a cámara.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cando chamamos ó método update estamos a actualizar a matriz de proxección da cámara.&lt;br /&gt;
Podedes acceder a dita matriz escribindo: camara2d.projection&lt;br /&gt;
&lt;br /&gt;
Ó mesmo tempo, a cámara se posiciona nun lugar por defecto. Este lugar é a metade do viewportwidth e viewportheight da definición.&lt;br /&gt;
Así, no noso caso, a cámara estaría situada nas coordenadas:&lt;br /&gt;
: X = 2f / 2 = 1f;&lt;br /&gt;
: Y = 2f /2 = 1f;&lt;br /&gt;
: Z = 0;&lt;br /&gt;
&lt;br /&gt;
Cando movemos a cámara estamos a modificar a súa matriz de modelado. Ó chamar o método update esta matriz se actualiza.&lt;br /&gt;
Podedes acceder a dita matriz escribindo: camara2d.view&lt;br /&gt;
&lt;br /&gt;
Na cámara temos unha matriz que é a combinación das dúas matrices anteriores, e que se denomina &amp;#039;&amp;#039;&amp;#039;combined&amp;#039;&amp;#039;&amp;#039;. É esta matriz a que temos que aplicar a cada un dos puntos dos obxectos do noso mundo para que se rendericen adecuadamente.&lt;br /&gt;
&lt;br /&gt;
Na versión OPEN GL ES 2.0 temos que pasarlle dita matriz como parámetro ó Shader Program para que a aplique a cada punto.&lt;br /&gt;
&lt;br /&gt;
Seguindo o noso exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;19,66-71,83-88&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.OrthographicCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Uso da cámara orthographic e perspective&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_2_Camara2D extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed,trianguloGreen; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private OrthographicCamera camara2d;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		// create shader program&lt;br /&gt;
		String vertexShader = &amp;quot;attribute vec4 &amp;quot;+ ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;attribute vec4 &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;uniform mat4 u_worldView;    \n&amp;quot; &lt;br /&gt;
				+ &amp;quot;varying vec4 v_color; 		\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;	gl_Position = u_worldView *&amp;quot; + ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; v_color = &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;\n&amp;quot; 	&lt;br /&gt;
				+&amp;quot;}								\n&amp;quot;;&lt;br /&gt;
		String fragmentShader = &amp;quot;#ifdef GL_ES 	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;precision mediump float;		\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;#endif						\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;varying vec4 v_color;		\n&amp;quot;  &lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; gl_FragColor = v_color; \n&amp;quot;&lt;br /&gt;
				+ &amp;quot;}							\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		// Creamos o ShaderProgram en base ós programas definidos anteriormente&lt;br /&gt;
		shaderProgram = new ShaderProgram(vertexShader, fragmentShader);&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, -3f, 1f,0f,0f,1f,&lt;br /&gt;
				0.5f, -0.5f, -3f, 1f,0f,0f,1f,&lt;br /&gt;
				0f, 0.5f, -3f, 1f,0f,0f,1f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		trianguloGreen = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloGreen.setVertices(new float[] { // É o verde, se ve detrás&lt;br /&gt;
				0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				1.0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				0.5f, 0.5f, -5f, 0f,1f,0f,1f });&lt;br /&gt;
		trianguloGreen.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
		&lt;br /&gt;
		// Definimos os parámetros da cámara&lt;br /&gt;
		camara2d = new OrthographicCamera(2f,2f);&lt;br /&gt;
		camara2d.near=0.1f;&lt;br /&gt;
		camara2d.far=100f;&lt;br /&gt;
		camara2d.update();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara2d.combined);&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
		trianguloGreen.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void resize (int width,int height){&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
		trianguloGreen.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Analicemos o código:&lt;br /&gt;
&lt;br /&gt;
* Liñas 19 e 67-71: Definimos a cámara ortográfica, o seu viewport e os planos far e near.&lt;br /&gt;
* Liña 84: Pasamos ó Shader Program a matriz combinada (Model - View) da cámara para que a aplique a cada punto do obxecto Mesh.&lt;br /&gt;
* Liñas 85-86: Debuxamos os dous triángulos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se executamos este código dará como resultado isto:&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_3.jpg | 400px | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TAREFA 4.2 A FACER:&amp;#039;&amp;#039;&amp;#039; Esta parte está asociada á realización dunha tarefa.  &lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Se queremos podemos modificar a posición da cámara, polo que os triángulos parecen que se moven, pero será a cámara quen o faga.&lt;br /&gt;
&lt;br /&gt;
Se posicionamos a cámara nun principio e non se move, teríamos que facelo no constructor, ou onde teñamos o código que define os planos far e near da cámara.&lt;br /&gt;
&lt;br /&gt;
No noso caso imos facelo no render, xa que imos facer que se mova a cámara ata que os triángulos deixen de estar dentro do viewfrustrum da cámara.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_2_Camara2D&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Mover a cámara.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;1,10-12&amp;quot; &amp;gt;&lt;br /&gt;
	private float tempo=0;&lt;br /&gt;
        .............&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
		tempo += Gdx.graphics.getDeltaTime();&lt;br /&gt;
		camara2d.position.sub(0,0,tempo*0.2f);&lt;br /&gt;
		camara2d.update();&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara2d.combined);&lt;br /&gt;
		&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
		trianguloGreen.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Se executades o código veredes que ó cabo dun rato os triángulos desaparecen.&lt;br /&gt;
Sabedes por que non van afastándose pouco a pouco da cámara ?&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Porque estamos utilizando unha cámara 2D e nesta cámara non hai perspectiva. Os obxectos se &amp;#039;aplastan&amp;#039; contra a parede indepedentemente da distancia.&lt;br /&gt;
&lt;br /&gt;
===Algoritmo Z-Buffer===&lt;br /&gt;
&lt;br /&gt;
Información na wiki: http://es.wikipedia.org/wiki/Z-Buffer&lt;br /&gt;
&lt;br /&gt;
Se vos fixades no exercicio anterior o triángulo verde (coordenada z=-5) está máis afastado que o triángulo vermello (coordenada z=-3). Sen embargo se debuxa o verde por enriba.&lt;br /&gt;
&lt;br /&gt;
Isto é debido a que agora mesmo OPEN GL non ten en conta a coordenada Z para determinar que obxecto se debuxa antes ou despois.&lt;br /&gt;
&lt;br /&gt;
Para solucionalo en OPELGL temos dúas opcións:&lt;br /&gt;
&lt;br /&gt;
* Algoritmo das caras de atrás: consiste en ocultar as caras que non se debuxarían porque formarían parte da parte traseira do obxecto:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_4.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
* Algoritmo do Z-Buffer: consiste en ter gardada nunha matriz a posición Z de cada punto de tal forma que cando se debuxa cada punto se comproba o Z do novo punto e se verifica que non exista outro punto no mesmo sitio cun Z máis grande (iría diante).&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;gallery caption=&amp;quot;Imaxes con e sen z-buffer aplicado&amp;quot; widths=&amp;quot;200&amp;quot; heights=&amp;quot;200px&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
Image:LIBGDX_UD4_Camara_5.jpg| Sen Z-Buffer.&lt;br /&gt;
Image:LIBGDX_UD4_Camara_6.jpg| Con Z-Buffer aplicado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos imos utilizar dita técnica. &lt;br /&gt;
Para isto temos que:&lt;br /&gt;
* Dicirlle que cando borre a pantalla tamén borre os datos do Z-buffer:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
public void render(){&lt;br /&gt;
   Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
   ..............&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Antes de debuxar debemos habilitar dito modo:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
* Debuxamos e deshabilitamos o modo:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;8&amp;quot; &amp;gt;&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara2d.combined);&lt;br /&gt;
		&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
		trianguloGreen.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Relación de aspecto===&lt;br /&gt;
&lt;br /&gt;
Sobre este punto xa falamos no [http://manuais.iessanclemente.net/index.php?title=LIBGDX_A_c%C3%A1mara_2D#O_tama.C3.B1o_da_pantalla._A_relaci.C3.B3n_de_aspecto desenvolvemento dos xogo 2D].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fixarse que pasa se alongamos a pantalla (sería equivalente a executar a nosa aplicación nun dispositivo móbil cunha resolución maior en ancho):&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_7.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como vemos os triángulos se alongan. &lt;br /&gt;
Isto é debido a que o ViewPort que definimos sempre ten 2f de ancho, polo que se aumenta a resolución os triángulos se teñen que adaptar á nova medida.&lt;br /&gt;
Para evitalo, unha posible solución sería sobreescribir o método resize para que aumente o tamaño do width do viewport en función do ancho da pantalla (relación de aspecto):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; quitamos todo o código do constructor da clase referido á cámara.&lt;br /&gt;
&lt;br /&gt;
public void create() {&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;strike&amp;gt;&lt;br /&gt;
camara2d = new OrthographicCamera(2f,2f);&lt;br /&gt;
camara2d.near=0.1f;&lt;br /&gt;
camara2d.far=100f;&lt;br /&gt;
camara2d.update();&lt;br /&gt;
&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método resize:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	@Override&lt;br /&gt;
	public void resize (int width,int height){&lt;br /&gt;
		// Definimos os parámetros da cámara&lt;br /&gt;
		&lt;br /&gt;
		float aspectRatio = (float) width / (float) height;&lt;br /&gt;
		camara2d = new OrthographicCamera();&lt;br /&gt;
		camara2d.viewportWidth = 2f*aspectRatio;&lt;br /&gt;
		camara2d.viewportHeight = 2f;&lt;br /&gt;
		camara2d.near=0.1f;&lt;br /&gt;
		camara2d.far=10f;&lt;br /&gt;
		camara2d.update();&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O resultado agora é este:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_8.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
O que estamos a facer é ampliar o width da cámara para que manteña a proporción de aspecto có height.&lt;br /&gt;
&lt;br /&gt;
Dependendo do xogo esta pode ser unha opción ou non, xa que os usuarios que tiveran una&lt;br /&gt;
resolución maior poderían ver máis partes do xogo (ven máis ancho).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Veremos máis adiante que na cámara 3D, non importa o tamaño do width-height, no senso que o máximo que imos ter cando o obxecto se achegue á cámara será un valor baixo, de 1f x 1f ou 1fx2f. &amp;#039;&amp;#039;&amp;#039;Só imos establecer a relación de aspecto&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Transparencia===&lt;br /&gt;
&lt;br /&gt;
A transparencia ven indicado polo valor alfa nos datos que enviamos de cor en cada un dos vértices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Lembrade que un valor 1 é opaco e un valor 0 é transparente.&lt;br /&gt;
&lt;br /&gt;
Para que funcione a transparencia temos que facer o seguinte:&lt;br /&gt;
* Todos os obxectos con transparencias teñen que estar renderizados dende o máis distante á cámara ata o máis preto, nesa orde.&lt;br /&gt;
* Todos os obxectos opacos teñen que estar renderizados primeiro e non importa a orde. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No noso caso temos que renderizar primeiro a triángulo verde (é o máis distante), despois o vermello. &lt;br /&gt;
&lt;br /&gt;
Ademais temos que activar o Blending (transparencia) en Open GL dunha forma moi parecido a como activamos o Z-Buffer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_BLEND);     //ACTIVAMOS&lt;br /&gt;
		Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA , GL20.GL_ONE_MINUS_SRC_ALPHA) ;&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_BLEND) ;  // DESACTIVAMOS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modificamos o exercicio UD4_2_Camara2D para engadir a transparencia.&lt;br /&gt;
Fixarse como seguindo as normas primeiro imos debuxar o triángulo verde (que ten alfa = 1) e despois o vermello que ten as transparencias (alfa=0.5f)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_2_Camara2D&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Engadir transparencias ó triángulo vermello.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.OrthographicCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Uso da cámara orthographic e perspective&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_2_Camara2D extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed,trianguloGreen; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private OrthographicCamera camara2d;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		// create shader program&lt;br /&gt;
		String vertexShader = &amp;quot;attribute vec4 &amp;quot;+ ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;attribute vec4 &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;uniform mat4 u_worldView;    \n&amp;quot; &lt;br /&gt;
				+ &amp;quot;varying vec4 v_color; 		\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;	gl_Position = u_worldView *&amp;quot; + ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; v_color = &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;\n&amp;quot; 	&lt;br /&gt;
				+&amp;quot;}								\n&amp;quot;;&lt;br /&gt;
		String fragmentShader = &amp;quot;#ifdef GL_ES 	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;precision mediump float;		\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;#endif						\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;varying vec4 v_color;		\n&amp;quot;  &lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; gl_FragColor = v_color; \n&amp;quot;&lt;br /&gt;
				+ &amp;quot;}							\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		// Creamos o ShaderProgram en base ós programas definidos anteriormente&lt;br /&gt;
		shaderProgram = new ShaderProgram(vertexShader, fragmentShader);&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, -3f, 1f,0f,0f,0.5f,&lt;br /&gt;
				0.5f, -0.5f, -3f, 1f,0f,0f,0.5f,&lt;br /&gt;
				0f, 0.5f, -3f, 1f,0f,0f,0.5f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		trianguloGreen = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloGreen.setVertices(new float[] { // É o verde, se ve detrás&lt;br /&gt;
				0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				1.0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				0.5f, 0.5f, -5f, 0f,1f,0f,1f });&lt;br /&gt;
		trianguloGreen.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_BLEND);&lt;br /&gt;
		Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA , GL20.GL_ONE_MINUS_SRC_ALPHA) ;&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara2d.combined);&lt;br /&gt;
		&lt;br /&gt;
		trianguloGreen.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_BLEND) ;&lt;br /&gt;
		&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void resize (int width,int height){&lt;br /&gt;
		// Definimos os parámetros da cámara&lt;br /&gt;
		&lt;br /&gt;
		float aspectRatio = (float) width / (float) height;&lt;br /&gt;
		camara2d = new OrthographicCamera();&lt;br /&gt;
		camara2d.viewportWidth = 2f*aspectRatio;&lt;br /&gt;
		camara2d.viewportHeight = 2f;&lt;br /&gt;
		camara2d.near=0.1f;&lt;br /&gt;
		camara2d.far=10f;&lt;br /&gt;
		camara2d.update();&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
		trianguloGreen.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comentemos o código:&lt;br /&gt;
&lt;br /&gt;
* Liña 52: Cambiamos o valor alfa da cor en cada vértice do triángulo vermello a 0.5f.&lt;br /&gt;
* Liñas 78-79: Habilitamos as transparencias.&lt;br /&gt;
* Liñas 78-79: Renderizamos primeiro os opacos e despois os transparentes.&lt;br /&gt;
* Liña 89: Deshabilitamos as transparencias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O resultado:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_9.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
===PerspectiveCamera===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Clase: [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/PerspectiveCamera.html PerspectiveCamera].&lt;br /&gt;
&lt;br /&gt;
Información: http://www.badlogicgames.com/wordpress/?p=1550&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ata o de agora estamos utilizando unha visión ortogonal. Agora imos utilizar unha visión en perspectiva polo que os obxectos distantes veranse máis pequenos que os pretos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_10.jpg|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Os conceptos son os mesmos aprendidos para a cámara orthogonal. Temos un ViewFrustrum que ven a ser o volume que se pode visualizar, definido polo plano near e far. A diferenza é que agora cando vexamos a imaxe en pantalla teremos unha &amp;#039;perspectiva&amp;#039; (por exemplo, os obxectos máis pretos veranse máis grandes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_11.jpg|800px|center]]&lt;br /&gt;
&lt;br /&gt;
Fixarse como agora os raios non van paralelos, se non que parten dun ollo (a cámara).&lt;br /&gt;
&lt;br /&gt;
Agora o plano far e plano near non teñen o mesmo tamaño, xa que este último vaise agrandando a medida que nos afastamos da cámara.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación do exercicio:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Crear unha nova clase de nome UD4_3_Camara3D que derive da clase Game e cambiade os diferentes proxectos para que executen dita clase.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_3_Camara3D&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Visualizar dous triángulos utilizando unha cámara en perspectiva.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;21,68,80,93-100&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.Game;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.OrthographicCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.PerspectiveCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
import com.badlogic.gdx.math.Matrix4;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Uso da cámara orthographic e perspective&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_3_Camara3D extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh trianguloRed,trianguloGreen; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private PerspectiveCamera camara3d;&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create() {&lt;br /&gt;
		// TODO Auto-generated method stub&lt;br /&gt;
&lt;br /&gt;
		// create shader program&lt;br /&gt;
		String vertexShader = &amp;quot;attribute vec4 &amp;quot;+ ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;attribute vec4 &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;uniform mat4 u_worldView;    \n&amp;quot; &lt;br /&gt;
				+ &amp;quot;varying vec4 v_color; 		\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;	gl_Position = u_worldView *&amp;quot; + ShaderProgram.POSITION_ATTRIBUTE +&amp;quot;;\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; v_color = &amp;quot; + ShaderProgram.COLOR_ATTRIBUTE +&amp;quot;;\n&amp;quot; 	&lt;br /&gt;
				+&amp;quot;}								\n&amp;quot;;&lt;br /&gt;
		String fragmentShader = &amp;quot;#ifdef GL_ES 	\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;precision mediump float;		\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;#endif						\n&amp;quot;&lt;br /&gt;
				+ &amp;quot;varying vec4 v_color;		\n&amp;quot;  &lt;br /&gt;
				+ &amp;quot;void main()					\n&amp;quot; &lt;br /&gt;
				+ &amp;quot;{							\n&amp;quot;&lt;br /&gt;
				+ &amp;quot; gl_FragColor = v_color; \n&amp;quot;&lt;br /&gt;
				+ &amp;quot;}							\n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		// Creamos o ShaderProgram en base ós programas definidos anteriormente&lt;br /&gt;
		shaderProgram = new ShaderProgram(vertexShader, fragmentShader);&lt;br /&gt;
		if (shaderProgram.isCompiled() == false) {&lt;br /&gt;
			Gdx.app.log(&amp;quot;ShaderError&amp;quot;, shaderProgram.getLog());&lt;br /&gt;
			System.exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
		trianguloRed = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloRed.setVertices(new float[] {&lt;br /&gt;
				-0.5f, -0.5f, -3f, 1f,0f,0f,1f,&lt;br /&gt;
				0.5f, -0.5f, -3f, 1f,0f,0f,1f,&lt;br /&gt;
				0f, 0.5f, -3f, 1f,0f,0f,1f&lt;br /&gt;
				});					&lt;br /&gt;
		trianguloRed.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
	&lt;br /&gt;
		trianguloGreen = new Mesh(true, 3, 3, VertexAttribute.Position(), VertexAttribute.ColorUnpacked());&lt;br /&gt;
		trianguloGreen.setVertices(new float[] { // É o verde, se ve detrás&lt;br /&gt;
				0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				1.0f, -0.5f, -5f, 0f,1f,0f,1f,&lt;br /&gt;
				0.5f, 0.5f, -5f, 0f,1f,0f,1f });&lt;br /&gt;
		trianguloGreen.setIndices(new short[] {0, 1, 2});&lt;br /&gt;
		&lt;br /&gt;
		camara3d = new PerspectiveCamera();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render() {&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);&lt;br /&gt;
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
&lt;br /&gt;
		Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara3d.combined);&lt;br /&gt;
		&lt;br /&gt;
		trianguloRed.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
		trianguloGreen.render(shaderProgram, GL20.GL_TRIANGLES,0,3);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void resize (int width,int height){&lt;br /&gt;
		// Definimos os parámetros da cámara&lt;br /&gt;
		float aspectRatio = (float) width / (float) height;&lt;br /&gt;
		camara3d.viewportWidth = 2f*aspectRatio;&lt;br /&gt;
		camara3d.viewportHeight = 2f;&lt;br /&gt;
				&lt;br /&gt;
		camara3d.far=100f;&lt;br /&gt;
		camara3d.near=0.1f;&lt;br /&gt;
		camara3d.position.set(0,0,2f);&lt;br /&gt;
		camara3d.update();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose(){&lt;br /&gt;
		shaderProgram.dispose();&lt;br /&gt;
		trianguloRed.dispose();&lt;br /&gt;
		trianguloGreen.dispose();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Analicemos o código:&lt;br /&gt;
&lt;br /&gt;
* Liña 21: Definimos o obxecto camara3d.&lt;br /&gt;
* Liña 68: Instanciamos a cámara 3D. O facemos aquí para optimizar o código, xa que poderíamos levalo ó método resize, pero dito método se chama dúas veces ó iniciar ó xogo e se hai un cambio na resolución volve a chamarse. Como neste momento non sabemos a resolución usamos o constructor sen parámetros.&lt;br /&gt;
* Liña 80: Pasamos á matriz combinada ó Shader Program.&lt;br /&gt;
* Liñas 93-100: Definimos o plano far, near e o viewportwidth - viewportheight. Tamén posicionamos a cámara para que mire cara ós triángulos.&lt;br /&gt;
&lt;br /&gt;
O resultado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_12.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
Como vemos os triángulos se visualizan con perspectiva....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un dos atributos que podemos modificar na cámara 3D é o que se coñece como [http://en.wikipedia.org/wiki/Field_of_view_in_video_games Field of view (FOV)].&lt;br /&gt;
&lt;br /&gt;
Este dato o podemos dar directamente no constructor da forma:&lt;br /&gt;
&lt;br /&gt;
:camara3d = new PerspectiveCamera(fov,viewportWidth,viewportHeight)&lt;br /&gt;
&lt;br /&gt;
Ou accedendo á propiedade da forma:&lt;br /&gt;
&lt;br /&gt;
:camara3d.fieldOfView=valor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por defecto establece un ángulo alfa de 67 grados.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_13.jpg|800px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;[http://www.elai.upm.es/webantigua/spain/Asignaturas/InfoInd/teoria/Apuntes%20de%20OpenGL.pdf Imaxe obtida dos apuntes de Cristina Cañero Morales]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
O ángulo alfa se coñece coma Field Of View (FOV) e representa o ángulo de visión da cámara sobre a proxección dos obxectos. Queda máis claro no seguinte gráfico:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_14.jpg|500px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como podemos observar, o que se visualizaría na pantalla (screen window) variará en función deste ángulo, podendo producir un certo efecto de &amp;#039;zoom&amp;#039; dependendo do ángulo utilizado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;b&amp;gt;MOI IMPORTANTE:&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt; Na cámara en perspectiva ten que cumplirse que 0 &amp;lt; near &amp;lt; far.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;b&amp;gt;NOTA:&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt; O viewport width/height só serve para establecer a relación de aspecto. Lembrar que&lt;br /&gt;
estamos traballando en 3D e polo tanto non limitamos o ancho e alto do que vemos.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, se temos un cubo situado na posición (0,0,0) de tamaño 1f.&lt;br /&gt;
O tamaño da pantalla onde se vai visualizar ten unha relación de aspecto de 1 (por exemplo 100x100 ou 200x200,...).&lt;br /&gt;
&lt;br /&gt;
:cfg.width = 400;&lt;br /&gt;
:cfg.height = 400;&lt;br /&gt;
&lt;br /&gt;
Situamos a cámara na posición (0f,0f,1.2f).&lt;br /&gt;
Definimos a cámara có viewport width e height a 1:&lt;br /&gt;
:camara = new PerspectiveCamera(67, 1f , 1f);&lt;br /&gt;
&lt;br /&gt;
Teríamos este resultado:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_15.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se agora cambiamos o viewport width e poñemos dous:&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_16.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O cubo se deforma xa que coa cámara estamos a dicirlle que pode debuxar, para cubrir todo o ancho da pantalla, un obxecto con dúas unidades de ancho (2f) e o cubo ten unha polo que para adaptalo a ese ancho &amp;#039;o deforma&amp;#039;. Se queremos que o cubo sempre se vexa ben teremos que adaptar o ancho da pantalla en función da relación de aspecto (ancho e alto da resolución de pantalla).&lt;br /&gt;
&lt;br /&gt;
:float aspectRatio = (float) width / (float) height;&lt;br /&gt;
:camara = new PerspectiveCamera(67, 1f*aspectRatio , 1f);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_17.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se o deixamos así o ancho se adapta e o cubo sempre vaise debuxar ben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Camara_18.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normalmente ponse:&lt;br /&gt;
&lt;br /&gt;
:camara = new PerspectiveCamera(67, width*aspectRatio ,height);&lt;br /&gt;
&lt;br /&gt;
Aínda que o efecto é o mesmo (lembrar que non estamos definindo o tamaño do que se ve, como no caso da cámara ortográfica, se non a relación de aspecto). &amp;#039;&amp;#039;&amp;#039;ESTAMOS EN 3D.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2015).&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
		
	</entry>
</feed>