У Animal Crossing есть уникальный способ прокрутки карты мира: когда персонаж движется вниз, мир вращается вокруг и снова вверх, как будто он застрял в картонной трубе:
Это видео показывает, как оно движется.
Как я могу создать этот эффект?
У Animal Crossing есть уникальный способ прокрутки карты мира: когда персонаж движется вниз, мир вращается вокруг и снова вверх, как будто он застрял в картонной трубе:
Это видео показывает, как оно движется.
Как я могу создать этот эффект?
Ответы:
Я немного поэкспериментировал после игры Deathspank, которая имеет похожий эффект. Хотя я никогда не углублялся в это достаточно, чтобы посмотреть, можно ли настроить его так, чтобы он работал очень хорошо, одна из возможностей - просто изменить элементы в вашем вершинном шейдере в зависимости от глубины. Функция преобразования cos (глубина) в модификацию оси Y работает. Вы можете настроить его так, чтобы мир падал не только вдаль, но и ближе, чем на какую-то глубину, чтобы мир чувствовал себя особенно круглым. Вы можете сделать то же самое для значения оси X, чтобы оно казалось более сферическим. Я не уверен, так ли это на самом деле в таких играх; мои эксперименты дали неудовлетворительные результаты, но я не слишком много играл с коэффициентами, так что, возможно, это было так же просто, как изменение скорости спада, чтобы сделать его лучше.
Похоже, он просто берет "плоский мир" и сопоставляет его с цилиндрическими координатами . По сути, завернуть мир на цилиндре. Я сделал нечто похожее с плоским миром, но обернул его в сферу:
То, как я сделал это для сферы, похоже на то, как вы делали бы это для цилиндра. Выберите подходящий радиус (ρ или «rho» в цилиндрических координатах) для вашего мира. Для каждой вершины возьмите координаты XZ вашего мира (при условии, что Y - высота), затем преобразуйте в цилиндрические координаты, используя XZ и радиус плюс Y. Если вы не добавите Y, вы получите плоский цилиндр. Затем преобразуйте обратно в декартовы координаты, чтобы нарисовать в игре.
Вы хотите перейти из плоского мира в цилиндрический.
Вращение вокруг оси 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)
Обязательно отбрасывайте вещи, которые находятся за горизонтом, иначе весь мир обернется.
Отказ от ответственности: я не проверял это, и я не эксперт по математике, но ответ примерно такой. Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь.