¿Un objeto dos veces más cercano aparece dos veces más grande?


16

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?


3
No tengo idea de cuál es la respuesta, pero sé cómo podría averiguarlo. Toma algunas fotos de algo. Quizás un pedazo de papel. Tómelos de diferentes distancias conocidas y luego haga algunos cálculos matemáticos para calcular la cantidad de imagen que ocupa el trozo de papel y determine la proporción. ¡Podría ser un experimento divertido!
SpartanDonut

Me pregunto por qué nadie ha mencionado nada sobre logaritmos naturales ...
Chad Harrison

44
¿Por qué no es verdad? Yo pienso que es verdad.
Ivan Kuckir

@hydroparadise ¿Qué tienen que ver los logaritmos naturales con esta pregunta?
Nathan Reed

Solo estoy siendo pedante aquí, lo sé, pero "Dos veces más cerca" es una frase extraña. ¿No debería ser "la mitad de tan lejos"? 'Dos veces' es más grande, pero si algo se acerca, la distancia se reduce.
MrVimes

Respuestas:


19

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.

Ejemplo de perspectivas para objetos.

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.



¡Gran respuesta! Las imágenes definitivamente lo hacen más claro. En realidad me siento realmente estúpido ahora, ya que intenté esto antes de publicar la pregunta sosteniendo mi mano frente a mi cara y acercándola. Y luego pensé: no, no parece el doble de grande ... Debería haberlo medido con mayor precisión;) ¡La perspectiva es algo curioso! Además, creo que debería haber sido capaz de crear las imágenes yo mismo;) ¡Pero una gran respuesta! ¡Gracias!
Berry

@Mason Wheeler - Ordenado: P
Tom 'Blue' Piddock

8

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.


Grandes referencias! Definitivamente comprobaré el Teorema de Thales y trataré de entender mejor la tubería gráfica.
Berry

7

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.


2

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:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

EJEMPLO:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

Sugeriría comenzar con v=5y 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

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

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!


Sí, en realidad estoy apuntando a una vista ortográfica. El juego del que estoy "tomando prestado" mi inspiración actual es Rayman Origins. En algunas secciones del juego puedes saltar sobre flores, y luego rebotarás en otra capa con una profundidad diferente. Luego, la cámara se acerca o aleja de la cámara a esa profundidad. Los ejemplos se pueden ver en este video , a las 4:50 y a las 5:00.
Berry

Además, ¡gran respuesta! Pero como solo una confirmación de que se aplica la regla "dos veces más cerca, dos veces más grande" hubiera sido suficiente, elegí la respuesta de Blue como la mejor.
Berry

¡Gracias y mucha suerte con tu juego! Pero sí quiero aclararles a los demás que "el doble de cerca, el doble de grande" funcionará muy bien si todo está muy cerca de la cámara. A medida que las cosas se alejan, el cambio percibido en el tamaño se reduce. Por ejemplo, mira tu pulgar de cerca, luego extiende tu brazo y míralo. El tamaño de su pulgar parece drásticamente más pequeño. Después de eso, mira algo lejano. Da un paso hacia atrás (casi lo mismo que la longitud del brazo). ¿Ves cómo el tamaño apenas cambió? Si un juego tiene un largo campo de visión, usar un poco de matemática será de gran ayuda.
Jim Buck

EDITAR: cometí un error en mi comentario anterior. "El doble de cerca, el doble de grande" es correcto cuando los elementos permanecen bastante cerca uno del otro con respecto a su distancia de la cámara.
Jim Buck

Aquí hay una demostración rápida que preparé, use el mouse para mover y la rueda de desplazamiento para cambiar la profundidad.
Jim Buck

0

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:

Area = X * Y

Después de hacer zoom en:

NewArea = (x*2) * (y*2)

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:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

Tenga en cuenta que CameraZtiene que estar estrictamente entre 1-255, y que la restricción puede ser un beneficio o una maldición para usted en el futuro.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.