<?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_Animacions3D</id>
	<title>LIBGDX Animacions3D - 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_Animacions3D"/>
	<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Animacions3D&amp;action=history"/>
	<updated>2026-10-17T16:14:45Z</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_Animacions3D&amp;diff=900&amp;oldid=prev</id>
		<title>Wiki: /* Introdución */</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Animacions3D&amp;diff=900&amp;oldid=prev"/>
		<updated>2016-05-19T17:56:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Introdución&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 17:56 19 may 2016&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-l116&quot; &gt;Línea 116:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 116:&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;tr&gt;&lt;td colspan=&quot;2&quot;&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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Lembrar que o programa Vertex.vert e Fragment.frag xa os explicamos [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Shader_Program#Traballando_coa_c.C3.A1mara neste punto].&lt;/ins&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;/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_Animacions3D&amp;diff=604&amp;oldid=prev</id>
		<title>Wiki en 17:28 17 dic 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Animacions3D&amp;diff=604&amp;oldid=prev"/>
		<updated>2015-12-17T17:28:14Z</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 17:28 17 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-l327&quot; &gt;Línea 327:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 327:&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;Moi ben, chegou a hora de mover ese cubo :).&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;Moi ben, chegou a hora de mover ese cubo :).&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;&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; Sen programar totalmente seguindo o [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_MVC MVC] imos definir o noso mundo cun array de cubos.  &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;&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; Sen programar totalmente seguindo o [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_MVC MVC] imos definir o noso mundo cun array de cubos.  &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;A clase Cubo terá a información necesaria, que será parecida a que tiñamos cando fixemos o xogo en 2D, pero tendo en conta as particularidades do 3D.&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;A clase Cubo terá a información necesaria, que será parecida a que tiñamos cando fixemos o xogo en 2D, pero tendo en conta as particularidades do 3D.&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;/table&gt;</summary>
		<author><name>Wiki</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Animacions3D&amp;diff=597&amp;oldid=prev</id>
		<title>Wiki: Página creada con «&lt;span style=&quot;font-size:150%;&quot;&gt;UNIDADE 4: Animacións en 3D&lt;/span&gt;  ===Introdución===  Neste apartado imos ver como podemos animar (mover, trasladar e rotar) os obxectos 3D...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Animacions3D&amp;diff=597&amp;oldid=prev"/>
		<updated>2015-12-17T17:25:48Z</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: Animacións en 3D&amp;lt;/span&amp;gt;  ===Introdución===  Neste apartado imos ver como podemos animar (mover, trasladar e rotar) os obxectos 3D...»&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: Animacións en 3D&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Introdución===&lt;br /&gt;
