Así que estaba pensando en crear un juego en 2D donde también puedas moverte a lo largo del eje Z, cambiando en qué capa estás. Dependiendo de la profundidad, quiero escalar mis sprites 2D.
Una vez, alguien me mostró una demostración en la que tenía muchos sprites 2D, y al desplazarse podía cambiar la profundidad de la cámara. Entonces, al acercar, los objetos se acercarían al jugador y aparecerían más grandes. Luego me pregunté, ¿cuánto más grande debería ser un objeto cuando se acerca 1 unidad más? ¿Cómo calcularías eso? Entonces el tipo me dijo: hay una regla básica que estoy usando: "los objetos dos veces más cercanos, aparecen dos veces más grandes".
Ahora, al probarlo yo mismo, sé que la regla no se aplica en el mundo real;) ¿Pero hay alguna constante que se use en los cálculos del mundo real para la perspectiva o algo así? O una formula?
Sé que este podría no ser el mejor lugar para hacer esa pregunta, pero dado que este es el único sitio que uso para preguntas relacionadas con el juego, y mi contexto es un juego, pensé en intentarlo. Además, estoy esperando que haya una persona aquí que sepa todo sobre las perspectivas y matrices 3D o algo así, ya que podría estar relacionado con juegos 3D;)
tl; dr:
"un objeto dos veces más cerca, aparece dos veces más grande" Eso no es cierto en el mundo real. Pero, ¿qué constante o fórmula es correcta?
fuente
Respuestas:
En general, es cierto, dependiendo de su punto de vista y en qué dirección se ha movido, así como del ángulo de visión.
Observe cómo, en la primera vista de la cámara, dado que el bloque rojo es perpendicular a la vista de la cámara, el objeto parece ser el doble de grande en una proporción perfecta de 1: 2 (tenga en cuenta que la flecha señala que toca el borde de la vista después de moverlo) dos veces más cerca)
El segundo es el mismo bloque de tamaño girado a 45 grados. A medida que se gira, el borde inferior ya no está a la misma distancia de la cámara que el borde superior, por lo que no parece que se ajuste correctamente a una proporción de 1: 2, pero en realidad es el doble de grande (ya que está en el mismo ángulo en el bloque azul más alejado que en el bloque azul cercano).
En conclusión, esto realmente significa que su amigo tenía razón y una relación 1: 1 ("los objetos dos veces más cercanos, aparecen dos veces más grandes") para sus objetos es una buena opción.
fuente
Un objeto dos veces más cerca parece el doble de grande. Es una consecuencia del Teorema de Thales y es cierto en el mundo real.
Se podría argumentar que el Teorema de Thales es la herramienta matemática central detrás de la proyección en perspectiva y lo que se conoce en la tubería de gráficos (OpenGL o DirectX) como división en perspectiva . Es un teorema que definitivamente debes conocer y aprender a reconocer cuándo se puede usar.
fuente
En realidad, eso es bastante cierto (si mueve un objeto dos veces más lejos, parece la mitad de grande), pero oscurece cómo debería cambiar el tamaño visual de los objetos a medida que los espectadores se mueven. Específicamente, los objetos parecen crecer más rápido cuanto más cerca están. Esto se debe a que el espectador cubre la mitad de la distancia mucho más rápido cuando el objeto está cerca, en comparación con cuando el objeto está más lejos. O para decirlo de otra manera, mientras la velocidad del espectador es constante, el valor de "la mitad de la distancia" cambia a medida que cambia la distancia al objeto.
fuente
Dado que en realidad no está trabajando en el espacio 3D, podemos suponer que los sprites nunca giran (la rotación se puede simular con sesgo, etc.) Esta restricción simple hace que sea bastante fácil obtener números algo precisos sobre cuál debería ser el tamaño dependiendo de la distancia de la camara.
Primero, debe comprender cómo se representan los objetos 3D. Aunque una cámara converge a un solo punto, hay un plano invisible que actúa como una pantalla en la que dibujar los objetos. Lo único que necesita saber sobre la pantalla es qué tan lejos está de la cámara.
Aquí hay un diagrama de cómo se representa un objeto en una cámara a dos distancias diferentes.
Como era de esperar, la altura del objeto depende de la distancia desde la cámara. PERO dado que el desgarro se produce en el plano de sacrificio cercano, debemos calcular la altura del sprite en ese punto.
Algunos cálculos básicos de trigonometría lo llevarán a la siguiente fórmula:
EJEMPLO:
Sugeriría comenzar con
v=5
y luego ajustar desde allí según cómo se vea. Puedo juntar un violín que te permite ver los cambios en tiempo real.TL; DR
EDITAR: cuando diga moverse a lo largo del eje z, supongo que querrá una vista en perspectiva (como la mayoría de los juegos 3D; tiradores, etc.) La matemática para calcular el tamaño del objeto en función de la distancia también dependerá de la ubicación en el marco, similar a la visión periférica. En cambio, lo intentaría con mis matemáticas, que es una vista ortográfica (piense en Mario, Angry Birds, Super Smash Bros, etc.). No sé qué aspecto estás tratando de lograr, pero mientras parezca real, ¡los jugadores nunca lo sabrán!
¡MANIFESTACIÓN!
fuente
Esto no estaba cubierto y pensé que podría ser beneficioso: debe tenerse en cuenta cuando se recorre la mitad de la distancia, duplicando el tamaño en las dimensiones X e Y cuadruplicará el área total del sprite. Esto es porque:
Después de hacer zoom en:
Esto puede darle la impresión de que el efecto de zoom ocurre rápidamente o es demasiado intenso. Puede ajustar el factor cambiando 2 en la fórmula anterior a un valor flotante como 1.5 o 1.33 en su lugar.
Alternativamente, lo que he hecho es almacenar la profundidad de la cámara (distancia) a sus mosaicos en un valor de byte junto con la traducción de la cámara (X e Y) y luego calcular el tamaño de mosaico proyectado de esta manera:
Tenga en cuenta que
CameraZ
tiene que estar estrictamente entre 1-255, y que la restricción puede ser un beneficio o una maldición para usted en el futuro.fuente