Como posso fazer um terreno 3D "caindo" como o Animal Crossing?


15

O Animal Crossing tem uma maneira única de rolar o mapa do mundo: quando o personagem se move para baixo, o mundo rola repetidamente no topo, como se estivesse preso a um tubo de papelão:

Animal Crossing é o mundo dos cilindros

Este vídeo mostra como ele se move.

Como posso criar esse efeito?


11
Não parece um efeito para mim, parece um mundo 3D muito simples que a câmera está seguindo.
James

Hackear o jogo pode produzir uma falha de colisão que permite entrar no oceano onde o mundo acaba. Você pode ver pedaços do mundo "curvados para trás" no vazio além da borda do mundo. Vídeo aqui .
Anko

Respostas:


6

Eu estava experimentando um pouco depois de jogar Deathspank, que tem um efeito semelhante. Embora eu nunca tenha me aprofundado o suficiente para ver se poderia ser ajustado para funcionar super bem, uma possibilidade é apenas modificar itens no seu shader de vértice com base na profundidade. Um mapeamento de função cos (profundidade) para uma modificação no eixo Y funciona. Você pode ajustá-lo de forma que o mundo não apenas caia à distância, mas também se estiver mais próximo do que um pouco de profundidade, fazendo o mundo parecer especialmente redondo. Você pode fazer o mesmo com o valor do eixo X para torná-lo mais esférico. Não tenho certeza se é assim que esses jogos realmente o fazem; minhas experiências deram resultados insatisfatórios, mas eu não brinquei muito com as proporções; portanto, pode ter sido tão simples quanto alterar a taxa de queda para torná-la melhor.


+1 porque é assim que eu faria. No entanto, você pode esclarecer o que quer dizer com 'profundidade'. Pode ser a distância da câmera ou do personagem. Eu acho que seria bom experimentar com os dois.
DaleyPaley

Desculpe, estou atrasado para a festa - como 6 anos de atraso -, mas no caso do AC, a 'profundidade' é calculada com base na distância da câmera ... mas como a posição da câmera é baseada na posição do personagem, tudo é mais ou menos conectado.
Lvictorino 28/08/19

5

Parece que está apenas pegando um "mundo plano" e mapeando para coordenadas cilíndricas . Envolvendo essencialmente o mundo em um cilindro. Fiz algo semelhante com um mundo plano, mas envolvi-o em uma esfera:

insira a descrição da imagem aqui insira a descrição da imagem aqui

O jeito que eu fiz isso para uma esfera é semelhante ao que você faria com um cilindro. Escolha um raio adequado (ρ ou "rho" em coordenadas cilíndricas) para o seu mundo. Para cada vértice, pegue as coordenadas XZ do seu mundo (assumindo que Y é a altura) e depois use as coordenadas cilíndricas usando o XZ e o raio mais Y. Se você não adicionar o Y, obterá um cilindro plano. Em seguida, converta novamente em coordenadas cartesianas para desenhar o jogo.


3
Outra coisa a mencionar, a dimensão Y do mundo no Animal Crossing é muito maior do que a circunferência do cilindro (apenas observando-o, porque a linha do horizonte está muito próxima). Portanto, parte do mapa do mundo é cortada apenas para as áreas mais próximas ao personagem e essa área cortada é enrolada em todo o cilindro. É semelhante ao corte de um mapa 2D baseado em blocos apenas para as partes visíveis.
ChrisC

Ponto excelente. Eu imagino que isso também possa ser usado para manter a área de memória pequena, carregando / descarregando o mundo conforme necessário.
MichaelHouse

5

Você quer ir de um mundo plano para um mundo cilíndrico.

Uma rotação ao redor do eixo x (em coordenadas homogêneas) é assim:

     | 1   0   0   0 |
Rx = | 0  ca  -sa  0 |
     | 0  sa   ca  0 |
     | 0   0    0  1 |

Onde:

ca = cos(angle) and sa = sin(angle)

Para calcular o ângulo, observe a imagem. O pi / 2 é cancelado e você fica com:

angle = offset_from_character.z - radius

Além disso, olhe para a imagem. O ângulo do ponto projetado depende da distância horizontal do personagem, a distância da esfera depende da vertical.

new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)

certifique-se de selecionar as coisas que estão além do horizonte, caso contrário, o mundo inteiro se envolverá.

Isenção de responsabilidade: não testei isso e não sou especialista em matemática, mas a resposta é mais ou menos assim. Alguém por favor me corrija se eu estiver errado.

mundo esférico

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.