3Dゲームエンジンを作成しようとしています。これまでのところ、バウンディングボックスを回転させる以外はすべて動作します。私はここで見つけたそれをするためにさまざまな方法を試みました。ほぼすべてが同じです。 "回転行列を作成し、それを境界ボックスの最小値と最大値に適用します。"それが今私がやっている方法ですが、あらゆる種類の問題があります。私はそれが世界のゼロ点を中心に回転していると思います。また、最小点と最大点を示す2つのオブジェクトがあり、回転後にこれらの2つの間で衝突していません。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する行列を適用し、最大:
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
誰も答えを得ていませんか? – Maineri