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?
fonte
Respostas:
Geralmente é verdade, dependendo do seu ponto de vista e em qual direção ele se moveu, bem como o ângulo de visão.
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.
fonte
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.
fonte
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.
fonte
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:
EXEMPLO:
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
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!
fonte
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:
Depois de aumentar o zoom:
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:
Observe que isso
CameraZ
deve ser estritamente entre 1 e 255, e essa restrição pode ser um benefício ou uma desgraça para você no futuro.fonte