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

LibGDX自定义Actor绘制:如何为Affine2添加originX与originY?

解决自定义Actor原点影响缩放与斜切的问题

你的核心问题在于仿射变换的顺序错误,并且没有正确将原点偏移融入变换矩阵。LibGDX中Actor的原点作用逻辑是:先将图形的原点对齐到坐标系原点,再执行缩放/旋转/斜切,最后平移到Actor的位置。下面是修正后的代码和关键说明:

修正后的draw方法代码

override fun draw(batch: Batch?, parentAlpha: Float) {
    super.draw(batch, parentAlpha)
    
    val tex = tex ?: return // 避免空指针
    val color = getColor()
    batch!!.setColor(color.r, color.g, color.b, color.a * parentAlpha)

    val x = getX()
    val y = getY()
    val originX = getOriginX()
    val originY = getOriginY()
    val scaleX = getScaleX()
    val scaleY = getScaleY()

    affine.idt() // 重置为单位矩阵,清除之前的变换残留
    affine.translate(x, y) // 最后一步:将图形平移到Actor的目标位置
    affine.shear(skew.x, skew.y) // 第三步:应用斜切变换
    affine.scale(scaleX, scaleY) // 第二步:应用缩放变换
    affine.translate(-originX, -originY) // 第一步:将图形原点对齐到坐标系原点

    batch.draw(tex, getWidth(), getHeight(), affine)
}

关键逻辑说明

  • 变换顺序的重要性:仿射矩阵的乘法是右乘,代码中写的变换顺序和实际执行顺序相反。我们需要的执行流程是:
    1. 把图形的原点移到坐标系原点(translate(-originX, -originY))
    2. 执行缩放
    3. 执行斜切
    4. 平移到Actor的位置(translate(x, y))
      所以代码中要反过来写,先写最终的平移,再写斜切、缩放,最后写原点偏移。
  • 原点的作用:通过先偏移原点到坐标系中心,后续的缩放和斜切都会围绕你设置的originX/originY进行,和普通Actor的行为完全一致。
  • 扩展提示:如果后续要添加旋转效果,只需要在shear和scale之间加入affine.rotate(getRotation())即可,旋转同样会围绕原点生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 08:28:12