Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Trazar una linea sobre un terreno

Iniciado por Quel, Octubre 08, 2015, 04:20:16 PM

Tema anterior - Siguiente tema
Pondrás el código de como lo has hecho?

Me gusta programar usando clases y jerarquías, para hacer funciones lo mas versátiles posible. Lo que se traduce en un código muy "diseminado". Lo que su puedo hacer es intentar explicar lo que he hecho.Originalmente lo solucioné lanzando una ristra de Raycast de arriba a abajo y a lo largo de todo el recorrido, anotando en cada uno de ellos el punto donde tocaba el suelo. De aquí obtenía una secuencia de posiciones que después podía usar para generar la linea.
Lo malo de esto método es que; 1) Generaba divisiones adicionales e innecesarias. 2) No era fiel al terreno. Se limitaba a ser una aproximación. Para mejorar su fidelidad, tenia que aumentar el numero de subdivisiones. Agravando aun mas el primer problema y sin llegar a conseguir nunca una fidelidad absoluta.Al final llegué a la conclusión que no hay otra, que localizar mas aristas y así saber donde hacer los cortes pertinentes. Ni mas ni menos de los necesarios.Nota: Antes de empezar a explicar, debo aclarar que para simplificar cálculos, siempre he trabajado en un plano 2D [X,Z]. De forma que la altura [Y] es omitida.Lo primero que tengo que hacer, es calcular una secuencia de "puntos" a los que yo he bautizado como LineNodes.
Estos LineNodes almacenan datos importantes como su posición en 3D y tres vectores normalizados. El vector Y será la normal de la superficie. Será usado para añadir desplazamiento vertical a la linea. El vector Z apunta siempre hacia "adelante" en la linea, me permite saber donde apunta la linea y por donde debo seguir buscando el siguiente punto. El vector X es perpendicular a los otros dos vectores, será usado para darle anchura a la linea.
Además de eso almaceno un par de datos que ahora mismo no son relevantes, como la distancia desde el origen y un valor de alpha.Al principio no tenia muy claro como dar con las aristas, hasta que me percaté del que el RaycastHit me devuelve el TriangleId que ha tocado. Con esto, puedo acceder al mesh.triangles del collider para saber cuales son los tres vértices que conforman el triángulo en cuestión. Una vez conocidos los 3 vértices, puedo saber sus posiciones y con ello ya puedo calcular la intersección entre mi linea y las tres aristas que la encierran.
Partiendo de la hipótesis que mi linea empieza dentro del triángulo, es elemental pensar que solo puede salir de este tocando una única arista. Si se diera el caso que no intersecciona con ninguna de ellas, significaría que la linea empieza y acaba dentro el mismo triángulo.Con un simple cálculo de interseccion de sagmentos, puedo saber que arista ha sido cortada por mi linea. Me guardo ese punto. El problema que tiene ese punto, es que al encontrarse literalmente encima de la arísta, no resulta fiable. Dependiendo de como se le apriete al Unity, a veces puede tocar un triángulo u el otro. Por ello, omitiré ese punto en mi resultado final, y en lugar de eso guardarle dos puntos separados. Uno a cada lado de la arista. Genero un par de LineNodes. Uno de ellos sera situado un poquito antes de la intersección y el otro un poco después.Ya por acabar, tengo que coger el triángulo que se encuentra el otro lado de la arista, para repetir la misma operación. Encontrar si TriangleId, anotar los tres vevértices que lo forman y sus posiciones y volver a comprobar si mi linea interesecciona con alguna de sus aristas.Repetir y repetir hasta que llegas al punto que tu linea no intersecciona con ninguna arista. En ese momento significa que ya has llegado al final de la linea.En este punto ya tenemos una secuencia de LineNodes, con sus posiciones y normales, que nos servirán para crear la malla.

Me lo he leído de pe a pa y es muy interesante. Trataré de hacer algo parecido.Por cierto, para que lo usas en el juego? Para trazar un path o delimitar un área?

Las fichas(jugadores) se mueven por las casillas de una cuadrícula hexagonal. Me interesa poder marcar el recorrido trazando lineas de casilla a casilla.

Etiquetas: