Libgdx的Matrix4#translate()并没有按预期工作

时间:2015-06-24 16:59:15

标签: java opengl matrix libgdx nine-patch

我尝试使用变换矩阵绘制NinePatch,因此可以缩放,旋转,移动等等。所以我创建了一个继承自LibGDX NinePatch的类类和负责矩阵。

这是我计算变换矩阵的方法(每当下列值之一发生变化时我都会更新它):

this.transform
    .idt()
    .translate(originX, originY, 0)
    .rotate(0, 0, 1, rotation)
    .scale(scale, scale, 1)
    .translate(-originX, -originY, 0)
;

以及如何渲染我的自定义NinePatch类:

drawConfig.begin(Mode.BATCH);
this.oldTransform.set(drawConfig.getTransformMatrix());
drawConfig.setTransformMatrix(this.transform);
this.draw(drawConfig.getBatch(), this.x, this.y, this.width, this.height); // Libgdx's NinePatch#draw()
drawConfig.setTransformMatrix(this.oldTransform);

案例1

这是我用以下内容渲染4个九个补丁时得到的结果: Position = 0,0 / Origin = 0,0 / Scale = 0.002 / Rotation =每个9patch不同

我得到了我的期望。

案例2

现在相同的4个九个补丁: Position = 0,0 / Origin = 0.5,0.5 / Scale = same / Rotation = same

你可以看到我的9个补丁不是在0,0(它们的位置)绘制,而是在0.5,0.5(它们的原点)绘制,就像我在计算变换矩阵时没有.translate(-originX, -originY, 0)一样。只是为了确定,我评论了这条指令,我确实得到了相同的结果。那么为什么我的第二次翻译显然没有被考虑在内呢?

2 个答案:

答案 0 :(得分:1)

问题可能是你的缩放。因为它还缩小了翻译范围,所以你的第二个翻译实际上会翻译(-originX*scale, -originY*scale, 0),因为scale = 0.002,看起来根本就没有翻译。例如,对于x坐标,您可以计算:

x_final = originX + scale * (-originX + x_initial)

答案 1 :(得分:0)

我必须改变计算我的变换矩阵的代码,以便在按照Guillaume G的指示进行翻译时考虑到比例,除了我的代码与他的代码不同:

this.transform
    .idt()
    .translate(originX, originY, 0)
    .rotate(0, 0, 1, rotation)
    .scale(scale, scale, 1)
    .translate(-originX / scale, -originY / scale, 0);
;