我正在尝试计算包含预先烘焙的旋转帧的帧数组的正确索引。
因此,假设我有一个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时才有效,否则我会得到除法错误。我也不介意将弧度转换为度数。
想法?
答案 0 :(得分:1)
为了确保我理解你所说的内容,你有一个长度为nk的数组,其中n是帧数,k是你允许的旋转数。然后给出一个索引i和一个旋转θ(以弧度表示),并希望确定您想要找到的图像位于哪个索引处。
鉴于此,这应该采取两个步骤:
现在,如果每个图像有不同的旋转,那么每次从查看图像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]
但是,有一种更清洁的方法可以做到这一点。如果将图像存储在n x k的多维数组中,其中n是图像数,k是旋转数,那么你可以将其视为
_frames[frame][(Utility.radiansToDegrees(angle + 2 * pi) % 360) * k / 360]
我认为这更清晰,因为它更明确地表明您使用的其中一个索引对应于一个框架,一个是偏移。它还使数学运算更容易。
希望这有帮助!