xna

XNA tutorial 3 – colisiones :serie 1:

En este artículo voy a comentar como estoy manejando la detección de colisiones con los limites del área dibujada.

Antes de empezar, hay que aclarar el concepto de “bounding frustum”. Básicamente y en cristiano es el área o volumen que estamos dibujando. Esta limitado por planos donde los mas importantes son el front y el back (que por ahora no vamos a usar). Para ver mejor el concepto pueden visitar esta dirección.

Este es el gráfico (el cual es bastante auto explicativo):

Bb195165.BoundingFrustum_ViewFrustum(en-us,XNAGameStudio.31)

La única diferencia es que nosotros tenemos girado todo 90º:

camaraOtro concepto que debemos conocer es el de Collision Sphere: esto es una esfera con el volumen suficiente para contener un modelo en tres dimensiones.  Lo bueno de utilizar este tipo de objetos para la detección de colisiones es que cuando rotamos o movemos el modelo, actualizar  la esfera es muy fácil (ya que no varía, es solo un punto y un radio). Un punto muy negativo es que para cálculos complejos no es precisa, pero para este ejemplo sobra.

El algoritmo para crearla se sitúa en el método load (necesitamos la información del modelo)

foreach (ModelMesh mesh in model.Meshes)
    collisionSphere = BoundingSphere.CreateMerged(collisionSphere, mesh.BoundingSphere);

Algoritmo

Como dije antes, el bounding frustum es un área delimitada por planos. Lo que vamos a hacer, utilizando métodos de las clases, es ver si existe una intersección entre la esfera (bounding sphere) que contiene a la nave y los limites del frutum. Esta prueba debemos hacerla en la próxima posición, por lo que creamos un vector y una esfera de prueba.

// control de posicion para la coordenada x
Vector3 collisionTestVector = Vector3.Zero;
BoundingSphere collisionTestSphere;

collisionTestVector.X = position.X + movement.X;
collisionTestVector.Z = position.Z;
collisionTestVector.Y = movement.Y;

collisionTestSphere = new BoundingSphere(collisionTestVector, collisionSphere.Radius);

if (Camera.BoundingFrustum.Contains(collisionTestSphere) == ContainmentType.Intersects)
    movement.X = 0;

Ese código muestra como fue realizado para la coordenada X. En el ejemplo esta también implementado para Z.

Desde este link pueden descargar la solución.

Advertisements

2 thoughts on “XNA tutorial 3 – colisiones :serie 1:”

  1. You actually produced quite a few wonderful tips inside ur post, “XNA tutorial 3 – colisiones :serie
    1: Angel Arcoraci”. I am going to become returning
    to your web site shortly. Thank you -Matthias

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s