【问题标题】:Libgdx - min and max of a rotated Bounding BoxLibgdx - 旋转边界框的最小值和最大值
【发布时间】:2014-11-06 21:17:36
【问题描述】:

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

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 // 好的,正如预期的那样
maxx 2.0 // 好的,正如预期的那样
miny -2.0 // 我希望 -1 !
最大 2.0 // 我希望 1 !
dimx 4.0 // 好的,正如预期的那样
dimy 4.0 // 我希望 2 !

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

有没有人可以帮助我理解我错在哪里? 非常感谢

【问题讨论】:

    标签: libgdx bounding-box


    【解决方案1】:

    经过一些代码剖析,我相信这是一个 libGDX 错误。那就是BoundingBoxmul函数

    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 上修复了。您可以使用最新的 nightly 版本或等待下一个版本。

    【讨论】:

    • 非常感谢您的回答。我正在使用 Gradle 设置应用程序,该应用程序似乎尚未解决此问题
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多