<?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_Colisions3D</id>
	<title>LIBGDX Colisions3D - 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_Colisions3D"/>
	<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Colisions3D&amp;action=history"/>
	<updated>2026-10-18T04:02:51Z</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_Colisions3D&amp;diff=609&amp;oldid=prev</id>
		<title>Wiki: Página creada con «&lt;span style=&quot;font-size:150%;&quot;&gt;UNIDADE 4: Colisións en 3D&lt;/span&gt;  ==Introdución==  Clases utilizadas:  *[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gd...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Colisions3D&amp;diff=609&amp;oldid=prev"/>
		<updated>2015-12-17T17:34:28Z</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: Colisións en 3D&amp;lt;/span&amp;gt;  ==Introdución==  Clases utilizadas:  *[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gd...»&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: Colisións en 3D&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introdución==&lt;br /&gt;
&lt;br /&gt;
Clases utilizadas: &lt;br /&gt;
*[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Intersector.html Intersector]&lt;br /&gt;
*[http://libgdx.badlogicgames.com/nightlies/docs/api/?com/badlogic/gdx/math/collision/Sphere.html Esfera]&lt;br /&gt;
*[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/BoundingBox.html BoundingBox].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Información na wiki: https://github.com/libgdx/libgdx/wiki/Circles%2C-planes%2C-rays%2C-etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En 3D temos varias formas de controlar cando unha figura &amp;#039;choca&amp;#039; con outra.&lt;br /&gt;
* Envolver a figura cun prisma-cubo e comprobar se choca con outra figura.&lt;br /&gt;
* Envolver a figura cunha esfera e comprobar se esta choca con outra figura.&lt;br /&gt;
* Usar un raio: partir dun punto e cunha dirección ata o infinito, comprobar se dito raio atravesa (choca) con outra figura.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_6.jpg|600px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* O cubo-prisma denomínase [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/BoundingBox.html BoundingBox] e pódese obter a partires dun obxecto da clase Mesh ou ben crear nos un obxecto da [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/BoundingBox.html clase BoundingBox] e definir o seu tamaño e posición (con dous vectores (min-max) que conforman o volume)&lt;br /&gt;
* A [http://libgdx.badlogicgames.com/nightlies/docs/api/?com/badlogic/gdx/math/collision/Sphere.html esfera] defínese cun centro (nunha posición no espazo 3D) e un radio.&lt;br /&gt;
* O uso de [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/Ray.html raios] (parten dun punto e teñen unha dirección). Por exemplo, se prememos na pantalla podemos querer saber se estamos a tocar un obxecto que estaría en liña recta dende o punto ata o obxecto.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As colisións as temos que controlar usando a clase Intersector (no caso dos bounding box - rays), a propia clase BoundingBox, para controlar cando un BoundingBox choca con outro,chamando ó método intersects ou a clase Sphere que ten un método que indica cando se &amp;#039;choca&amp;#039; con outra esfera (método overLaps).&lt;br /&gt;
&lt;br /&gt;
==Clase BoundingBox==&lt;br /&gt;
&lt;br /&gt;
O proceso é o seguinte:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Primeiro debemos de obter o BoundingBox do obxecto Mesh chamando ó [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Mesh.html#calculateBoundingBox-- método calculateBoundingBox].&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;
Mesh cubo;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
BoundingBox boundingBox = cubo.calculateBoundingBox()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Unha vez o temos debemos de aplicarlle as mesmas transformacións que sufra o Mesh, chamando ó [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/BoundingBox.html#mul-com.badlogic.gdx.math.Matrix4- método mul].&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;
..........&lt;br /&gt;
boundingBox.mul(matriz);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Sendo matriz un obxecto da clase Matrix4 que foi aplicada ó obxecto Mesh.&lt;br /&gt;
Lembrar que xa vimos o uso de matrices [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_Animacions3D#Animando_o_cubo:_translaci.C3.B3n.2C_rotaci.C3.B3n_e_escalado neste punto do curso].&lt;br /&gt;
&lt;br /&gt;
* Agora chamaremos ó [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/BoundingBox.html#intersects-com.badlogic.gdx.math.collision.BoundingBox- método intersects] enviando como parámetro o BoundingBox doutro obxecto a controlar:&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;
..........&lt;br /&gt;
if (boundingBox1.intersects(boundingBox2)){&lt;br /&gt;
   // CHOCA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt;&amp;#039;&amp;#039;&amp;#039; O cálculo para obter o BoundingBox asociado o Mesh (chamado ao método calculateBoundingBox()) é bastante custoso. &lt;br /&gt;
&lt;br /&gt;
Se queremos aumentar o rendemento o lóxico é que gardemos unha copia do BoundingBox orixinal e outra copia para aplicar a matriz coas transformacións.&lt;br /&gt;
&lt;br /&gt;
Así por cada Mesh do noso xogo crearíamos unha propiedade BoundingBox para gardar o BoundingBox orixinal (estaría situado na posición 0,0,0 sen transformación ningunha). Podería ser de clase (Static). Dependerá se dende a clase que representa o modelo no noso personaxe ten acceso a dita propiedade.&lt;br /&gt;
&lt;br /&gt;
Neste exemplo estamos a supoñer que cargamos un Mesh en forma de Cubo dende a clase AssetsXogo:&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 class AssetsXogo{&lt;br /&gt;
      .......&lt;br /&gt;
      public static BoundingBox BBoxCuboOrixinal;&lt;br /&gt;
      public staic void cargarMesh(){&lt;br /&gt;
      .........&lt;br /&gt;
      BBoxCuboOrixinal = meshCubo.calculateBoundingBox();&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 dende cada clase que faga uso deste Mesh crearemos un BoundingBox temporal ao que asinaremos o orixinal antes de aplicar as transformacións:&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 class Inimigos {&lt;br /&gt;
      .........&lt;br /&gt;
      BoundingBox temporal;&lt;br /&gt;
      public Inimigos(){&lt;br /&gt;
&lt;br /&gt;
         temporal = new BoundingBox();&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      public void update(float render){&lt;br /&gt;
         ..........&lt;br /&gt;
         temporal.set(AssetsXogo.BBoxCuboOrixinal); &lt;br /&gt;
         temporal.mul(matriz);&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;
Sendo matriz un obxecto da clase Matrix4 que ten gardadas todas as transformacións a aplicar sobre o Inimigo (posición, escala e rotación).&lt;br /&gt;
&lt;br /&gt;
==Clase Intersector - Rays==&lt;br /&gt;
&lt;br /&gt;
O que facemos neste caso é calcular a dirección que ten un raio (vector unidade cunha dirección) e comprobamos se a proxección deste raio no espazo 3D choca cun BoundingBox.&lt;br /&gt;
&lt;br /&gt;
O proceso é o seguinte:&lt;br /&gt;
&lt;br /&gt;
* Primeiro temos que calcular o raio. Neste exemplo imos supoñer que o xogador preme na pantalla e que queremos controlar se premendo nese punto, a proxección dese punto cara &amp;#039;dentro da pantalla&amp;#039; choca cun BoundingBox.&lt;br /&gt;
&lt;br /&gt;
Para obter o raio temos que facer uso do [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Camera.html#getPickRay-float-float- método getPickRay] da cámara en perspectiva.&lt;br /&gt;
Normalmente dito control o faremos no [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_As_interfaces_para_capturar_eventos método touchDown] que se produce cando prememos na pantalla.&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 boolean touchDown(int screenX, int screenY, int pointer, int button) {&lt;br /&gt;
&lt;br /&gt;
    Ray ray = camara3d.getPickRay(screenX, screenY, 0, 0, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());&lt;br /&gt;
&lt;br /&gt;
   ......&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
O método está sobrecargado polo que temos varias opcións. Nesta enviamos as coordenadas en pixeles da pantalla e o tamaño do mesma estando a posición 0,0 na parte inferior esquerda da pantalla.&lt;br /&gt;
&lt;br /&gt;
* Unha vez temos o raio podemos chamar ó [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Intersector.html#intersectRayBoundsFast-com.badlogic.gdx.math.collision.Ray-com.badlogic.gdx.math.collision.BoundingBox- método intersectRayBoundsFast] da clase Intersector que nos indica se o raio choca cun BoundingBox.&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;
&lt;br /&gt;
	if (Intersector.intersectRayBoundsFast(ray, boundingBox)){&lt;br /&gt;
                 // CHOCA&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Clase Sphere==&lt;br /&gt;
&lt;br /&gt;
Neste caso temos que asociar a cada obxecto Mesh un obxecto da [http://libgdx.badlogicgames.com/nightlies/docs/api/?com/badlogic/gdx/math/collision/Sphere.html clase Sphere].&lt;br /&gt;
&lt;br /&gt;
Unha esfera está definida pola posición e radio.&lt;br /&gt;
&lt;br /&gt;
Normalmente nos xogos o tamaño da esfera asociada ó obxecto Mesh non vai variar e o que temos que facer é actualizar a posición en función da posición do obxecto Mesh.&lt;br /&gt;
&lt;br /&gt;
Se estamos a desenvolver o xogo seguindo o [http://wiki.cifprodolfoucha.es/index.php?title=LIBGDX_MVC patrón Model-View-Controller] como xa vimos no xogo 2D teremos que definir a esfera como unha propiedade máis dentro da clase. Instanciala no constructor e movela no método update da clase.&lt;br /&gt;
&lt;br /&gt;
* O tamaño: o tamaño ten que ven co tamaño que teña o obxecto no programa 3D de deseño. Así, no seguinte gráfico podemos ver como a esfera que representa a Terra ten un tamaño de dúas unidades (2x2x2)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD4_Animacion_3.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste exemplo o radio da esfera é de 1 unidade e ten un diámetro de 2 unidades:&lt;br /&gt;
&lt;br /&gt;
::diámetro = radio x 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora ben, cando eu defino unha figura a podo escalar. Entón a esfera teremos que aplicarlle a escala tamén.&lt;br /&gt;
&lt;br /&gt;
Así, se instancio a terra cunha escala de 25 significa o seguinte:&lt;br /&gt;
&lt;br /&gt;
::diámetro orixinal sen escalar = 2 Unidades&lt;br /&gt;
::diámetro escalado = 25 x 2 = 50 Unidades&lt;br /&gt;
&lt;br /&gt;
Polo tanto eu terei que definir unha esfera de 50 unidades de &amp;#039;&amp;#039;&amp;#039;diámetro&amp;#039;&amp;#039;&amp;#039; e &amp;lt;u&amp;gt;&amp;#039;&amp;#039;&amp;#039;polo tanto de 25 Unidade de Radio&amp;#039;&amp;#039;&amp;#039;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Isto o teremos que facer unha vez (pode ser no constructor) se durante o xogo o tamaño da figura 3D non ten que variar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O proceso polo tanto sería:&lt;br /&gt;
&lt;br /&gt;
* Definimos a esfera:&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 Sphere esfera;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Instanciamos a esfera e lle damos unha posición igual á do obxecto a controlar e unha escala de acordo a escala do obxecto a controlar. No caso da Terra no noso 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;
	esfera = new Sphere(pos, escala);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Actualizamos a esfera coa posición no obxecto a controlar. Debemos chamar á [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/Sphere.html#center propiedade center]:&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;
esfera.center.set(posicion);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Agora queda controlar cando a esfera &amp;#039;choca&amp;#039; con outra esfera. Para iso temos que chamar ó [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/collision/Sphere.html#overlaps-com.badlogic.gdx.math.collision.Sphere- método overlaps] da clase Sphere:&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;
		if (esfera.overlaps(outraesfera) {&lt;br /&gt;
                   // CHOCA			&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;
&amp;#039;&amp;#039;&amp;#039;TAREFA 4.6 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;
&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>