Libgdx - 旋转的边界框的最小值和最大值

时间:2014-11-06 09:01:04

标签: libgdx bounding-box

我正在运行下面的简单代码:

BoundingBox bounds = new BoundingBox();
Vector3 vmin = new Vector3();
Vector3 vmax = new Vector3();

vmin.x = -1;
vmin.y = -2;
vmin.z = 0;  
vmax.x = 1;
vmax.y = 2;
vmax.z = 0;
bounds.set(vmin,vmax);

Matrix4 mrot = new Matrix4();
mrot.setToRotation(0, 0, 1, 90);
bounds.mul(mrot);

Gdx.app.log("xxx","minx " + bounds.min.x);
Gdx.app.log("xxx","maxx " + bounds.max.x);
Gdx.app.log("xxx","miny " + bounds.min.y);
Gdx.app.log("xxx","maxy " + bounds.max.y);
Gdx.app.log("xxx","dimx " + bounds.getWidth());
Gdx.app.log("xxx","dimy " + bounds.getHeight());

日志显示:

minx -2.0 // ok,正如预期的那样 maxx 2.0 //好的,正如预期的那样 miny -2.0 //我期待-1!
maxy 2.0 //我希望1!
dimx 4.0 // ok,正如预期的那样 dimy 4.0 //我希望2!

我的理解是上面的代码应该简单地围绕Z轴旋转90°的2D矩形。 Log的结果表明情况并非如此(即y坐标没有变化)

有谁能帮助我理解我错在哪里? 非常感谢

1 个答案:

答案 0 :(得分:0)

经过一些代码剖析后,我认为这是一个libGDX错误。这是mul

BoundingBox功能
public BoundingBox mul (Matrix4 transform) {
        final float x0 = min.x, y0 = min.y, z0 = min.z, x1 = max.x, y1 = max.y, z1 = max.z;
        ext(tmpVector.set(x0, y0, z0).mul(transform));
        ext(tmpVector.set(x0, y0, z1).mul(transform));
        ext(tmpVector.set(x0, y1, z0).mul(transform));
        ext(tmpVector.set(x0, y1, z1).mul(transform));
        ext(tmpVector.set(x1, y0, z0).mul(transform));
        ext(tmpVector.set(x1, y0, z1).mul(transform));
        ext(tmpVector.set(x1, y1, z0).mul(transform));
        ext(tmpVector.set(x1, y1, z1).mul(transform));
        return this;
    }

ext

public BoundingBox ext (Vector3 point) {
        return this.set(min.set(min(min.x, point.x), min(min.y, point.y), min(min.z, point.z)),
            max.set(Math.max(max.x, point.x), Math.max(max.y, point.y), Math.max(max.z, point.z)));
    }

如果仔细观察,ext函数会使用当前点执行一些minmax。这就是导致错误的原因。该函数应在任何操作之前重置最小和最大点(分别为POSITIVE_INFINITY和NEGATIVE_INFINITY)。

编辑:

它似乎已在git repository上修复。您可以每晚使用最新版本或等待下一个版本。