Um objeto duas vezes mais próximo parece duas vezes maior?


16

Então, eu estava pensando em criar um jogo 2D onde você também pode se mover ao longo do eixo Z, mudando em qual camada você está. Dependendo da profundidade, quero escalar meus sprites 2D.

Certa vez, alguém me mostrou uma demonstração em que ele tinha muitos sprites em 2D, e rolando ele podia mudar a profundidade da câmera. Portanto, ao aumentar o zoom, os objetos se aproximam do player e parecem maiores. Então eu me perguntava, qual o tamanho de um objeto quando ele se aproxima de uma unidade. Como você calcularia isso? Então o cara me disse: Existe uma regra básica que estou usando: "objetos duas vezes mais próximos, parecem duas vezes maiores".

Agora, testando-o eu mesmo, sei que essa regra não se aplica ao mundo real;) Mas há alguma constante usada nos cálculos do mundo real para perspectiva ou algo assim? Ou uma fórmula?

Sei que esse talvez não seja o melhor lugar para fazer essa pergunta, mas como esse é o único site usado para perguntas relacionadas a jogos e meu contexto é um jogo, pensei em tentar. Além disso, estou esperando que haja uma pessoa aqui que saiba tudo sobre perspectivas e matrizes 3D ou algo assim, pois isso pode estar relacionado a jogos em 3D;)

tl; dr:

"um objeto duas vezes mais próximo, parece duas vezes maior" Isso não é verdade no mundo real. Mas qual constante ou fórmula está correta?


3
Não tenho idéia de qual é a resposta, mas sei como descobrir. Tire algumas fotos de alguma coisa. Talvez um pedaço de papel. Leve-os de diferentes distâncias conhecidas e faça algumas contas para calcular quanto da imagem é capturada pelo pedaço de papel e determinar a proporção por isso. Pode ser um experimento divertido!
SpartanDonut

Eu estou querendo saber por que ninguém mencionou nada sobre logaritmos naturais ...
Chad Harrison

4
Por que isso não é verdade? Eu acho que é verdade.
Ivan Kuckir

@hydroparadise O que os logaritmos naturais têm a ver com essa pergunta?
Nathan Reed

Eu só estou sendo pedante aqui, eu sei, mas "Duas vezes mais perto" é uma frase estranha. Não deveria ser "a metade do tempo"? 'Duas vezes' é maior, mas se algo se aproxima, então a distância fica menor.
MrVimes 16/03

Respostas:


19

Geralmente é verdade, dependendo do seu ponto de vista e em qual direção ele se moveu, bem como o ângulo de visão.

Exemplo de perspectivas para objetos

Observe como na primeira visualização da câmera, como o bloco Vermelho é perpendicular à visualização da câmera, o objeto parece ter o dobro do tamanho em uma proporção perfeita de 1: 2 (observe a seta apontando que atinge a borda da visualização após ser movida duas vezes mais perto)

O segundo é o mesmo tamanho de bloco girado a 45 graus. À medida que é girada, a borda inferior não está mais à mesma distância da câmera que a borda superior; portanto, ela NÃO parece corretamente dimensionada para uma proporção de 1: 2, mas, na realidade, é duas vezes maior (como em o mesmo ângulo no bloco azul mais distante do bloco azul próximo.)

Concluindo, isso significa que seu amigo estava correto e uma proporção de 1: 1 ("objetos duas vezes mais próximos, parecem duas vezes maiores".) Para seus objetos é uma boa escolha.



Ótima resposta! As imagens definitivamente tornam mais claras. Na verdade, me sinto muito estúpido agora, já que tentei isso antes de postar a pergunta, segurando minha mão na frente do rosto e aproximando-a. E então pensei: não, não parece duas vezes maior ... Eu deveria ter medido com mais precisão;) Perspectiva é uma coisa engraçada! Além disso, sinto que deveria ter conseguido criar as fotos;) Mas ótima resposta! Obrigado!
Berry

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

8

Um objeto duas vezes mais próximo parece duas vezes maior. É uma conseqüência do teorema de Thales e é verdade no mundo real.

Alguém poderia argumentar que o Teorema de Thales é a principal ferramenta matemática por trás da projeção em perspectiva e o que é conhecido no pipeline de gráficos (OpenGL ou DirectX) como divisão de perspectiva . É um teorema que você definitivamente deve conhecer e aprender a reconhecer quando ele pode ser usado.


Ótimas referências! Definitivamente vou verificar o Teorema de Thales e tentar entender melhor o pipeline de gráficos.
Berry

7

Na verdade, isso é praticamente verdade (se você mover um objeto duas vezes mais longe, ele terá a metade do tamanho), mas obscurece como o tamanho visual dos objetos deve mudar à medida que os espectadores se movem. Especificamente, os objetos parecem aumentar mais rapidamente quanto mais próximos. Isso ocorre porque o visualizador percorre metade da distância muito mais rápido quando o objeto está próximo, comparado com quando o objeto está mais distante. Ou, de outra forma, enquanto a velocidade do visualizador é constante, o valor de "metade da distância" muda à medida que a distância do objeto muda.


2

Como você não está realmente trabalhando no espaço 3D, podemos assumir que os sprites nunca giram (a rotação pode ser simulada com inclinação, etc.) Essa restrição simples facilita bastante a obtenção de números precisos sobre o tamanho que o tamanho deve depender da distância da câmera.

Primeiro, você precisa entender como os objetos 3D são renderizados. Mesmo que uma câmera converja para um único ponto, existe um plano invisível que atua como uma tela na qual os objetos são desenhados. A única coisa que você precisa saber sobre a tela é a que distância ela está da câmera.

Aqui está um diagrama de como um objeto é renderizado para uma câmera a duas distâncias diferentes.

Como seria de esperar, a altura do objeto depende da distância da câmera. MAS, como a ruptura ocorre no plano de abate próximo, precisamos calcular a altura do sprite nesse ponto.

Alguns cálculos básicos de triggers levarão você à seguinte 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

EXEMPLO:

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

Eu sugeriria começar com v=5 e depois ajustar a partir daí com base na aparência. Posso jogar um violino juntos que permita ver as mudanças em tempo 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: Quando você diz mover-se ao longo do eixo z, suponho que desejará uma vista em perspectiva (como a maioria dos jogos em 3D; atiradores, etc.) A matemática para calcular o tamanho do objeto com base na distância também dependerá da localização no quadro, semelhante à visão periférica. Em vez disso, eu tentaria com minha matemática, que é uma visão ortográfica (pense em Mario, Angry Birds, Super Smash Bros, etc.). Eu não conheço a aparência que você está tentando alcançar, mas enquanto isso parecer real, os jogadores nunca saberão!

DEMO!


Sim, eu estou realmente buscando uma visão ortográfica. O jogo do qual estou "emprestando" minha inspiração atual é Rayman Origins. Em algumas seções do jogo, você pode pular nas flores e saltar em outra camada com uma profundidade diferente. Em seguida, a câmera aumenta ou diminui o zoom de acordo com essa profundidade. Axamples podem ser vistos neste vídeo , às 4:50 e às 5:00.
Berry

Além disso, ótima resposta! Mas como apenas uma confirmação de que a regra "duas vezes mais próxima, duas vezes maior" se aplica já seria suficiente, escolhi a resposta de Blue como a melhor.
Berry

Obrigado e boa sorte com o seu jogo! Mas quero esclarecer para outras pessoas que "duas vezes mais próximo, duas vezes maior" funcionará muito bem se tudo estiver muito próximo da câmera. À medida que as coisas se afastam, a mudança percebida no tamanho diminui. Por exemplo, olhe o polegar de perto, estenda o braço e olhe para ele. O tamanho do seu polegar parece drasticamente menor. Depois disso, olhe para algo distante. Dê um passo para trás (aproximadamente o mesmo que o comprimento do seu braço). Observe como o tamanho mudou pouco? Se um jogo tiver um longo campo de visão, usar um pouco de matemática ajudará bastante.
Jim Buck

EDIT: Eu cometi um erro no meu comentário anterior. "Duas vezes mais próximo, duas vezes maior" está correto quando os itens permanecem bastante próximos um do outro em relação à distância da câmera.
Jim Buck

Aqui está uma demonstração rápida que montei , use o mouse para mover e a roda de rolagem para alterar a profundidade.
Jim Buck

0

Isso não foi abordado e pensei que isso poderia ser benéfico: deve-se notar quando você metade da distância, dobrar o tamanho nas dimensões X e Y quadruplicará a área total do sprite. Isto é porque:

Area = X * Y

Depois de aumentar o zoom:

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

Isso pode dar a impressão de que o efeito de zoom está ocorrendo rapidamente ou é muito intenso. Você pode ajustar o fator alterando 2 na fórmula acima para um valor flutuante como 1,5 ou 1,33.

Como alternativa, o que eu fiz foi armazenar a profundidade da câmera (distância) em seus blocos em um valor de byte, juntamente com a conversão da câmera (X e Y) e, em seguida, calcular o tamanho do bloco projetado da seguinte maneira:

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

Observe que isso CameraZdeve ser estritamente entre 1 e 255, e essa restrição pode ser um benefício ou uma desgraça para você no futuro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.