Estoy creando un juego de sprites en 2D en Unity, que es un entorno de desarrollo de juegos en 3D. He restringido toda la traslación de objetos al plano XY y la rotación al eje Z.
Mi problema es que las mallas que se usan para detectar colisiones entre objetos aún deben estar en 3D. Tengo la necesidad de detectar colisiones entre el objeto del jugador (un colisionador de cápsulas) y un sprite (que tiene su volumen de colisión definido por un prisma poligonal).
Actualmente estoy escribiendo el editor de niveles y tengo la necesidad de permitir que el usuario defina el área de colisión para cualquier mosaico dado. En la imagen a continuación, el usuario hace clic en los puntos P1, P2, P3, P4 en ese orden.
Obviamente, los puntos se unen para formar un cuadrilátero. Esta es el área de colisión que quiero, sin embargo, debo convertirla en una malla 3D. Básicamente, necesito generar una extrusión del polígono, luego asignar el devanado del vértice y los triángulos, etc. Las posiciones de los vértices no son un problema para descifrar, ya que es simplemente una traducción del polígono hacia abajo del eje z.
Tengo problemas para crear un algoritmo para asignar el orden de giro de los vértices, especialmente porque la malla debe consistir solo en triángulos.
Obviamente, la estructura que he ilustrado no es importante, el polígono puede tener cualquier forma 2d y siempre necesitará formar un prisma. ¿Alguien sabe algún método para esto?
Muchas gracias a todos por su tiempo.
Un algoritmo simple que viene a la mente es algo como esto:
extrudedNormal = faceNormal.multiplyScale(sizeOfExtrusion);//multiply the face normal by the extrusion amt. = move along normal for each(vertex in face){ vPrime = vertex.clone();//copy the position of each vertex to a new object to be modified later vPrime.addSelf(extrudedNormal);//add translation in the direction of the normal, with the amt. used in the }
Así que la idea es básica:
Para obtener un ejemplo más completo y rico en características, consulte las muestras de Unity de modelado de procedimientos . También incluyen una buena muestra de extrusión de malla (ver ExtrudedMeshTrail.js que usa MeshExtrusion.cs).
¡Buena suerte!
Para crear las paredes extruidas:
Para cada vértice a (con coordenadas a x , a y ) en su polígono: - llame al siguiente vértice 'b' (con coordenadas b x , b y ) - cree el rectángulo extruido correspondiente a la línea de 'a' a 'b ': - El rectángulo tiene vértices (a x ,a y ,z 0 ), (a x ,a y ,z 1 ), (b x ,b y ,z 0 ), (b x ,b y ,z 1 ) - Este rectángulo se puede crear a partir de dos triángulos: - (a x ,a y ,z 0 ), (a x ,a y ,z 1 ), (b x ,b y ,z 0 ) y (a x ,a y ,z 1 ), (b x ,b y ,z 0 ), (b x ,b y ,z 1 )
Si desea crear una franja triangular en su lugar, es aún más simple. Para cada vértice a, solo suma ( ax ,ay , z 0 ) y ( ax ,ay , z 1 ). Cualquiera que sea el vértice que procesó primero, también deberá procesarse nuevamente después de recorrer todos los demás vértices.
Para crear las tapas finales:
Este paso es probablemente innecesario para fines de colisión. Pero aquí hay una técnica simple: http://www.siggraph.org/education/materials/HyperGraph/scanline/outprims/polygon1.htm Cada triángulo resultante debe agregarse en la profundidad z 0 y z 1 .