&lt;br /&gt;
Neste apartado imos ver como podemos animar (mover, trasladar e rotar) os obxectos 3D. &lt;br /&gt;
&lt;br /&gt;
Como ven pensades, imos necesitar unha matriz :)&lt;br /&gt;
&lt;br /&gt;
O que imos facer será animar un cubo.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
* Copiar a seguinte textura ó cartafol assets do proxecto Android:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Imagen:crate.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
* Imos crear un obxecto Mesh onde imos definir os vértices que conforman os cubos de acordo co seguinte esquema:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_1.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
Para facelo imos a utilizar os conceptos aprendidos cos triángulos, pero facendo algunha&lt;br /&gt;
modificación.&lt;br /&gt;
Cando fixemos o proxecto dos triángulos definimos dous grupos de vértices, un para cada triángulo.&lt;br /&gt;
Pero tamén podemos definir os dous triángulos nun mesmo grupo de vértices.&lt;br /&gt;
&lt;br /&gt;
:triangulos = new Mesh(true,&amp;#039;&amp;#039;&amp;#039;6,6&amp;#039;&amp;#039;&amp;#039;,new VertexAttribute(Usage.Position,3,&amp;quot;a_position&amp;quot;),new VertexAttribute(Usage.ColorPacked,4,&amp;quot;a_color&amp;quot;));&lt;br /&gt;
:triangulos.setVertices(new float[] {-0.5f,-0.5f,-3f,1f,0,0,1f, 0.5f,-0.5f,-3f,1f,0,0,1f, 0f,0.5f,-3f,1f,0,0,1f, 0f,-0.5f,-5f,1f,0,0,1f, 1f,-0.5f,-5f,1f,0,0,1f, 0.5f,0.5f,-5f,1f,0,0,1f});&lt;br /&gt;
:triangulos.setIndices(new short[]{0,1,2,3,4,5});&lt;br /&gt;
&lt;br /&gt;
:.....&lt;br /&gt;
&lt;br /&gt;
:triangulos.render(GL10.GL_TRIANGLES,&amp;#039;&amp;#039;&amp;#039;0,3&amp;#039;&amp;#039;&amp;#039;);&lt;br /&gt;
:triangulos.render(GL10.GL_TRIANGLES,&amp;#039;&amp;#039;&amp;#039;3,3&amp;#039;&amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Está marcado en negrilla os cambios. Agora os vértices están xuntos. Cando debuxamos (render) informamos que imos debuxar un triángulo que ten a información dos vértices no array de vértices. Un dos triángulos empeza na posición 0 do array e ten tres vértices, mentres que o triángulo2 empeza na posición 3 e ten tres vértices.&lt;br /&gt;
A orde de debuxo dos vértices ven indicado polo array de índices (triángulo1 =&amp;gt; 0,1,2 ; triángulo2 =&amp;gt; 3,4,5).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Poderíamos aproveitar os triángulos que comparten lados e aforrarnos puntos no array de&lt;br /&gt;
vértices.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_2.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;
Volvendo ó Cubo, vemos que cada lado do cubo vai necesitar 4 vértices, por 6 caras = 24 vértices.&lt;br /&gt;
Por outra banda cada triángulo necesita 3 índices. Se cada cara ten dous triángulos isto da:&lt;br /&gt;
:3 índices por triángulo x 2 triángulos por cara x 6 caras = 36 índices.&lt;br /&gt;
&lt;br /&gt;
Crear unha clase de nome Shapes. Dita clase o que vai definir será un Cubo cos seus vértices e índices así como as coordenadas da textura.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase Shapes&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; Xera un obxecto Mesh coa forma dun cubo en 3D.&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.graphics.Mesh;&lt;br /&gt;
import com.badlogic.gdx.graphics.VertexAttribute;&lt;br /&gt;
&lt;br /&gt;
public class Shapes {&lt;br /&gt;
	public static Mesh genCube() {&lt;br /&gt;
		Mesh mesh = new Mesh(true, 24, 36, VertexAttribute.Position(),VertexAttribute.TexCoords(0));&lt;br /&gt;
&lt;br /&gt;
		float[] vertices = { -0.5f, -0.5f, 0.5f, 0, 1, 0.5f, -0.5f, 0.5f, 1, 1,&lt;br /&gt;
				0.5f, 0.5f, 0.5f, 1, 0, -0.5f, 0.5f, 0.5f, 0, 0, 0.5f, -0.5f,&lt;br /&gt;
				0.5f, 0, 1, 0.5f, -0.5f, -0.5f, 1, 1, 0.5f, 0.5f, -0.5f, 1, 0,&lt;br /&gt;
				0.5f, 0.5f, 0.5f, 0, 0, 0.5f, -0.5f, -0.5f, 0, 1, -0.5f, -0.5f,&lt;br /&gt;
				-0.5f, 1, 1, -0.5f, 0.5f, -0.5f, 1, 0, 0.5f, 0.5f, -0.5f, 0, 0,&lt;br /&gt;
				-0.5f, -0.5f, -0.5f, 0, 1, -0.5f, -0.5f, 0.5f, 1, 1, -0.5f,&lt;br /&gt;
				0.5f, 0.5f, 1, 0, -0.5f, 0.5f, -0.5f, 0, 0, -0.5f, 0.5f, 0.5f,&lt;br /&gt;
				0, 1, 0.5f, 0.5f, 0.5f, 1, 1, 0.5f, 0.5f, -0.5f, 1, 0, -0.5f,&lt;br /&gt;
				0.5f, -0.5f, 0, 0, -0.5f, -0.5f, 0.5f, 0, 1, 0.5f, -0.5f, 0.5f,&lt;br /&gt;
				1, 1, 0.5f, -0.5f, -0.5f, 1, 0, -0.5f, -0.5f, -0.5f, 0, 0 };&lt;br /&gt;
		short[] indices = { 0, 1, 3, 1, 2, 3, 4, 5, 7, 5, 6, 7, 8, 9, 11, 9,&lt;br /&gt;
				10, 11, 12, 13, 15, 13, 14, 15, 16, 17, 19, 17, 18, 19, 20, 21,&lt;br /&gt;
				23, 21, 22, 23, };&lt;br /&gt;
&lt;br /&gt;
		mesh.setVertices(vertices);&lt;br /&gt;
		mesh.setIndices(indices);&lt;br /&gt;
		return mesh;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como vemos non mandamos información de cor, só posición e textura polo que temos que modificar os arquivos de vertex.vert e fragment.frag.&lt;br /&gt;
&lt;br /&gt;
* Arquivo vertex.vert:&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;
attribute vec3 a_position;&lt;br /&gt;
attribute vec2 a_texCoord0;&lt;br /&gt;
varying vec2 v_textCoord;&lt;br /&gt;
uniform mat4 u_worldView;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  gl_Position =  u_worldView *vec4(a_position,1);&lt;br /&gt;
  v_textCoord = a_texCoord0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Arquivo fragment.frag:&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;
#ifdef GL_ES &lt;br /&gt;
  precision mediump float;&lt;br /&gt;
#endif  &lt;br /&gt;
varying vec2 v_textCoord;&lt;br /&gt;
uniform sampler2D u_texture;&lt;br /&gt;
void main() &lt;br /&gt;
{&lt;br /&gt;
  vec4 texColor = texture2D(u_texture, v_textCoord);&lt;br /&gt;
  gl_FragColor = texColor;&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Crear unha clase de nome UD4_5_Animacion3D, que derive da clase Game e sexa chamada pola clase principal das diferentes versións (desktop, android,...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_5_Animacion3D&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; Visualiza un cubo en 3D cunha 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;&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.files.FileHandle;&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.PerspectiveCamera;&lt;br /&gt;
import com.badlogic.gdx.graphics.Texture;&lt;br /&gt;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Funcionamento do ShaderProgram&lt;br /&gt;
 * @author ANGEL&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
public class UD4_5_Animacion3D extends Game {&lt;br /&gt;
&lt;br /&gt;
	private Mesh cubo; &lt;br /&gt;
	private ShaderProgram shaderProgram;&lt;br /&gt;
&lt;br /&gt;
	private Texture textura;&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;
		shaderProgram = new ShaderProgram(Gdx.files.internal(&amp;quot;vertex.vert&amp;quot;), Gdx.files.internal(&amp;quot;fragment.frag&amp;quot;));&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;
		cubo = Shapes.genCube();&lt;br /&gt;
	&lt;br /&gt;
		FileHandle imageFileHandle = Gdx.files.internal(&amp;quot;crate.png&amp;quot;);&lt;br /&gt;
		textura = new Texture(imageFileHandle);&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;
		&lt;br /&gt;
		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara3d.combined);&lt;br /&gt;
		&lt;br /&gt;
		textura.bind(0);		&lt;br /&gt;
		shaderProgram.setUniformi(&amp;quot;u_texture&amp;quot;, 0);&lt;br /&gt;
		&lt;br /&gt;
		cubo.render(shaderProgram, GL20.GL_TRIANGLES);&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&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;
		float aspectRatio = (float) width / (float) height; &lt;br /&gt;
		camara3d.viewportWidth=aspectRatio*1f;&lt;br /&gt;
		camara3d.viewportHeight=1f;&lt;br /&gt;
		camara3d.far=1000f;&lt;br /&gt;
		camara3d.near=0.1f;&lt;br /&gt;
		camara3d.lookAt(0,0,0);&lt;br /&gt;
		camara3d.position.set(0f,0f,5f);&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;
		cubo.dispose();&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;
Se probades a executar o código aparecerá un cubo na pantalla.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Loxicamente os modelos 3D non os temos que definir desta forma, se non que usaremos programas de deseño en 3D ou modelos xa feitos.&lt;br /&gt;
&lt;br /&gt;
===Animando o cubo: translación, rotación e escalado===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Clase utilizada: [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html Matrix4].&lt;br /&gt;
&lt;br /&gt;
Información na wiki: https://github.com/libgdx/libgdx/wiki/Vectors,-matrices,-quaternions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
En OPEN GL imos poder facer &amp;lt;u&amp;gt;tres tipos de operacións&amp;lt;/u&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TRASLACIÓN&amp;#039;&amp;#039;&amp;#039;: Lembrar que por defecto todos os obxectos se debuxan nas coordenadas (0,0,0). No noso mundo os obxectos (figuras Mesh) estarán nunha posición no espazo 3D. Será necesario trasladalos dende a posición (0,0,0) á posición no noso mundo.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ROTACIÓN&amp;#039;&amp;#039;&amp;#039;: Podemos rotar a figura Mesh en calquera dos eixes (x,y,z). Lembrar que para saber como se rota a figura en cada un deles temos que imaxinar que a nosa cabeza está atravesado por unha lanza en cada un dos eixes. Así:&lt;br /&gt;
:: Eixe X: Moveríamos arriba-abaixo.&lt;br /&gt;
:: Eixe Y: Moveríamos esquerda-dereita.&lt;br /&gt;
:: Eixe Z; Moveríamos de lado, levando a cabeza ós ombreiros.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ESCALADO&amp;#039;&amp;#039;&amp;#039;: O da escala o entenderedes mellor cando vexades o vídeo de como facer unha figura xeométrica 3D nun programa de deseño. Nestes programas a visualización 3D está dividida en cadrados. Cada cadrado ven ser unha unidade, de tal forma que se achegamos a cámara ata o obxecto, por defecto , o ancho e alto da cámara será dunha unidade. O que nos interesa é facer os obxectos de forma proporcional uns con outros. Así, se teño un modelo dun coche e está ocupando 4 unidades, se agora engado un deseño dun barco, non pode ser que o barco ocupe 4 unidades. Proporcionalmente ten que haber unha relación entre un modelo e outro.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_3.jpg|500px|center]]&lt;br /&gt;
&amp;lt;center&amp;gt;Exemplo dunha esfera ocupando 2x2x2 unidades.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como ven vos estaredes imaxinando imos necesitar gardar unha matriz, unha &amp;lt;u&amp;gt;&amp;#039;&amp;#039;&amp;#039;matriz de modelado&amp;#039;&amp;#039;&amp;#039;&amp;lt;/u&amp;gt;.&lt;br /&gt;
Esta matriz é un vector 4x4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_4.jpg|300px|center]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo de definición de matriz:&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 Matrix4 matriz;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A matriz que aparece na imaxe se denomina matriz de identidade e ven a ser o número 1 na multiplicación, é dicir, que non fai nada.&lt;br /&gt;
&lt;br /&gt;
Para cargar a matriz de identidade temos que chamar ó método idt():&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;
public Matrix4 matriz;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
matriz.idt();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora será necesario aplicar os 3 tipos de operacións:&lt;br /&gt;
&lt;br /&gt;
* Traslación:&lt;br /&gt;
::[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html#setToTranslation-float-float-float- Método translate]:&lt;br /&gt;
::Exemplo:	matriz.translate(posicion);&lt;br /&gt;
:: Sendo &amp;#039;posicion&amp;#039; un Vector3 que indica cara onde se ten que trasladar. Este método está sobrecargado e temos varias opcións.&lt;br /&gt;
::É importante comprender que sempre debemos de partir da matriz identidade e aplicar a nova posición que queremos chegar. Non o podemos facer a partires da última posición gardada.&lt;br /&gt;
&lt;br /&gt;
Exemplo de código:&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 Matrix4 matriz;&lt;br /&gt;
..........&lt;br /&gt;
matriz.idt();&lt;br /&gt;
matriz.translate(10,1,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Rotación:&lt;br /&gt;
::[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html#rotate-float-float-float-float- Método rotate]:&lt;br /&gt;
&lt;br /&gt;
::Este método está sobrecargado e temos varias posibilidades.&lt;br /&gt;
Un  exemplo:&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 Matrix4 matriz;&lt;br /&gt;
..........&lt;br /&gt;
matriz.idt();&lt;br /&gt;
matriz.translate(10,1,0);&lt;br /&gt;
matriz.rotate(1,0,0,90);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso estaremos rotando no eixe X a figura 90º. Neste caso o método rotate leva catro parámetros:&lt;br /&gt;
&lt;br /&gt;
* param1: Indica se o eixe X debe rotarse. Se ten valor 1 o rota e se ten 0 non fai nada nese eixe.&lt;br /&gt;
* param2: Indica se o eixe Y debe rotarse. Se ten valor 1 o rota e se ten 0 non fai nada nese eixe.&lt;br /&gt;
* param3: Indica se o eixe Z debe rotarse. Se ten valor 1 o rota e se ten 0 non fai nada nese eixe.&lt;br /&gt;
* param4: Indica o número de grados da rotación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Aviso:&amp;lt;/u&amp;gt; É importante primeiro facer a traslación e despois a rotación, xa que se o facemos ó revés, o punto está rotado cando aplicamos a traslación e por tanto se moverá a outro lugar diferente o que queremos. Se o fixeramos cunha esfera, teríamos o efecto dun movemento de traslación arredor do sol.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Escala:&lt;br /&gt;
::[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html#scale-float-float-float- Método scale]:&lt;br /&gt;
&lt;br /&gt;
Podemos modificar a escala en cada un dos eixes (X-Y-Z).&lt;br /&gt;
&lt;br /&gt;
Por exemplo:&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 Matrix4 matriz;&lt;br /&gt;
..........&lt;br /&gt;
matriz.idt();&lt;br /&gt;
matriz.translate(10,1,0);&lt;br /&gt;
matriz.rotate(1,0,0,90);&lt;br /&gt;
matriz.scale(2,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste exemplo indicamos que o tamaño X da figura debe ser o dobre que o tamaño Y e Z.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Moi ben, chegou a hora de mover ese cubo :).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; Sen programar totalmente seguindo o [http://manuais.iessanclemente.net/index.php?title=LIBGDX_MVC MVC] imos definir o noso mundo cun array de cubos. &lt;br /&gt;
A clase Cubo terá a información necesaria, que será parecida a que tiñamos cando fixemos o xogo en 2D, pero tendo en conta as particularidades do 3D.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase Cubo&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; Definimos a clase Cubo para engadir cubos ó noso mundo.&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.math.Matrix4;&lt;br /&gt;
import com.badlogic.gdx.math.Vector3;&lt;br /&gt;
&lt;br /&gt;
public class Cubo {&lt;br /&gt;
	&lt;br /&gt;
	public Matrix4 matriz;&lt;br /&gt;
	public Vector3 posicion;&lt;br /&gt;
	public float escala;&lt;br /&gt;
	public Vector3 velocidade;&lt;br /&gt;
	private float rotar;&lt;br /&gt;
	private Vector3 temp;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	public Cubo(Vector3 pos, float escala,Vector3 velocidade){&lt;br /&gt;
		matriz = new Matrix4();&lt;br /&gt;
		posicion = pos;&lt;br /&gt;
		this.escala=escala;&lt;br /&gt;
		this.velocidade = velocidade;&lt;br /&gt;
		&lt;br /&gt;
		temp = new Vector3();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	public void update(float delta){&lt;br /&gt;
		&lt;br /&gt;
		temp.set(velocidade);&lt;br /&gt;
		posicion.add(temp.scl(delta));&lt;br /&gt;
		&lt;br /&gt;
		matriz.idt();&lt;br /&gt;
		matriz.translate(posicion);&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ñas 6-11: O que necesitamos gardar da figura. &lt;br /&gt;
:: Liña 6: A matriz de modelado que vai gardar os datos necesarios a aplicar en cada punto do Mesh.&lt;br /&gt;
:: Liña 7: Como vemos temos unha posición (Vector3). Aplicaremos ó método translate sobre a matriz.&lt;br /&gt;
:: Liña 8: A escala (que vai ser aplicada ós tres eixes) e que tamén pode non ser necesaria, dependendo do xogo.&lt;br /&gt;
:: Liña 9: A velocidade. Tamén pode non ser necesaria (se non se move). Neste caso poderíamos ter diferentes velocidades en cada un dos eixes. Se a velocidade é a mesma en calquera dos eixes no que se mova podería ser un float en vez dun Vector3.&lt;br /&gt;
:: Liña 10: O ángulo de rotación, pero se no noso xogo non o necesitamos podemos eliminar esta propiedade.  &lt;br /&gt;
:: Liña 11: Vector temporal para non ten que estar creando novos no método update. Lembrar que os métodos cpy, scl,...aplicados a un vector3 modifican o vector orixinal.&lt;br /&gt;
&lt;br /&gt;
* Liñas 14-22: Gardamos nas propiedades os valores enviados no constructor.&lt;br /&gt;
&lt;br /&gt;
* Liña 26: Modificamos o vector posición en función de delta igual que fixemos no xogo 2D.&lt;br /&gt;
* Liñas 28-29: Modificamos a matriz de modelado cos datos da nova posición. Fixarse como temos que partir da matriz identidade (liña 28).&lt;br /&gt;
&lt;br /&gt;
Máis adiante faremos a rotación e escalado. Polo de agora o deixamos así...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora chega o momento de definir o mundo:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase Mundo&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 dous cubos ó mundo.&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 java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
import com.badlogic.gdx.math.Vector3;&lt;br /&gt;
&lt;br /&gt;
public class Mundo {&lt;br /&gt;
	public ArrayList&amp;lt;Cubo&amp;gt;cubos;&lt;br /&gt;
	&lt;br /&gt;
	public Mundo(){&lt;br /&gt;
		cubos = new ArrayList&amp;lt;Cubo&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
		cubos.add(new Cubo(new Vector3(0,0,-3f),1f,new Vector3(1,0,0)));&lt;br /&gt;
&lt;br /&gt;
		cubos.add(new Cubo(new Vector3(4f,0,-3f),5f,new Vector3(-1,0,0)));&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;
Esta clase non ten nada que comentar. Creamos dous cubos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora chega o momento de pasarlle esta matriz ó Shader Program para que teña en conta onde están situados os puntos. Para iso temos que multiplicar a matriz combinada da cámara coa matriz de modelado do obxecto, pero tendo coidado de ter gardada a matriz combinada xa que a operación de multiplicación modifica a matriz.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD4_5_Animacion3D&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; Movemos os cubos.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;17,20-22&amp;quot; &amp;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;
		&lt;br /&gt;
		&lt;br /&gt;
		shaderProgram.begin();&lt;br /&gt;
		&lt;br /&gt;
		textura.bind(0);		&lt;br /&gt;
		shaderProgram.setUniformi(&amp;quot;u_texture&amp;quot;, 0);&lt;br /&gt;
		&lt;br /&gt;
		for (Cubo cub : mundo.cubos){&lt;br /&gt;
			cub.update(Gdx.graphics.getDeltaTime());&lt;br /&gt;
			shaderProgram.setUniformMatrix(&amp;quot;u_worldView&amp;quot;, camara3d.combined.cpy().mul(cub.matriz));&lt;br /&gt;
			cubo.render(shaderProgram, GL20.GL_TRIANGLES);&lt;br /&gt;
			&lt;br /&gt;
			if (Math.abs(cub.posicion.x)&amp;gt;=10){&lt;br /&gt;
				cub.velocidade.x *=-1;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		shaderProgram.end();&lt;br /&gt;
		&lt;br /&gt;
		Gdx.gl20.glDisable(GL20.GL_DEPTH_TEST);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Liña 17: Por cada cubo do mundo (estamos a percorrer o array) multiplicamos unha copia da matriz combinada da cámara, polo matriz de modelado do obxecto. Chamamos ó método cpy() para facer unha copia. O ideal é ter unha matriz temporal xa instanciada no constructor e asinarlle o valor da matriz combinada antes de multiplicar.&lt;br /&gt;
&lt;br /&gt;
Liña 20-22: Código posto para que os cubos cambien de dirección.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imos modificar ó método update da clase Cubo para que rote e escale os cubos de acordo ós datos enviados no constructor.&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;6,10,11&amp;quot; &amp;gt;&lt;br /&gt;
	public void update(float delta){&lt;br /&gt;
		&lt;br /&gt;
		temp.set(velocidade);&lt;br /&gt;
		posicion.add(temp.scl(delta));&lt;br /&gt;
		&lt;br /&gt;
		rotar+=60f*delta;&lt;br /&gt;
&lt;br /&gt;
		matriz.idt();&lt;br /&gt;
		matriz.translate(posicion);&lt;br /&gt;
		matriz.scl(escala);&lt;br /&gt;
		matriz.rotate(1, 1, 1, rotar);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 6: Gardamos o ángulo de rotación.&lt;br /&gt;
* Liña 10: Escalamos a matriz en todos os eixes.&lt;br /&gt;
* Liñá 11: Rotamos a matriz en todos os eixes.&lt;br /&gt;
&lt;br /&gt;
Dará como resultado isto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_5.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;
Como vemos un dos cubos é moi grande pola escala que enviamos no constructor.&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; Lembrar que cando fagamos unha rotación, primeiro debemos de aplicar a escala á matriz.&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>