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
Genial! estas mucho mas avanzado que yo, yo acabo de hacer una función de "noise" tipo prototipo para ir programando el LOD sobre eso y después me voy a ocupar de afinarla bien para que genere cosas interesantes.
 
Acá está mi esfera ruidosa! :)
 

Tengo un problema con la iluminacion y los Mesh, cuando hago el LOD, obviamente tengo que generar Mesh con más resolución de cuadriculas y eso me esta dando dos problemas, aunque por ahora solo quiero abordar el que creo es más sencillo de solucionar, el tema de la iluminación me queda bastante extraño mostrando iluminaciones raras en las zonas donde los Mesh se unen
 

 
¿Como puedo solucionar este problema?
 
Estuve leyendo y dicen que después de mani***r los vertices (cuando aplico el noise y armo la malla con más resolucion) tengo que ejecutar RecalculateNormals(); que es exactamente lo que yo estoy haciendo pero aún asi el fenomeno sigue apareciendo.


¿Alguna idea?

Mayo 29, 2018, 11:44:21 AM #32 Ultima modificación: Mayo 29, 2018, 11:47:33 AM por Igor
pues te he estado diciendo en los post de antes... que yo lo he solucionado poniendo una fila extra.... superpuestas, solapadas, y dobladas.... con esto arreglas las "normals" y rellenas algun hueco que se crea entre las piezas de diferente "tamaño/resolucion"...

Cita de: Jeko37 date=1527558099¿Alguna idea?
   


Quizás los vértices entre mesh y mesh deberían estar "weldeados", me perdí un poco y no se porque son diferentes mesh (quizás por el LOD) pero si son distintos vértices y están en la misma posición eso no te asegura que te vaya a quedar lindo como querés y quizás sea la razón de lo que te pasa...quizás. Es decir vas a tener que tener un solo vértice que las una, osea no existirían varias mesh juntas sino una sola, el LOD debería afectar a toda una gran mesh, igual que pasa con un terrain.

Cita de: Igor date=1527587061pues te he estado diciendo en los post de antes... que yo lo he solucionado poniendo una fila extra.... superpuestas, solapadas, y dobladas.... con esto arreglas las "normals" y rellenas algun hueco que se crea entre las piezas de diferente "tamaño/resolucion"...
   


Habia entendido otra cosa con lo del post anterior, ahora entiendo perfectamente xD de todas maneras creo que debe haber una solución para este problema que no implique superponer los mesh, si tengo que hacerlo lo voy a hacer pero quiero explorar antes otras alternativas.
 
Cita de: lightbug date=1527593500Quizás los vértices entre mesh y mesh deberían estar "weldeados", me perdí un poco y no se porque son diferentes mesh (quizás por el LOD) pero si son distintos vértices y están en la misma posición eso no te asegura que te vaya a quedar lindo como querés y quizás sea la razón de lo que te pasa...quizás. Es decir vas a tener que tener un solo vértice que las una, osea no existirían varias mesh juntas sino una sola, el LOD debería afectar a toda una gran mesh, igual que pasa con un terrain.
   


Es posible que si, que tenga que weldear los mesh, yo actualmente lo que hago es ocultar el mesh de mayor resolución con enabled = false y luego crear 9 submeshes de mayor resolucion que ocupan el mismo espacio del mesh que oculte. O sea que yo tendria que unir los submeshes de diferentes resoluciones en un unico mesh.

la solucion buena es muy compleja... cada pieza tiene que saber que piezas tiene a los lados... y dependiendo de si son "mayor" o "menor" tendrias que adaptar los bordes...
 

 
fijate en esta imagen de ejemplo.
 
en la izquierda, los vertices conflictivos (marcados con estrellitas)
 
en la derecha, borde de la pieza adaptado
 
esta solucion es mas compleja de implementar...
 
...y para que el sombreado (las "normals") sea "continuo" tendrias que acceder a las piezas vecinas para ver las normales de los siguentes vertices... para poder calcular las normals de los bordes corretamente... que tambien tiene su historia... 
 
con la solucion (chapuzera) de superponer o solapar una fila extra solucionas las dos cosas, la iluminacion(normals) y los huecos que se generan por las diferentes alturas que tienen los vertices con estrellitas de la imagen... porque esos vertices con estrellita no existen en las piezas vecinas...

Si, la verdad parece algo muy complejo y que llevaria demasiado tiempo, igual si lo hiciera todavia me quedaria el problema de medir las distancias de los meshen con menos LOD para ir ajustando la resolucion, es decir si solo tengo un mesh weldeado, como hago para saber cuando subir la resolucion del mesh? hoy lo estoy haciendo midiendo la distancia de la camara con respecto a la ubicacion de los meshes. En fin, un bajon que se empiece a complicar asi.

