Расчет правильной рамки запеченного листа спрайта с углом - PullRequest
1 голос
/ 06 сентября 2011

Я пытаюсь вычислить правильный индекс для массива кадров, включая предварительно запеченные повернутые кадры.

Допустим, у меня есть спрайт с 2 кадрами и гранулярностью, повернутой на 90 градусов. Мой массив будет выглядеть так: frames[frame0, frame0 rotated 90 degrees, frame0 rotated 180 degrees, frame0 rotated 270 degrees, frame1, frame1 rotated 90 degrees, frame1 rotated 180 degrees, frame1 rotated 270 degrees].

Итак, мой массив содержит frame count * (360 / granularity) элементов.

Теперь у меня проблема с вычислением правильного индекса. Я знаю следующее: текущий кадр, угол (в радианах), гранулярность и количество запеченных поворотов на кадр.

У меня есть этот код:

int correctedAngle = Utility.radiansToDegrees(angle) % 360;

if (correctedAngle < 0)
    correctedAngle += 360;

return _frames[(frame * _bakedRotations) + (correctedAngle / _granularity)];

Но это работает только когда гранулярность установлена ​​в 1, в противном случае я получаю ошибки деления. Я также не против избавиться от преобразования радиан в градусы.

Идеи

1 Ответ

1 голос
/ 06 сентября 2011

Чтобы убедиться, что я понимаю, что вы говорите, у вас есть массив длиной nk, где n - это количество кадров, а k - это количество вращений, которое вы допускаете.Затем вам дается индекс i и вращение θ (в радианах), и вы хотите определить, по какому индексу изображение, которое вы хотите найти, лежит.

Учитывая это, для этого нужно выполнить два шага:

  1. Определение базового смещения в мастер-массиве, в котором вы найдете блок изображений, соответствующий желаемому изображению.
  2. Определение относительного смещения от этой точки, которое приведет вас к правильно повернутому изображению.

Теперь, если есть k различных поворотов каждого изображения, то каждый раз, когда вы переходите от просмотра поворотов изображения i к поворотам изображения i + 1, вы пропустите k элементов.Это означает, что для изображения i базовое смещение равно i * k.

Теперь вопрос состоит в том, какое из k изображений здесь вы хотите.Если θ хранится в диапазоне [-2π, 2π], вы можете преобразовать его обратно в градусы, чтобы получить значение в диапазоне [-360, +360].Однако это не очень хорошо работает с индексами массива, поэтому мы, вероятно, предпочли бы отобразить это в диапазоне [0, 360], как вы заметили.Один из способов сделать это довольно чистым - просто добавить 2π к начальному углу перед выполнением преобразования и вычислить значение в градусах 360. То есть, если начальный угол находится в [0, 4π], сопоставьте его с [0, 720] и отсюда до [0, 360) довольно просто.

Наконец, чтобы преобразовать угол из [0, 360) в смещение, нам нужно посмотреть, в какую из k различныхугол области угол принадлежит.Мы можем сделать это путем умножения значения на k и деления их на 360, что является безопасным целочисленным способом умножения на k / 360.

В сумме, учитывая угол angle и kразличные повороты на изображение, изображение, которое вы хотите для изображения frame, можно найти следующим образом:

_frames[frame * k + (Utility.radiansToDegrees(angle + 2 * pi) % 360) * k / 360]

Однако есть гораздо более чистый способ сделать это.Если вы храните изображения в многомерном массиве nxk, где n - это число изображений, а k - это число вращений, то вы можете посмотреть это как

_frames[frame][(Utility.radiansToDegrees(angle + 2 * pi) % 360) * k / 360]

Я думаю, что это намного чище, поскольку это более явно указывает на то, что один из используемых вами индексов соответствует фрейму, а другой - смещению.Это также немного облегчает математику.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...