Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Colisiones

Iniciado por SkyNetBCN, 11 de Noviembre de 2006, 03:16:04 PM

« anterior - próximo »

SkyNetBCN

Hola de nuevo... como algunos de vosotros ya sabréis, estoy empezando a hacer mis primeras chapucillas con DirectX 9 y c++.

Me gustaría saber cual considerais que es la mejor manera (y como mejor me refiero a la más simple, aunque sea más precisa) de detectar colisiones entre un objeto (Mesh.x) y lo que sería el jugador en un juego en 1ª persona...
quizás creando una "esfera" alrededor de la camara detectando si el mesh se encuentra dentro de la esfera? no sé, esque realmente no tengo ni idea... cual es vuestra opinión?

Gracias!!

Saludos

coldev

-------------------------
Colombian Developers
http://coldev.blogspot.com/
http://coldev.cjb.net
--------------------------

Alexpi

Lo normal, es usar un cubo que rodee a cada mesh, este cubo no se renderiza, pero sus 8 vertices se usan para calcular la distancia entre ellos y el jugador, y asi saber si esta "tocandolo".

Un cubo es la solucion mas facil, se puede aumentar los vertices, y en lugar de un cubo, usar una figura con un aspecto parecido al modelo (pero sin detalles y muchisimos menos poligonos) y asi tienes colisiones mas realistas, pudiendo diferenciar si le disparan en la cabeza, brazos etc.

Claro esta, cuanto mas poligonos tenga más cpu consumira en calculos.

Un salu2
Juego web www.goldpiece.net


marcode

Puedes considerar al jugador como un cilindro vertical y comparar cada vértice del mesh si está dentro. Si las coordenadas (X, Z) de un vértice están dentro del radio y la (Y) está dentro de la altura mínima y máxima es que hay colisión.

Aunque antes deberás hacer una selección previa de todos aquellos meshes que por su proximidad deban ser comprobados más detalladamente.

Otro problema es que para muros y otros objetos grandes deberás tener en cuenta también las intersecciones, entonces tal vez sería mejor comprobar polígonos en lugar de vértices.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

SkyNetBCN

Crear un "cubo" con una forma parecida al mesh es complicado, ya que posiblemente el mesh sea un mapa sobre el que se caminará y puede llegar a ser bastante complejo...

Me gusta lo de comprobar si las coordenadas de un vértice está dentro del radio... decis que mejor sería comprobar los polígonos en lugar de los vértices? jeje, no sabía que podía hacer eso...  :D (ya sabeis que soy nuevo)

seguramente el mesh será muy grande (repito, un mapa), así que supongo que sería muy lento recorrer cada vez todos los vertices/poligonos del mesh, no?

Gracias por vuestras opiniones...

BeRSeRKeR

En ese caso necesitarás un sistema de particionamiento del espacio (por ejemplo un octree) para acelerar los cálculos de colisión.

Y por supuesto, tendrás que detectar la colisión por polígono. Y luego tendrás que hacer que el objeto de colisión de la cámara (una esfera, o lo que sea), se deslice sobre la superficie de colisión (sliding plane).

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

SkyNetBCN

jeje, Como si me hablaseis en chino... dando por hecho que hay muy poca documentación por internet de todo esto... alguien me puede decir por donde empezar? Recordar que soy nuevo...  :D

Gracias

BeRSeRKeR

Sobre octrees hay bastantes documentos. Busca en Google, seguro que encuentras. De todas formas tienes una introducción sobre octrees escrita por nuestro compañero Lord Trancos, aquí. Ahí mismo, al final del todo, tienes enlaces sobre octrees.

En cualquier caso hay más sistemas de particionamiento del espacio (BSP trees, KD trees, etc).

Y con respecto a las colisiones, un buen documento es Improved Collision Detection & Response de Kasper Fauerby aka Telemachos.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.