You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旋转Sprite时绘制位置偏移异常的解决方案求助

Sprite旋转后动画位置偏移抖动的解决方案

问题背景

从Sprite图集绘制动画时,依赖纹理打包工具输出的裁剪偏移值(oX/oY)调整动画位置,但旋转Sprite后偏移失效,动画出现严重抖动。需要让偏移量跟随Sprite的旋转角度同步变换。

当前绘制代码:

public override void Draw(SpriteBatch sb)
{
    if (Game1.TimePassed % AnimationSpeed == 0) CurrentFrame++;

    if (CurrentFrame >= FrameCount) CurrentFrame = StartFrame;

    int x = AtlasDataManager.AtlasNodes[CurrentFrame].X;
    int y = AtlasDataManager.AtlasNodes[CurrentFrame].Y;
    int w = AtlasDataManager.AtlasNodes[CurrentFrame].W;
    int h = AtlasDataManager.AtlasNodes[CurrentFrame].H;
    int oX = AtlasDataManager.AtlasNodes[CurrentFrame].Ox;
    int oY = AtlasDataManager.AtlasNodes[CurrentFrame].Oy;

    sb.Draw(Game1.ATLAS, Pos - new Vector2(oX, oY), new Rectangle(x, y, w, h), Color.White,Rotation, new Vector2(51 / 2, 64 / 2), Vector2.One,SpriteEffects.None, 0f);
}

其中oX/oY为纹理打包工具输出的Sprite偏移量。

已尝试无效方案:

  • 将绘制原点固定为每帧中心,旋转效果恶化;
  • 尝试用旋转的负余弦、正弦值直接计算位置,仅在翻转倒立后动画恢复正常,其余场景无效。

核心原因

直接通过Pos - new Vector2(oX, oY)做线性偏移是在世界坐标系下的静态调整,当Sprite旋转时,其局部坐标系发生旋转,但偏移量未同步旋转,导致位置计算错误,出现抖动。

解决代码与说明

public override void Draw(SpriteBatch sb)
{
    if (Game1.TimePassed % AnimationSpeed == 0) CurrentFrame++;

    if (CurrentFrame >= FrameCount) CurrentFrame = StartFrame;

    var frame = AtlasDataManager.AtlasNodes[CurrentFrame];
    int x = frame.X;
    int y = frame.Y;
    int w = frame.W;
    int h = frame.H;
    int oX = frame.Ox;
    int oY = frame.Oy;

    // 构建原始偏移向量(若位置仍错误,可尝试改为new Vector2(-oX, -oY))
    Vector2 offset = new Vector2(oX, oY);
    // 用旋转矩阵计算跟随Sprite旋转后的偏移向量
    float cos = (float)Math.Cos(Rotation);
    float sin = (float)Math.Sin(Rotation);
    Vector2 rotatedOffset = new Vector2(
        offset.X * cos - offset.Y * sin,
        offset.X * sin + offset.Y * cos
    );

    // 使用当前帧的实际中心作为旋转原点,而非固定值
    Vector2 origin = new Vector2(w / 2f, h / 2f);

    // 应用旋转后的偏移量计算最终绘制位置
    sb.Draw(Game1.ATLAS, Pos - rotatedOffset, new Rectangle(x, y, w, h), 
            Color.White, Rotation, origin, Vector2.One, SpriteEffects.None, 0f);
}

关键要点

  • 旋转矩阵变换:这是解决问题的核心,将原始偏移向量按照Sprite的旋转角度进行坐标系变换,确保偏移方向始终与Sprite对齐;
  • 动态原点设置:不同帧的尺寸可能不同,固定原点会导致旋转轴心错误,用(w/2f, h/2f)取每帧的实际中心,保证旋转行为符合预期;
  • 偏移方向校验:不同纹理打包工具的oX/oY定义可能不同(部分工具是正向偏移,部分是反向),如果修改后位置仍不对,可尝试反转偏移向量的符号。

内容的提问来源于stack exchange,提问作者dodgergram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:15:02