Cita de: lightbug date=1527593500Quizás los vértices entre mesh y mesh deberían estar "weldeados", me perdí un poco y no se porque son diferentes mesh (quizás por el LOD) pero si son distintos vértices y están en la misma posición eso no te asegura que te vaya a quedar lindo como querés y quizás sea la razón de lo que te pasa...quizás. Es decir vas a tener que tener un solo vértice que las una, osea no existirían varias mesh juntas sino una sola, el LOD debería afectar a toda una gran mesh, igual que pasa con un terrain.
   


es eso que dices... al ser diferentes "mesh" la union no va a quedar "linda"... tienes que acceder a los "mesh" vecinos y ver como tienen los vertices siguientes a la union para poder calcular las "normals" para que quede lindo...  y es un poco lio... sobretodo si no sabes la numeracion de tus vertices... ni que "mesh" tienen a cada lado... 
 
asi que les puse la fila extra para solucionarlo... 
 
Cita de: lightbug date=1527593500...osea no existirían varias mesh juntas sino una sola, el LOD debería afectar a toda una gran mesh, igual que pasa con un terrain.
   


los terrain si que puedes tener varios unos junto a otros (en cuadricula) y si te fijas tienen variables public para que le asignes cada uno de los vecinos (neighbour) (norte, sur, este y oeste) ... y el mismo sistema de terrenos de unity se encarga de calcular las correctas normals de las uniones para que el sombreado quede continuo... 
 
es una pena no poder ver el codigo de los terrenos de unity, eso nos ayudaria, porque los terrenos de unity hacen el LOD como en la imagen que he mandado... que es la solucion correcta... 
 
 
 
lo de medir las distancias parece complejo, pero es mas facil de lo que parece... primero las subdibisiones tienen que ser hijas de la pieza anterior... y asi todo el rato... osea tengo uno de los 6 lados de la esphera, lo subdibido, y a esas subdibisiones les digo que su padre es el que las ha subdibidido... y ese padre lo "apago"  si estas mas cerca de una distancia, esas subdibisiones las subdibido y las hago hijas otra vez... y apago las padre, ....y si te alejas apago las hijas y enciendo el padre...   mas o menos... porque hay que comprobar si tiene hijos antes de subdibidirlo, si no tiene hijos pues subdibides y apagas el padre,  si SI tiene hijos (porque ya los has creado antes al acercarte a esa zona..) ...pues simplemente los enciendes y apagas el padre...

Cita de: Igor date=1527604816lo de medir las distancias parece complejo, pero es mas facil de lo que parece... primero las subdibisiones tienen que ser hijas de la pieza anterior... y asi todo el rato... osea tengo uno de los 6 lados de la esphera, lo subdibido, y a esas subdibisiones les digo que su padre es el que las ha subdibidido... y ese padre lo "apago"  si estas mas cerca de una distancia, esas subdibisiones las subdibido y las hago hijas otra vez... y apago las padre, ....y si te alejas apago las hijas y enciendo el padre...   mas o menos... porque hay que comprobar si tiene hijos antes de subdibidirlo, si no tiene hijos pues subdibides y apagas el padre,  si SI tiene hijos (porque ya los has creado antes al acercarte a esa zona..) ...pues simplemente los enciendes y apagas el padre...
   


Eso es justamente lo que estoy haciendo ahora, decia que es dificil medir cuando no hay diferentes mesh sino uno solo todo calculado con sus nuevas cuadriculas weldeadas, porque ahi ya no habrian mesh hijos de otros meshes.


Supongamos que teoricamente tengo localizados dos vertices vecinos que comparten la misma ubicación pero aún asi pasa lo que les mostré en la imagen, como tendria que calcular las normales para que quede bien? que calculo deberia realizar exactamente?

https://docs.unity3d.com/Manual/ComputingNormalPerpendicularVector.html
 
ahi explican lo sencillo que es calcular una normal de un vertice en un triangulo... 
 
 
 
en tu caso tendrias que buscar todos los triangulos que "usan" ese vertice en tu mesh, y en el mesh vecino, sumas todos y le haces "Normalize()"... lo dificil es buscar los triagulos del vecino...

Cita de: Igor date=1527604816los terrain si que puedes tener varios unos junto a otros (en cuadricula) y si te fijas tienen variables public para que le asignes cada uno de los vecinos (neighbour) (norte, sur, este y oeste) ... y el mismo sistema de terrenos de unity se encarga de calcular las correctas normals de las uniones para que el sombreado quede continuo... 
   
   
      es una pena no poder ver el codigo de los terrenos de unity, eso nos ayudaria, porque los terrenos de unity hacen el LOD como en la imagen que he mandado... que es la solucion correcta..
   

Cita de: Jeko37 date=1527600358Es posible que si, que tenga que weldear los mesh, yo actualmente lo que hago es ocultar el mesh de mayor resolución con enabled = false y luego crear 9 submeshes de mayor resolucion que ocupan el mismo espacio del mesh que oculte. O sea que yo tendria que unir los submeshes de diferentes resoluciones en un unico mesh.
   


