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) }
关键逻辑说明
- 变换顺序的重要性:仿射矩阵的乘法是右乘,代码中写的变换顺序和实际执行顺序相反。我们需要的执行流程是:
- 把图形的原点移到坐标系原点(
translate(-originX, -originY)) - 执行缩放
- 执行斜切
- 平移到Actor的位置(
translate(x, y))
所以代码中要反过来写,先写最终的平移,再写斜切、缩放,最后写原点偏移。
- 把图形的原点移到坐标系原点(
- 原点的作用:通过先偏移原点到坐标系中心,后续的缩放和斜切都会围绕你设置的
originX/originY进行,和普通Actor的行为完全一致。 - 扩展提示:如果后续要添加旋转效果,只需要在
shear和scale之间加入affine.rotate(getRotation())即可,旋转同样会围绕原点生效。
内容的提问来源于stack exchange,提问作者user38725
相关产品推荐
相关产品推荐

