2017-02-15 3 views
-1

Ich habe versucht, eine 3D-Spiel-Engine zu machen. Bisher läuft alles außer rotierender Bounding Box. Ich habe verschiedene Möglichkeiten ausprobiert, die ich hier gefunden habe. Fast alles ist gleich. "Machen Sie eine Rotationsmatrix und wenden Sie sie auf die Begrenzungsrechtecke min und max an." So mache ich es jetzt, aber es gibt alle möglichen Probleme. Ich denke, es dreht sich um den Nullpunkt der Welten. Außerdem habe ich zwei Objekte, die die Min- und Max-Punkte zeigen und nach dem Drehen kollidiert es nicht zwischen diesen beiden Dingen.LWJGL - Update 3D Bounding Box Koordinaten nach der Drehung

Meine Transformations-Matrix:

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; 

} 

aktualisiert Kollisionsbox:

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; 

Und Matrix auf min und max Anwendung:

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); 

} 

dies mit LWJGL und Java erfolgt Alle (+ GLSL für Shader).

Colliers funktioniert perfekt vor dem Drehen. http://imgur.com/a/39Sya

Aber nicht nach dem http://imgur.com/a/TTxbQ

+0

Also hat niemand die Antwort bekommen? – Maineri

Antwort

0

Ich löste es schließlich. Ich habe ein paar neue Probleme, aber das ist jetzt getan.

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

hatte mit

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

Und dann Differenz/2 bis max und subtrahieren Differenz/2 von min hinzufügen ersetzt werden.

Verwandte Themen