Si, a lo que iba es que no es necesario encarar el problema con distintas meshes y adaptar el borde (lo crítico del asunto) , sino tener una gran mesh y dar detalle a la zona de interés, esto te da mucha más versatilidad ya que podés tener un detalle "que se mueve" con la cámara por ej (o no, como en este caso) y no tener dar detalle a la mesh X que está cerca, con los problemas que eso trae (lo que está pasando ahora).
 
El algoritmo funcionaría exactamente como un "adaptative tesselation". Es una técnica que hace tiempo que se ve mucho sobretodo en terrains, esas demo de outerra, voxel terrains y demás, un ej:
 


   
eature=oembed" width="480">

 
otro ej :
 


   
eature=oembed" width="480">

 
Con lo de las filas extras tenés que tener info de los vertices compartidos y de los vertices que le siguen a ambos lados ya que querés que la transición sea suave para formar al vector normal, identico a las tangentes de las curvas de animación, para que se entienda, es como decís @Igor pude ser alto quilombo esto ya que necesitas info de la de al lado (con suerte si toca un solo vecino y no tres en una punta). Acá además no podés hacer magia con un shader (Ej decirle que interpole normales) ya que son objetos diferentes (diferentes meshes, diferentes materiales)... Además que teniendo más y más meshes estás introduciendo un "overhead" ya que metés info de más innecesaria (nuevo gameObject, nuevas instancias de materiales, nuevos meshrenderers, nuevos meshFilters, etc) quizás con 10,100 o 1000 no se note pero es medible sin dudas a la larga.
 
muy lindo el tema este, cuando tengan algo más o menos suban una demo pa la gilada que lo testeamos

Cita de: lightbug date=1527621263Si, a lo que iba es que no es necesario encarar el problema con distintas meshes y adaptar el borde (lo crítico del asunto) , sino tener una gran mesh y dar detalle a la zona de interés, esto te da mucha más versatilidad ya que podés tener un detalle "que se mueve" con la cámara por ej (o no, como en este caso) y no tener dar detalle a la mesh X que está cerca, con los problemas que eso trae (lo que está pasando ahora).
   
   
      El algoritmo funcionaría exactamente como un "adaptative tesselation". Es una técnica que hace tiempo que se ve mucho sobretodo en terrains, esas demo de outerra, voxel terrains y demás
   


probe varios shaders de tessellation y no funcionan en mi PC... o igual es que estoy haciendo algo mal...
 
este sistema que estamos usando tiene ese problema que dices... al final puedes acabar teniendo demasiados objetos... pense en borrar las piezas que no se usan... pero entonces tendria que estar creando todo el rato... asi que decidi que se quedasen desactivadas para no tener que crearlas de nuevo... pero al final igual es mejor borrarlas.... nose...
 
bueno:
 
planet.zip
 
ahi teneis una "demo" por si quereis probar... 
 
esta muy "en pañales" todabia... tengo que mejorar mil cosas... ajustar las distancias a las que se cambian las piezas... arreglar un "errorcillo" que tengo en el metodo de la fila extra... porque empujo los vertices finales hacia abajo pero siempre la misma distancia... indepemdientemente del tamaño de la pieza... y en piezas grandes se sigue apreciando un poco de "z-fighting" de ese... me acabo de fijar... jeje... ya lo arreglare... y tengo que mejorar el mar, la atmosfera, las nubes... meter unas texturas mejores, que las actuales son solo de 512... y mil cosas mas...

No te preocupes que cuando tenga el planeta listo voy a subir el codigo a github para todos, pero me gustaria tener algo bien hecho para eso. La verdad si soluciono los dos problemas que actualmente tengo, el tema de las uniones en los mesh, y arreglar los vertices en las uniones con mesh de menor resolucion, podria empezar a limpiar codigo y crear rutinas que eliminen mesh viejas (podria guardar en memoria los parametros para su creacion cuando sean necesarias, eso tendria el problema del reprocesamiento del mesh, pero no ocupariamos tanta memoria).
 
Si la verdad es un lindo desafio, en este momento estoy trabado pero seguramente lo terminare solucionando.

te quedo muy bueno @Igor , esto se produce por las filas inventadas esas?
 

 

 
 

Cita de: lightbug date=1527715317te quedo muy bueno @Igor , esto se produce por las filas inventadas esas?
   
   
      
   
   
      
   
   
       
   


si, asi es, los planos tiene una fila extra de poligonos por cada lado... estas filas son dobladas hacia abajo despues de calcular las "normals"... 
 
tengo que poner que se bajen esos vertices en proporcion al tamaño... ahora se bajan una cantidad fija... y para las piezas pequeñas queda muy bajado... y para las piezas grandes queda muy poco bajado... en las muy grandes a veces se ponen tan "planos" que se superponen unos con otros y queda feo... y en las muy pequeñas pasa eso que se ve en las imagene... cuando lo ponga en proporcion al tamaño quedara un poco mejor la union en las piezas muy grandes... (cuando estas muy lejos)
 
 
 
...aunque en realidad estoy dibujando un monton mas de triangulos para arreglar el problema de las uniones...

Etiquetas: