Как я могу сделать «отваливающуюся» трехмерную местность, как Animal Crossing?


15

У Animal Crossing есть уникальный способ прокрутки карты мира: когда персонаж движется вниз, мир вращается вокруг и снова вверх, как будто он застрял в картонной трубе:

Скрещивание животных - это цилиндр мира

Это видео показывает, как оно движется.

Как я могу создать этот эффект?


1
Для меня это не похоже на эффект, это похоже на очень простой трехмерный мир, за которым просто следит камера.
Джеймс

Взлом игры может привести к столкновению, которое позволит вам отправиться в океан, где заканчивается мир. Вы можете увидеть кусочки мира, изогнутые назад в пустоте за пределами этого края. Видео здесь .
Анко,

Ответы:


6

Я немного поэкспериментировал после игры Deathspank, которая имеет похожий эффект. Хотя я никогда не углублялся в это достаточно, чтобы посмотреть, можно ли настроить его так, чтобы он работал очень хорошо, одна из возможностей - просто изменить элементы в вашем вершинном шейдере в зависимости от глубины. Функция преобразования cos (глубина) в модификацию оси Y работает. Вы можете настроить его так, чтобы мир падал не только вдаль, но и ближе, чем на какую-то глубину, чтобы мир чувствовал себя особенно круглым. Вы можете сделать то же самое для значения оси X, чтобы оно казалось более сферическим. Я не уверен, так ли это на самом деле в таких играх; мои эксперименты дали неудовлетворительные результаты, но я не слишком много играл с коэффициентами, так что, возможно, это было так же просто, как изменение скорости спада, чтобы сделать его лучше.


+1 потому что так я бы и сделал. Тем не менее, вы можете уточнить, что вы подразумеваете под «глубиной». Это может быть расстояние от камеры или расстояние от персонажа. Я думаю, что было бы хорошо поэкспериментировать с обоими.
DaleyPaley

Извините, я опаздываю на вечеринку - примерно на 6 лет позже - но в случае переменного тока «глубина» вычисляется на основе расстояния от камеры ... но, поскольку положение камеры основано на положении персонажа, все вроде связано.
lvictorino

5

Похоже, он просто берет "плоский мир" и сопоставляет его с цилиндрическими координатами . По сути, завернуть мир на цилиндре. Я сделал нечто похожее с плоским миром, но обернул его в сферу:

введите описание изображения здесь введите описание изображения здесь

То, как я сделал это для сферы, похоже на то, как вы делали бы это для цилиндра. Выберите подходящий радиус (ρ или «rho» в цилиндрических координатах) для вашего мира. Для каждой вершины возьмите координаты XZ вашего мира (при условии, что Y - высота), затем преобразуйте в цилиндрические координаты, используя XZ и радиус плюс Y. Если вы не добавите Y, вы получите плоский цилиндр. Затем преобразуйте обратно в декартовы координаты, чтобы нарисовать в игре.


3
Еще одна вещь, которую стоит упомянуть, размер Y в мире при скрещивании животных намного больше, чем окружность цилиндра (просто взглянув на него, потому что линия горизонта очень близка). Поэтому некоторая часть карты мира обрезается только до тех областей, которые находятся ближе всего к персонажу, и эта область обрезается вокруг всего цилиндра. Это похоже на обрезку 2D-карты на основе плитки только для видимых частей.
ChrisC

Отличный момент. Я полагаю, что это также можно использовать для уменьшения объема памяти, загружая / выгружая мир по мере необходимости.
MichaelHouse

5

Вы хотите перейти из плоского мира в цилиндрический.

Вращение вокруг оси x (в однородных координатах) выглядит так:

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

Где:

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

Чтобы рассчитать угол, посмотрите на изображение. Pi / 2 отменяется, и у вас остаются:

angle = offset_from_character.z - radius

Также посмотрите на изображение. Угол проекции точки зависит от горизонтального расстояния от персонажа, расстояние от сферы зависит от вертикали.

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

Обязательно отбрасывайте вещи, которые находятся за горизонтом, иначе весь мир обернется.

Отказ от ответственности: я не проверял это, и я не эксперт по математике, но ответ примерно такой. Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь.

сферический мир

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.