LWJGL - 旋转后更新3D边界框坐标

时间:2017-02-15 18:57:21

标签: java opengl 3d lwjgl

我一直在尝试制作3D游戏引擎。到目前为止,一切都有效,除了旋转边框。我尝试过不同的方法来做到这一点。几乎一切都是一样的。 "制作旋转矩阵并将其应用于最小和最大的边界框。"这就是我现在这样做的方式,但是存在各种各样的问题。我认为它正在绕着世界零点旋转。此外,我有两个显示最小和最大点的对象,旋转后它们不会在这两个事物之间发生碰撞。

我的转换矩阵:

public static Matrix4f createTransformationMatrix(Vector3f translation, float rx, float ry, float rz, float scale) {

    Matrix4f matrix = new Matrix4f();

    matrix.setIdentity();

    Matrix4f.translate(translation, matrix, matrix);

    Matrix4f.rotate((float) Math.toRadians(rx), new Vector3f(1,0,0), matrix, matrix);
    Matrix4f.rotate((float) Math.toRadians(ry), new Vector3f(0,1,0), matrix, matrix);
    Matrix4f.rotate((float) Math.toRadians(rz), new Vector3f(0,0,1), matrix, matrix);

    Matrix4f.scale(new Vector3f(scale, scale, scale), matrix, matrix);

    return matrix;

}

更新碰撞盒:

Matrix4f rotationMin = Maths.createTransformationMatrix(min, rotX, rotY, rotZ, scale);
Matrix4f rotationMax = Maths.createTransformationMatrix(max, rotX, rotY, rotZ, scale);

min = Maths.transform(min, rotationMin);
max = Maths.transform(max, rotationMax);

min.x += difX / 2;
min.y += difY / 2;
min.z += difZ / 2;

max.x += difX / 2;
max.y += difY / 2;
max.z += difZ / 2;

将矩阵应用于min和max:

public static Vector3f transform(Vector3f vector, Matrix4f matrix) {

    Vector4f vec = new Vector4f(vector.x, vector.y, vector.z, 1.0f);

    Vector4f result = new Vector4f(

            (vec.x * matrix.m00) + (vec.y * matrix.m01) + (vec.z * matrix.m02) + (vec.w * matrix.m03),
            (vec.x * matrix.m10) + (vec.y * matrix.m11) + (vec.z * matrix.m12) + (vec.w * matrix.m13),
            (vec.x * matrix.m20) + (vec.y * matrix.m21) + (vec.z * matrix.m22) + (vec.w * matrix.m23),
            1

    );

    return new Vector3f(result.x / result.w, result.y / result.w, result.z / result.w);

}

所有这些都是通过LWJGL和Java(+着色器的GLSL)完成的。

Collinsions在旋转之前完美运行。 http://imgur.com/a/39Sya

但不是在那之后http://imgur.com/a/TTxbQ

1 个答案:

答案 0 :(得分:0)

我终于解决了它。我没有遇到什么新问题,但至少现在已经完成了。

Matrix4f rotationMin = Maths.createTransformationMatrix(min, rotX, rotY, rotZ, scale);

必须替换为

Matrix4f rotationMin = Maths.createTransformationMatrix(position, rotX, rotY, rotZ, scale);

然后将差值/ 2加到最大值并从最小值中减去差值/ 2。