tgc-utn / tgc-viewer

Framework de renderizado 3D (académico)
http://tgc-utn.github.io/
MIT License
18 stars 14 forks source link

TCG.Examples - Tutorial 1 #106

Closed AntonioDLC closed 6 years ago

AntonioDLC commented 6 years ago

Buenas, el mini bug del Tutorial 1 por el cual la caja sale volando cuando se minimiza una ventana tiene una solución muy fácil: Primero guardar la posición original del box3 en un vector (box3OriginalPos le puse yo). Luego en el método Update cambiar el código del if por: if (FastMath.Abs(box3.Position.Y) > 3f) { currentMoveDir = -System.Math.Sign(box3.Position.Y); box3.Move(0, (box3OriginalPos.Y - box3.Position.Y) - currentMoveDir*3f,0); }

Listo, si la caja se pasa de los ±3f es movida de vuelta a la posición más cercana en el rango. O sea, si se pasa hasta el 4f se la mueve a 3f y si se va debajo del -3f se la mueve al 3f. Además la dirección de movimiento es el vector que va del centro de la caja hasta su posición original normalizado (lo simplifiqué para este caso particular obteniendo el signo del componente Y, pero en realidad es eso).

AntonioDLC commented 6 years ago

El problema ocurría porque en el if original solo se hacía: currentMoveDir *=-1;

Es decir, cuando la caja estaba fuera del rango se cambiaba la dirección. Entonces al minimizar, la máquina no procesa igual de rápido, el ElapsedTime crece enormemente, la caja se mueve muy por fuera del rango, y entonces cuando se vuelve a abrir la ventana cada loop su dirección es invertida, haciendo que se mantenga en el mismo lugar (donde sea que haya quedado después del Move con ElapsedTime).

rejurime commented 6 years ago

El problema no esta necesariamente del todo donde lo marcas, sino en poder detectar cuando el Elapsed time no es útil, ya que por tema de como esta implementado el Render y el Update cuando TGC.Viewer pierde el foco deja de ejecutar el Render Loop para ahorra consumo (Es un if que podes encontrar en la ventana principal). Entonces a la vuelta se acumula mucho tiempo que debería descartarse. Esto pasa en casi todos los ejemplos que están implementados ya que el ejemplo en si hace hincapié en alguna técnica o concepto a explicar y no en todos los posibles casos.

Si bien esto lo podría directamente detectar TGC se opto por estos problema típicos dejárselo a ustedes atacarlos, pero siempre estamos abiertos a sugerencias.

rejurime commented 6 years ago

Esto también pasa en TGC.Group ya que utiliza la misma lógica, ahí ustedes pueden cambiarla a gusto :wink:

AntonioDLC commented 6 years ago

Ah ok cool!