我正在尝试计算一组帧(包括预烘焙的旋转帧)的正确索引。
假设我有一个有两个框架和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时才起作用,否则我会得到除法错误我也不介意去掉弧度到度数的转换。
思想?

最佳答案

为了确保我理解你的意思,你有一个长度为n k的数组,其中n是帧数,k是你允许的旋转次数。然后给你一个索引i和一个旋转θ(以弧度为单位),你想确定你想找到的图像在哪个索引处。
鉴于此,这应采取两个步骤:
确定进入主阵列的基偏移,在该基偏移处可以找到与所需图像相对应的图像块。
确定从该点到正确旋转图像的相对偏移。
现在,如果每个图像有k个不同的旋转,那么每次从查看图像i的旋转到查看图像i+1的旋转,都会跳过k个元素。这意味着对于图像i,基偏移是i*k。
现在的问题是你想要哪一张图片。如果θ存储在[-2π,2π]范围内,则可以将其转换回度数,以获得[-360,+360]范围内的值。然而,这并不能很好地处理数组索引,所以我们可能更愿意将其映射到范围[0360],正如您所注意到的。一种非常简单的方法是,在进行转换之前,只需在起始角度上加上2π,然后计算出mod 360度的值也就是说,如果起始角在[0,4π],那么将其映射到[0,720]并从那里映射到[0,360]是非常简单的。
最后,要从[0,360]中的角度转换为偏移量,我们需要查看该角度属于哪一个k个不同的角度区域。我们可以把这个值乘以k,然后除以360,这是整数除法乘以k/360的安全方法。
总的来说,给定角度anglek每个图像的不同旋转,可以找到您想要的图像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]

我认为这更清楚,因为它更明确地表明您使用的一个索引对应于一个帧,一个是偏移量。这也让数学简单了一点。
希望这有帮助!

08-04 06:14