Noticias

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

Generar aleatoriamente un planeta

Iniciado por Jeko37, Mayo 22, 2018, 04:37:56 PM

Tema anterior - Siguiente tema
Con el tema de la matemática tengo a un matemático amigo que va a ayudar si fuera necesario. Obviamente son muchos problemas a sortear pero hay que ir resolviendolos uno por uno. Por ahora mi objetivo es simple, generar un planeta, con ruido generar un terreno que se asemeje a algo natural y nada mas, a partir de ahi iré avanzando.


Acá hay un código interesante aunque no tuve tiempo de probarlo pero creo que seria un buen punto de partida

https://github.com/Tiggilyboo/UnityQuadTreePlanet

Bueno, por las cosas que estuve leyendo los primeros pasos para empezar a crear un planeta procedural seria:


1 - Crear un cubo

2 - Subdividir sus caras en una malla de teselas (cuadrados)

3 - deformar los vértices de las seis caras del cubo para "esferizar" las mallas

4 - Según la cámara este más lejos o más cerca de la superficie de la malla dividir los cuadros para aumentar la definición del área visible

5 - Escribir una funcion de noise que genera un mapa de alturas sobre la malla para formar los paisajes

6 - Texturizar
 
La creación del cubo y la esferización de sus caras lo pude hacer hoy a la tarde.
 

Mayo 24, 2018, 12:10:51 PM #17 Ultima modificación: Mayo 24, 2018, 12:12:44 PM por Igor
mirate este documento:
 
https://catlikecoding.com/unity/tutorials/cube-sphere/
 
explica como "arreglar"....  como hacer que todos los lados sean igual de grandes... porque si te fijas salen mas juntos los poligonos de los bordes.... 
 
con este pequeño script quedan ya "igualados"....
 

private void SetVertex (int i, int x, int y, int z) {
   Vector3 v = new Vector3(x, y, z) * 2f / gridSize - Vector3.one;
   float x2 = v.x * v.x;
   float y2 = v.y * v.y;
   float z2 = v.z * v.z;
   Vector3 s;
   s.x = v.x * Mathf.Sqrt(1f - y2 / 2f - z2 / 2f + y2 * z2 / 3f);
   s.y = v.y * Mathf.Sqrt(1f - x2 / 2f - z2 / 2f + x2 * z2 / 3f);
   s.z = v.z * Mathf.Sqrt(1f - x2 / 2f - y2 / 2f + x2 * y2 / 3f);
   normals = s;
   vertices = normals * radius;
   cubeUV = new Color32((byte)x, (byte)y, (byte)z, 0);
}

 
 

Interesante! ayer conseguí que según la distancia de la cámara a la superficie de la malla, esta se subdivida en cuadriculas más pequeñas por sectores, lo cual es un buen avance, aunque los resultados todavía no me convencen, voy a frenar con eso para aplicar lo que dice ese documento para suavizar esos bordes entre las mallas con el script que me pasaste.


Gracias!

Cita de: Jeko37 date=1527170888Interesante! ayer conseguí que según la distancia de la cámara a la superficie de la malla, esta se subdivida en cuadriculas más pequeñas por sectores, lo cual es un buen avance, aunque los resultados todavía no me convencen, voy a frenar con eso para aplicar lo que dice ese documento para suavizar esos bordes entre las mallas con el script que me pasaste.


      Gracias!
   


tené en cuenta que todo procesado de voxels, geometrias y cosas así generalmente se hacen en GPU ya que las entradas (vertices) son independientes unos de otros, si por ej realizás calculos de que involucren muchos planetas, distancias, LODs, etc (proyectando un poco a futuro tu proyecto), pero los hacés en un script(C#) estas usando directamente el CPu para todo, que no digo que para cosas simples como la esfera funcione, pero cuando todo se complique vas a tener que dar un Reset y pasar al GPU. Lo recomendable para esto es usar o shaders para tal tarea (como un tesselation por niveles, muy común esto) o simplemente un geometryShader como pusieron antes para cualquier cosa que quieras y se te ocurra (mas de propósito general).

Cita de: lightbug date=1527171313... pero cuando todo se complique vas a tener que dar un Reset y pasar al GPU. Lo recomendable para esto es usar o shaders para tal tarea (como un tesselation por niveles, muy común esto) 
   


tessellation not working in my computer 

Mayo 25, 2018, 04:03:52 AM #21 Ultima modificación: Mayo 25, 2018, 04:04:01 AM por lightbug
Cita de: Igor date=1527193900tessellation not working in my computer 
   


olvidate, en la mia tampoco  el gpu batalla, pero a veces no le da pa tanto.

bueno... he hecho avances en uno de esos proyectos
 

 

 

 

 

 

 
 
 
union entre "chunks" solucionada inclinando los ultimos poligonos (poligonos extra "superpuestos"), los del borde de cada "pieza" despues del calculo de "normals"...
 
texturizado hecho con un shader "splat" de 4 canales, + 4 canales bump, + specular, + rim.
 
el ruido lo he hecho al final mezclando perlin con voronoi.
 
 
 
me falta hacer alguna cosilla... que el "tiling" de las texturas se adapte a la "escala" de la pieza...  ...meter la atmosfera y el mar... pero eso es facil...
 
y faltaria el tema de la precision y eso... 
 
...y luego ya vere para que lo uso...

se va viendo bastante bien!
 
Cita de: Igor date=1527262463...y luego ya vere para que lo uso...
   


x q no lo pones en github para q otros te contribuyan?
 
130k triangulos... necesitas implementar algun LOD para q sea utilizable en juegos

Mayo 25, 2018, 07:16:52 PM #24 Ultima modificación: Mayo 25, 2018, 07:18:23 PM por Igor
Cita de: Braltor date=1527266236se va viendo bastante bien!
   
   
      x q no lo pones en github para q otros te contribuyan?
   
   
      130k triangulos... necesitas implementar algun LOD para q sea utilizable en juegos
   


si, tengo que ajustar la distancia y el maximo de subdivisiones del lod.... y un monton de cosas mas.... igual estoy pensando en cambiar las "piezas", planos 18*18 (16*16 + una fila extra de borde)  ...por otros que sean 14*14 (12*12 + fila extra) ...igual incluso 10*10 (8*8 + 1fila extra)....
 
el planeta minimo ahora mismo serian 6 planos de 18*18 (16*16)...
 
y le he puesto que haga hasta 8 veces la subdibision... o baje a 7 creo... con lo cual al final si que hay un montonazo de poligonos... 
 
pero igual simplemente poniendo otro plano con menos poligonos bajaria el "poliCount"... pero hay que hacerlo el plano un poco especialito.... tiene que ser un modelo (plano) que mida 2*2 (desde 1,0,1 hasta -1,0,-1) ....menos la ultima fila, la de los bordes (la extra), que tiene que esta "fuera de los limites" para que se superpongan (se solapen, "z-fight" creo que se llamaba) ...luego esos son los bordes que "doblamos"... 
 
lo del "Lod" ...se supone que es lo que hace... cada plano 18*18 se divide en cuatro planos 18*18,  ...la subdibision ese hace en funcion a la distancia... osea, mas cerca hay mas poligonos, y mas lejos hay menos... 
 
pero creo que lo he hecho demasiado progresivo y lejos sigue habiendo mas de los que deveria...
 
ajustare unas cuantas cosas... y limpiare cosas que sobran... 
 
cuando este mas avanzado y limpio quizas lo comparta

Muy bueno tu resultado, te voy a pedir ayuda cuando llegue la hora de texturizar mi planeta xD, yo me quede con mi esfera y ahora estoy empezando a programar el LOD, una vez que eso este ajustado pienso hacer una clase que implemente el noise para generar los terrenos y recien por ultimo el texturizado, la atmosfera, la generacion de vegetacion, etc.


Ya tengo un poco avanzado el LOD pero todavía estoy ajustándolo para que funcione como yo quiero, aca dejo una imagen:
 

 
Espero que una vez hecho esto la implementacion de la función de noise no genere problemas entre las diferentes mallas.

Cita de: Jeko37 date=1527315889Espero que una vez hecho esto la implementacion de la función de noise no genere problemas entre las diferentes mallas
   


Muy bueno te esta quedando, supongo que el LOD se lo vas a tener que aplicar a la version ruidosa y no aplicar el ruido a la version LODeada... no?

Cita de: Jeko37 date=1527315889Espero que una vez hecho esto la implementacion de la función de noise no genere problemas entre las diferentes mallas.
   


tal como lo tienes te va a pasar el mismo problema que a mi... las uniones entre planos de diferente "LOD"... yo lo solucione haciendo un plano "especial" (ya lo he explicado antes) ... y el la parte del codigo donde generas las "mallas", al final del todo, despues de aplicar el ruido, las normals, y la textura... entonces "bajo" un poco los ultimos vertices (tienes que saber que vertices son los de los bordes, y simplemente restarles su "normal" eso hara que esten mas "abajo")
 
mi "malla":
 

 
se puede apreciar en los bordes de cada pieza los poligonos extra solapados (y doblados, "bajados")
 
 
 
detalle de la union con fila extra:
 

 
 

Estuve documentandome sobre el problema y efectivamente si, el noise lo tengo que aplicar primero sobre la esfera sin ningun noise aplicado y sobre esa esfera con noise ir haciendo el LOD, la solución tuya de restar la malla de menor resolucion para poner encima la de mayor resolucion no me parece una solución muy elegante, estarias procesando vértices de la malla oculta de forma innecesaria, lo ideal seria ir eliminando las que ya no uses, por otro lado la forma en la que aplicas el LOD esta buenisimo, te quedó mucho mejor que a mi, voya  dejar el lod de lado y concentrarme en el noise, lo voy a retomar una vez tenga el planeta formado.
 
Consulta: a alguien más le pasa que cuando quiere iniciar sesión le rebota la contraseña? cada vez que entro a publicar tengo que resetear la contraseña porque me aparece como invalida.

Cita de: Jeko37 date=1527374033Consulta: a alguien más le pasa que cuando quiere iniciar sesión le rebota la contraseña? cada vez que entro a publicar tengo que resetear la contraseña porque me aparece como invalida.
   


si intentas entrar en el foro con el correo suele dar problemas...
 
es mejor entrar con el nombre de usuario
 
y si, se que no es una solucion elegante... pero llevaba tiempo atascado ahi... y queria avanzar un poco... asi que de momento voy a usar esa solucion...
 
ya le he añadido agua, atmosfera, y nubes... todo un poco provisional y mejorable... ahora estoy mirando a ver como pongo arboles...

Etiquetas: