我一直在尝试制作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
答案 0 :(得分:0)
我终于解决了它。我没有遇到什么新问题,但至少现在已经完成了。
Matrix4f rotationMin = Maths.createTransformationMatrix(min, rotX, rotY, rotZ, scale);
必须替换为
Matrix4f rotationMin = Maths.createTransformationMatrix(position, rotX, rotY, rotZ, scale);
然后将差值/ 2加到最大值并从最小值中减去差值/ 2。