Hallo
Ich möchte in meinem Spiel auch 3D-Items anzeigen lassen. da das Inventar allerdings in der 2D Ebene liegt, habe ich die Slots transparent gemacht, damit ich sozusagen in die welt hinter den Slots skaliert die 3D-Items zeichnen kann. Dabei traten zwei Probleme auf:
- Der skalierungsfaktor
Um zu berechnen, wie ein beliebig großes Objekt skaliert werden muss, filtere ich die kleinsten und die größten X/Y Werte des Objekts raus, projeziere sie und den Abstand der projezierten teile ich durch die Slotbreite, und das ist der Skalierungsfaktor. Dieser ist aber viiieeel zu klein.
public void reloadBounds(Point2D.Float d){
FloatBuffer distanz_1 = BufferUtils.createFloatBuffer(3);
FloatBuffer distanz_2 = BufferUtils.createFloatBuffer(3);
Vector3f[] minmax = getMinMax();
GLU.gluProject(minmax[1].x, minmax[1].y, minmax[1].z, Main.putFloatCoords(Main.einheitsMatrix()), m.projMatrix, m.viewPort, distanz_1);
GLU.gluProject(minmax[0].x, minmax[0].y, minmax[0].z, Main.putFloatCoords(Main.einheitsMatrix()), m.projMatrix, m.viewPort, distanz_2);
scaleFactor = ((distanz_2.get(0)-distanz_1.get(0))/d.x);
}
public Vector3f[] getMinMax(){
Float maxX = Float.MIN_VALUE;
Float maxY = Float.MIN_VALUE;
Float maxZ = Float.MIN_VALUE;
Float minX = Float.MAX_VALUE;
Float minY = Float.MAX_VALUE;
Float minZ = Float.MAX_VALUE;
for(int m = 0; m < o.meshes.size(); m++){
for(int i = 0; i < o.meshes.get(m).vertexBuffer.capacity(); i+=3){
if(o.meshes.get(m).vertexBuffer.get(i) >= maxX){
maxX = o.meshes.get(m).vertexBuffer.get(i);
}
if(o.meshes.get(m).vertexBuffer.get(i+1) >= maxY){
maxY = o.meshes.get(m).vertexBuffer.get(i+1);
}
if(o.meshes.get(m).vertexBuffer.get(i+2) >= maxZ){
maxZ = o.meshes.get(m).vertexBuffer.get(i+2);
}
if(o.meshes.get(m).vertexBuffer.get(i) <= minX){
minX = o.meshes.get(m).vertexBuffer.get(i);
}
if(o.meshes.get(m).vertexBuffer.get(i+1) <= minY){
minY = o.meshes.get(m).vertexBuffer.get(i+1);
}
if(o.meshes.get(m).vertexBuffer.get(i+2) <= minZ){
minZ = o.meshes.get(m).vertexBuffer.get(i+2);
}
}
}
Vector3f v1 = new Vector3f(maxX, maxY, maxZ);
Vector3f v2 = new Vector3f(minX, minY, minZ);
return new Vector3f[]{v1, v2};
}
- Die Positionierung
Es geht darum, das Objekt genau so zu platzieren, dass es so aussieht, als wäre es “im Slot”. Genau das habe ich schon einmal gemacht und auch schon in einem anderen Thread herausgefunden. Also habe ich GENAU das kopiert. Jetzt ist es aber so, dass, wenn sich der Spieler bewegt, auch das Objekt sich um den Slot herum bewegt(bei dem von dem ich es KOPIERT habe nicht). Im Code ist der Parameter f die Position(linke obere ecke des Slots) und d die Breite/Höhe des Slots; “m” ist die Instanz der Hauptklasse, wo das ganze Matrizen-Zeug berechnet wird(deswegen holt sich das Item das von da).
public void draw(Point2D.Float f, Point2D.Float d) {
float transx, transy, transz;
FloatBuffer buff = BufferUtils.createFloatBuffer(3);
FloatBuffer buff1 = BufferUtils.createFloatBuffer(3);
GLU.gluUnProject(f.x+d.x/2, Display.getHeight()-(f.y+d.y), 0f, m.viewMatrix, m.projMatrix, m.viewPort, buff);
Vector3f point0 = new Vector3f(-1*buff.get(0), -1*buff.get(1), -1*buff.get(2));
GLU.gluUnProject(f.x+d.x/2, Display.getHeight()-(f.y+d.y), 1f, m.viewMatrix, m.projMatrix, m.viewPort, buff1);
Vector3f point1 = new Vector3f(-1*buff1.get(0), -1*buff1.get(1), -1*buff1.get(2));
Vector3f delta = new Vector3f(point1.x-point0.x, point1.y-point0.y, point1.z-point0.z);
delta.normalise();
transx = m.spieler.posX+delta.x;
transy = m.spieler.posY+delta.y;
transz = m.spieler.posZ+delta.z;
m.shader.use();
m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(-transx, -transy, -transz)));
m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.scale(scaleFactor, scaleFactor, scaleFactor)));
o.draw();
m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.translate(transx, transy, transz)));
m.modelMatrix = Main.matrixMultiply(m.modelMatrix, Main.putFloatCoords(Main.scale(1/scaleFactor, 1/scaleFactor, 1/scaleFactor)));
}
Ihr könnt diese Methoden ja mal mit einer beliebigen 2D-Position und einem Mesh testen.