用角度计算烘烤精灵片的正确帧

本文关键字:精灵 计算 | 更新日期: 2023-09-27 18:07:32

我正在尝试计算包含预烤旋转帧的帧数组的正确索引。

假设我有一个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时起作用,否则我会得到除法错误。我也不介意去掉弧度到角度的转换。

想法?

用角度计算烘烤精灵片的正确帧

为了确保我理解你所说的,你有一个长度为nk的数组,其中n是帧数,k是你允许的旋转次数。然后给你一个指标i和一个旋转&;(以弧度为单位),并想确定要查找的图像位于哪个索引。

考虑到这一点,这应该分为两步:

  1. 确定到主数组的基本偏移量,在此位置您将找到与您想要的图像对应的图像块。
  2. 确定从该点开始的相对偏移量,将带您到正确旋转的图像。

现在,如果每张图像有k次不同的旋转,那么每次你从查看图像i的旋转到图像i+1的旋转,你将跳过k个元素。这意味着对于图像i,基本偏移量为i*k。

现在的问题是你想要k张图片中的哪一张。如果θ;存储在[-2π, 2π]范围内,然后您可以将其转换回度数以获得[-360,+360]范围内的值。然而,这并不能很好地处理数组下标,所以我们可能更愿意将其映射到[0,360]范围。一种很简单的方法是加上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]

我认为这更简洁,因为它更明确地表明你使用的一个指标对应于一个帧,另一个是偏移量。它还使数学计算更容易一些。

希望这对你有帮助!