Noticias

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

Problema de temblor de objetos y textura

Iniciado por ZOOSTAGE, Julio 25, 2017, 07:47:21 PM

Tema anterior - Siguiente tema
Cita de: ZOOSTAGE date=1502448671lightbug lamentablemente no es lo que dices, es por las magnitudes cuanto mas te alejes de la coordenada 0,0,0 menos precisión tiene unity a la hora de medir y posicionar los transform por eso cuanto mas te alejas menos preciso y mas temblores. Hay una técnica que es si necesitas que tu personaje recorra mucha distancia es ir moviendo el mundo al punto 0. Apartir de 10.000 unity ya empieza a no ser preciso en sus medidas y a temblar.
   


Puede ser, claro que cuanto mas te alejas perdes mas precision pero estamos hablando de demasiado...muchisimo, suponiendo claro que tu metro no se translada en 500 unidades, sino ya de movida estas haciendo todo "mal" (entre comillas porque cada cual toma las unidades que quiera). Yo probe poner un modelo pequeño, luego uno grande, alejado muchisimo del centro (como comenté arriba) rote, movi y escale y no tuve el problema que tenes vos, y creeme que intenté tenerlo, si conoces alguna manera de lograr el error decimelo que lo pruebo y te digo a ver que sale.
 
Probaste hacer lo mismo eliminando toda fisica(rigidbodies) del calculo, y escalando o moviendo de la misma manera?

en vez de hacer todo a escala "real", o sea que una unidad de Unity sea 1 metro en la realidad, deberias aprovechar mejor los decimales y escalar todo bastante para no salirse de las 100,000 unidades donde se comienza a perder precision, luego el resto es usar impostores para las cosas lejanas y controlar los eventos alejados con formulas simples en vez de usar las fisicas de Unity... es un mito creer que Unity va a aguantar todo lo que le pongas a cualquier escala en algun momento hay que usar trucos para optimizar

pero la escala da igual a menor escala mas pronunciado por que los float crecen mas, no?

Agosto 11, 2017, 11:39:46 PM #18 Ultima modificación: Agosto 11, 2017, 11:42:29 PM por TheBullet
Tanto @Braltor no estáis entendiendo como funciona este problema de la precisión. Da igual que uses una escala de 500 unidades para un metro como de 0,005 unidades para un metro, da absolutamente igual. Cuanto más reduzcas la escala más precisión necesitaras en tus objetos, por lo tanto en vez de notarlo a los 10.000 (por decir algo) lo notaras a los 100. Si aumentas la escala es lo mismo, como necesitas menos precision tardarás mas en notar las vibraciones. La precisión varia proporcionalmente con la escala.
 
 
 
@lightbug si quieres hacer una prueba crea un gameobject vacio y ponlo en todas las cordenadas a 1.000.000, como hijo crea un cubo y situalo en el centro del escenario (a -1.000.000 a nivel local en las tres cordenadas). Haz un script que mueva el padre lentamente. El cubo debería dar saltos.

Cita de: TheBullet date=1502487586Da igual que uses una escala de 500 unidades para un metro como de 0,005 unidades para un metro, da absolutamente igual
   


Absolutamente igual no, si tenes una precision de tantos bits estas limitado a un cierto numero siempre y cuando te muevas/escales/rotes un valor "fijo", generalemtne asociado a un factor * deltaTime(o el dT que tiene mayor precision), es la naturaleza del punto flotante, si quiero traducir 1.0053 metros no es lo mismo si mi metro = 1 unidad, que si mi metro = 1.1 unidad o 10000 unidades, incluso vos mismo lo decis: "la precision varia proporcionalmente con la escala" lo cual es correcto. Pero entiendo que el problema lo vas a tener a la larga lo cual me parece que te referias a eso (?).
 
Cita de: TheBullet date=1502487586@lightbug si quieres hacer una prueba crea un gameobject vacio y ponlo en todas las cordenadas a 1.000.000, como hijo crea un cubo y situalo en el centro del escenario (a -1.000.000 a nivel local en las tres cordenadas). Haz un script que mueva el padre lentamente. El cubo debería dar saltos.
   


Ok, lo voy a probar y comento el resultado, hice algo asi pero lo movi a mano, quizas ahi falle y no lo observé bien, voy a hacer un mini script que lo mueva muy poquito con un deltaTime de por medio a ver que sale.

¿cómo está este tema, se ha podido solucionar el problema que tiene el autor?

Bueno no se a solucionado pero si se una solución.

¿pero es por causa del código, o es por un tema de Arte, o qué? Leyendo el hilo entero todavía no me queda claro el por qué ocure...

