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?

Chris
fonte
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.

Sean Middleditch
fonte
+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.

MichaelHouse
fonte
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

DaleyPaley
fonte