Agosto 12, 2017, 07:41:48 AM #23 Ultima modificación: Agosto 12, 2017, 08:18:18 AM por TheBullet
Cita de: lightbug date=1502503417Absolutamente igual no, si tenes una precision de tantos bits estas limitado a un cierto numero siempre y cuando te muevas/escales/rotes un valor "fijo", generalemtne asociado a un factor * deltaTime(o el dT que tiene mayor precision), es la naturaleza del punto flotante, si quiero traducir 1.0053 metros no es lo mismo si mi metro = 1 unidad, que si mi metro = 1.1 unidad o 10000 unidades, incluso vos mismo lo decis: "la precision varia proporcionalmente con la escala" lo cual es correcto. Pero entiendo que el problema lo vas a tener a la larga lo cual me parece que te referias a eso (?).
   


Si que es absolutamente lo mismo. Si tienes problemas de precision a 100000 y escalas ese mundo reduciendolo 100 veces pasarás a tener el problema de precision a 1000, y si lo escalas 10.000 veces lo tendrás al pasar de 10. 
 
Cada vez que reduces la escala aumentas su necesidad de precisión en la misma medida por lo que en el mundo del juego la perdida de precisión se dara en el mismo punto, independientemente de si este punto se situa en 1000000 o 100 unidades del centro. Es absolutamente proporcional, por lo que escalar el mundo no cambia nada.
 
Cita de: pioj date=1502513475¿pero es por causa del código, o es por un tema de Arte, o qué? Leyendo el hilo entero todavía no me queda claro el por qué ocure...
   


Lo causa la limitación de decimales del float. Cada vez que un float aumenta en una cifra pierde un decimal. Cuando los objetos se alejan mucho del centro del mundo empiezan a temblar y a hacer cosas raras porque su posición es redondeada a cada frame, con lo que van saltando de un sitio a otro. Normalmente un float tiene capacidad para 7 dígitos.
 
Aquí hay más info sobre el float: https://en.wikipedia.org/wiki/Single-precision_floating-point_format?wprov=sfla1

nunca me lo había plantado ese tipo de error, pero tiene su lógica que falle XD, me parece un post interesante ya que siempre eh tenido ganas de hacer un mmo inmenso sin instancias jajajaj
PD: lo que no entiendo es, el error del barril, si el barril es hijo del barco, tendría que fallar solo el barco porque el barril esta en posición del padre por lo tanto tendrían que temblar a la par no?

Cita de: ZOOSTAGE date=1501066957Si es una solución el crear una estructura doble y transformar eso en las cordenadas e ir moviendo el mundo y su contenido.
   


la verdad, creo que es la única opción, a no ser que alguien sepa como editar unity para que calcule la posición con un double o algo incluso mas grande xD
 
de todas formas, creo que si el mundo que vas a mover es enorme también tendría fallos de posición.
 
si tienes un mundo enorme que sobre pasa los límites de float, la posición de esos objetos se va a redondear.
 
cuando acerques el mundo al centro la posición será la redondeada porque la posición "original" se perdió al redondear. 
 
(es todo teórico no eh testeado nada) 

Bueno la única forma que veo como una solución es generar un mundo procedural entorno a la coordenada 0 0 0 e ir generando proceduralmente.

Cita de: ZOOSTAGE date=1502548109Bueno la única forma que veo como una solución es generar un mundo procedural entorno a la coordenada 0 0 0 e ir generando proceduralmente.
   


generas proceduralmente cosas que son estaticas en el entorno, pero si no buscas una manera de reducir la geometria a "grandes" distancias donde falla la precision el motor de fisicas va a seguir sobrecargado... quieres reiniciar todo a 0 0 0, eso va a hacer que la escena de fisicas se reconstruya todo el tiempo volviendo peor la situacion...
 
es mejor aprovechar la precision del float, limitar la distancia de simulacion, y falsear el desplazamiento en el mundo con "trucos de camara"

Cita de: Braltor date=1502551226generas proceduralmente cosas que son estaticas en el entorno, pero si no buscas una manera de reducir la geometria a "grandes" distancias donde falla la precision el motor de fisicas va a seguir sobrecargado... quieres reiniciar todo a 0 0 0, eso va a hacer que la escena de fisicas se reconstruya todo el tiempo volviendo peor la situacion...
   
   
      es mejor aprovechar la precision del float, limitar la distancia de simulacion, y falsear el desplazamiento en el mundo con "trucos de camara"
   


se me a ocurrido una forma mejor, mientras estaba en la playa tomando birras XD, no se si será una locura, seguramente sí..
 
voy a dibujarlo jajajja

aqui está mi fumada mental, voy medio taja pero creo que se puede hacer
 

Etiquetas: