3D-Modell verändern

Hallo
Ich möchte, dass die Punkte eines 3D-Modells mit der Maus “verzogen” werden können. Jedoch funktioniert das nicht, da der gezogene Punkt nicht an der Maus Position ist. Auch wenn man das Modell dreht ändert sich die Entfernung des gezogenen Punktes zum Nullpunkt. Jedoch könnt ihr das selbst herausfinden und werdet schnell das Problem merken, hier ein KSKB:
Steuerung: Klick(nicht auf Punkt): Start Drehung
Erneuter Klick: Stopp Drehung
Punkt klicken und gedrückt halten und herumziehen: Punkt verschieben

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_ELEMENT_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
import static org.lwjgl.opengl.GL15.glBindBuffer;
import static org.lwjgl.opengl.GL15.glBufferData;
import static org.lwjgl.opengl.GL15.glGenBuffers;

import java.awt.Canvas;
import java.awt.Dimension;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import javax.swing.JFrame;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;


public class KSKB {

	private JFrame f;
	int w, h;
	private boolean meshRotiert;
	private float meshRot;
	FloatBuffer viewMatrix;
	IntBuffer ViewPort;
	FloatBuffer ProjMatrix;
	private Mesh anzeige;
	private int[] indecies = {
			0, 1, 0, 4, 0, 2, 5, 1, 5, 4, 5, 7,
			4, 6, 1, 3, 2, 6, 6, 7, 7, 3, 3, 2
	};
	private float[] coords = {
			-0.05f, -0.015f,  0.1f,
			 0.05f, -0.015f,  0.1f,
			-0.05f, -0.015f, -0.1f,
			 0.05f, -0.015f, -0.1f,
			-0.025f,  0.015f,  0.08f,
			 0.025f,  0.015f,  0.08f,
			-0.025f,  0.015f, -0.08f,
			 0.025f,  0.015f, -0.08f
	};
	private boolean punktGeklickt;
	private int punktIndex;
	private float mausX;
	private float mausY;
	private float mausZ;
	private boolean rot;

	public KSKB(){
		f = new JFrame("KSKB");
        f.setPreferredSize(new Dimension(700, 550));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation(900, 50);
        f.pack();
        Canvas canvas = new Canvas();
        f.add(canvas);
        try {
        Display.setParent(canvas);
        f.setVisible(true);
        Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }
        w = Display.getWidth();
        h = Display.getHeight();
        anzeige = new Mesh(coords, indecies);
        while(!Display.isCloseRequested()){
        	draw();
        	if(Mouse.isButtonDown(0)){
        		if(!punktGeklickt){
        			for(int i = 0; i < 24; i += 3){
						float pX = anzeige.coords**;
						float pY = anzeige.coords[i+1];
						float pZ = anzeige.coords[i+2];
				        FloatBuffer PunktBuffer = BufferUtils.createFloatBuffer(3);
						GLU.gluProject(pX, pY, pZ, viewMatrix, ProjMatrix, ViewPort, PunktBuffer);
						
						System.out.println(PunktBuffer.get(0)+" "+PunktBuffer.get(1)+" - "+
							Mouse.getX()+" "+Mouse.getY());
						if(Mouse.getX() > PunktBuffer.get(0)-3 && Mouse.getX() < PunktBuffer.get(0)+3 &&
								Mouse.getY() > PunktBuffer.get(1)-3 && Mouse.getY() < PunktBuffer.get(1)+3){
							System.out.println("geht");
							punktGeklickt = true;
							punktIndex = i;
							break;
						}
					}
        		}
        		if(!punktGeklickt){
        			rot = true;
        		}
        	}
        	if(punktGeklickt){
					anzeige.coords[punktIndex] = mausX;
					anzeige.coords[punktIndex+1] = mausY;
					anzeige.coords[punktIndex+2] = mausZ;
					anzeige.reload();
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
			}
        	if(!Mouse.isButtonDown(0)){
        		if(punktGeklickt){
        			punktGeklickt = false;
        		}
        		if(rot){
        			if(meshRotiert){
        				meshRotiert = false;
        				rot = false;
        			}else{
        				meshRotiert = true;
        				rot = false;
        			}
        			try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
        		}
        	}
            Display.update();
        }
        Display.destroy();
	}
	
	private void draw() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glViewport(0, 0, w, h);
        glEnable(GL_BLEND);
	    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluPerspective(45, (float) w / (float) h, 0.1f, 100);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
		
		float x, y, z;
    	FloatBuffer buff = BufferUtils.createFloatBuffer(3);
        FloatBuffer buff1 = BufferUtils.createFloatBuffer(3);
        viewMatrix = BufferUtils.createFloatBuffer(16);
        glGetFloat(GL_MODELVIEW_MATRIX, viewMatrix);
        ViewPort = BufferUtils.createIntBuffer(16);
        glGetInteger(GL_VIEWPORT, ViewPort);
        ProjMatrix = BufferUtils.createFloatBuffer(16);
        glGetFloat(GL_PROJECTION_MATRIX, ProjMatrix);
        GLU.gluUnProject(w/2, h/2, 0f, viewMatrix, ProjMatrix, ViewPort, buff);
        Vector3f point0 = new Vector3f(-1*buff.get(0), -1*buff.get(1), -1*buff.get(2));
        GLU.gluUnProject(w/2, h/2, 1f, viewMatrix, ProjMatrix, 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();
        x = delta.x;
        y = delta.y;
        z = delta.z;
        glTranslatef(-1*x, -1*y, -1*z);
        if(meshRotiert){
        	meshRot+=0.1f;
        }
        glRotatef(meshRot, 1, 1, 1);
        
    	viewMatrix = BufferUtils.createFloatBuffer(16);
    	glGetFloat(GL_MODELVIEW_MATRIX, viewMatrix);
    	ViewPort = BufferUtils.createIntBuffer(16);
    	glGetInteger(GL_VIEWPORT, ViewPort);
    	ProjMatrix = BufferUtils.createFloatBuffer(16);
    	glGetFloat(GL_PROJECTION_MATRIX, ProjMatrix);
    	
        reloadMousePos();
        anzeige.draw();
        glPointSize(2.5f);
        glColor3f(1, 1, 0);
        glBegin(GL_POINTS);
        for(int i = 0; i < 24; i += 3){
        	glVertex3f(anzeige.coords**, anzeige.coords[i+1], anzeige.coords[i+2]);
        	glColor3f(1, 1, 0);
        }
        glEnd();
        glRotatef(-meshRot, 1, 1, 1);
        glTranslatef(x, y, z);
	}
	
	

	private void reloadMousePos() {
		FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
		FloatBuffer buf1 = BufferUtils.createFloatBuffer(3);

		GLU.gluUnProject(Mouse.getX(), Mouse.getY(), 0, viewMatrix, ProjMatrix, ViewPort, buf0);
		GLU.gluUnProject(Mouse.getX(), Mouse.getY(), 1, viewMatrix, ProjMatrix, ViewPort, buf1);
		Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
		Vector3f punkt1 = new Vector3f(buf1.get(0), buf1.get(1), buf1.get(2));
		Vector3f delta = new Vector3f(punkt1.x-punkt0.x, punkt1.y-punkt0.y, punkt1.z-punkt1.z);
        delta.normalise();
		mausX = delta.x;
        mausY = delta.y;
        mausZ = delta.z;
	}

	public static void main(String[] args){
		new KSKB();
	}
	
	public class Mesh{

		public float[] coords;
		public int[] indecies;
		private FloatBuffer vertexBuffer;
		private int mode;
		private int vboID;
		private IntBuffer indexBuffer;
		private int iboID;

		public Mesh(float[] coords, int[] indecies) {
			this.coords = coords;
			this.indecies = indecies;
			reload();
		}
		
		public void reload(){
			mode = GL_LINES;
			vertexBuffer = putFloatCoords(coords);
			indexBuffer = putIntCoords(indecies);
			vboID = createVBO(vertexBuffer);
			iboID = createIBO(indexBuffer);
		}
		
		public void draw(){
			glColor4f(1, 1, 1, 1);
	        glEnableClientState(GL_VERTEX_ARRAY);
	        
	        glBindBuffer(GL_ARRAY_BUFFER, vboID);
	        glVertexPointer(3, GL_FLOAT, 0, 0);
	        
	        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
	        
	        glDrawElements(mode, indexBuffer.capacity(), GL_UNSIGNED_INT, 0);
	        
	        glDisableClientState(GL_VERTEX_ARRAY);
		}
		
	}
	
	public static FloatBuffer putFloatCoords(float[] coords){
		ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);
	    vbb.order(ByteOrder.nativeOrder());
	    FloatBuffer vertexBuffer = vbb.asFloatBuffer();
	    vertexBuffer.put(coords);
	    vertexBuffer.position(0);
	    return vertexBuffer;
	}
	
	public static IntBuffer putIntCoords(int[] ints){
		ByteBuffer vbb = ByteBuffer.allocateDirect(ints.length * 4);
	    vbb.order(ByteOrder.nativeOrder());
	    IntBuffer vertexBuffer = vbb.asIntBuffer();
	    vertexBuffer.put(ints);
	    vertexBuffer.position(0);
	    return vertexBuffer;
	}
	
	public static int createVBO(FloatBuffer b){
		int id;
		id = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, id);
        glBufferData(GL_ARRAY_BUFFER, b, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
		return id;
	}
	
	public static int createIBO(IntBuffer b){
		int id;
		id = glGenBuffers();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, b, GL_STATIC_DRAW);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
		return id;
	}
}

Das ganze ist ziemlich messy. Es ist jetzt natürlich schwer, einzuschätzen, wie viel von der „messiness“ daher kommt, dass es in ein KSKB gepackt wurde (<-Das an sich ist natürlich super!). Aber … man muss wohl davon ausgehen, dass bestimmte Sachen so sind, wie sie auch im Original sind (warum hättest du sie für ein KSKB ändern sollen?). Es stellen sich viele Fragen. Z.B. warum VBOs verwendet werden, wenn am Ende doch mit glVertex gezeichnet wird. Das ganze push/popMatrix-Zeug wird natürlich bei neuerem GL wegfallen, aber … ich sehe auch, dass das die Einstiegshürde deutlich höher macht (man muss sich dann um den ganzen Matrixmultiplikationskram selbst kümmern…). Insgesamt sieht der Code ziemlich unkoordiniert und viel nach „trial and error“ aus, aber…
Genug gemotzt :slight_smile:

Das schwierige bei so einer Interaktion ist, dass man die Zielposition für den Vertex nur indirekt aus der Mausposition berechnen kann. Man bewegt die Maus irgendwo hin, aber dieser Punkt ist erstmal nur 2D, auf dem Bildschirm. Egal, wie man den in 3D umrechnet: Es bleibt immer eine Dimension übrig, bei der man nicht weiß, welchen Wert sie haben soll.

Es gibt nun verschiedene Möglichkeiten, das zu lösen. Wenn man „präzise“ z.B. in einem CAD-System arbeiten will, würde man den Punkt nur auf einer vordefinierten Achse oder Ebene bewegen wollen, womit dieses Problem gelöst ist. Dann müßte man aber angeben, welche Achse/Ebene das sein soll (und je nachdem, welche das ist, kann das SEHR unschöne Effekte haben, wenn man nicht genau weiß, was man tut. Dann kann ein Punkt (speziell bei Perspektivischer Ansicht) leicht mal „ins Unendliche“ abhauen. (Das Ding heißt nicht umsonst „Fluchtpunkt“. (Nein, das war KEIN lahmes Wortspiel!)).

Wenn man eher „intuitiv“ arbeiten will, könnte man sich ja z.B. wünschen, dass der Punkt, während man ihn bewegt, immer unter der Mausposition bleibt. Das ist dann aber auch etwas frickelig, weil man ja immer die View-Matrix mit in die Berechnungen einbeziehen muss. (Und speziell wenn man sich nicht ein paar praktische Utility-Methoden anlegt, sondern das ganze mit händischen gluUnproject-Aufrufen macht, wird das schnell ziemlich unschön…). Wie auch immer. Ein GROBER Möglicher ansatz ist:

  1. Bei einem Klick bestimmt man, ob ein Punkt von dem Klick getroffen wurde
  2. Wenn ein Punkt getroffen wurde, bestimmt man, wie weit dieser Punkt (in Weltkoordinaten!) vom „Auge“ weg ist
  3. Wenn man die Maus bewegt, berechnet man den Picking Ray, der vom Auge startet, und Länge 1 hat
  4. Den geklickten Punkt verschiebt man dann da hin, wo der Picking ray hinzeigt - und zwar in der Entfernung vom Auge, die er beim Klick hatte!

Hab’ mal versucht, das aufzumalen:

(Nebenbei: Die Zeile

Vector3f delta = new Vector3f(punkt1.x-punkt0.x, punkt1.y-punkt0.y, punkt1.z-punkt1.z);

im ursprünglichen Code hat mich ein bißchen rausgehauen. Vermutlich siehst du den Fehler jetzt selbst ;-))

Hab’ auch mal versucht, das in das KSKB reinzustümpern. Die wichtigsten Änderungen sind mit „XXX“ markiert. Es funktioniert nicht „perfekt“ (der Punkt ist nicht immer unter der Maus), aber könnte (!) schon recht nah’ an dem sein, was du suchst.

Nochmal der obligatorische Tipp: Räum’ das ganze auf! (Sonst wird es immer frickeliger…)

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_ELEMENT_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
import static org.lwjgl.opengl.GL15.glBindBuffer;
import static org.lwjgl.opengl.GL15.glBufferData;
import static org.lwjgl.opengl.GL15.glGenBuffers;
 
import java.awt.Canvas;
import java.awt.Dimension;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
 
import javax.swing.JFrame;
 
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;
 
 
public class ModelEditor {
 
    private JFrame f;
    int w, h;
    private boolean meshRotiert;
    private float meshRot;
    FloatBuffer viewMatrix;
    IntBuffer ViewPort;
    FloatBuffer ProjMatrix;
    private Mesh anzeige;
    private int[] indecies = {
            0, 1, 0, 4, 0, 2, 5, 1, 5, 4, 5, 7,
            4, 6, 1, 3, 2, 6, 6, 7, 7, 3, 3, 2
    };
    private float[] coords = {
            -0.05f, -0.015f,  0.1f,
             0.05f, -0.015f,  0.1f,
            -0.05f, -0.015f, -0.1f,
             0.05f, -0.015f, -0.1f,
            -0.025f,  0.015f,  0.08f,
             0.025f,  0.015f,  0.08f,
            -0.025f,  0.015f, -0.08f,
             0.025f,  0.015f, -0.08f
    };
    private boolean punktGeklickt;
    private int punktIndex;
    private float mausX;
    private float mausY;
    private float mausZ;
    private boolean rot;

    // XXX
    private float draggedPointDistanceToEye = 0;
    
 
    public ModelEditor(){
        f = new JFrame("KSKB");
        f.setPreferredSize(new Dimension(700, 550));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation(900, 50);
        f.pack();
        Canvas canvas = new Canvas();
        f.add(canvas);
        try {
        Display.setParent(canvas);
        f.setVisible(true);
        Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }
        w = Display.getWidth();
        h = Display.getHeight();
        anzeige = new Mesh(coords, indecies);
        while(!Display.isCloseRequested()){
            draw();
            if(Mouse.isButtonDown(0)){
                if(!punktGeklickt){
                    for(int i = 0; i < 24; i += 3){
                        float pX = anzeige.coords**;
                        float pY = anzeige.coords[i+1];
                        float pZ = anzeige.coords[i+2];
                        FloatBuffer PunktBuffer = BufferUtils.createFloatBuffer(3);
                        GLU.gluProject(pX, pY, pZ, viewMatrix, ProjMatrix, ViewPort, PunktBuffer);
                       
                        //System.out.println(PunktBuffer.get(0)+" "+PunktBuffer.get(1)+" - "+ Mouse.getX()+" "+Mouse.getY());
                        if(Mouse.getX() > PunktBuffer.get(0)-3 && Mouse.getX() < PunktBuffer.get(0)+3 &&
                                Mouse.getY() > PunktBuffer.get(1)-3 && Mouse.getY() < PunktBuffer.get(1)+3){
                            //System.out.println("geht");
                            punktGeklickt = true;
                            punktIndex = i;
                            
                            // XXX
                            Vector3f eyeInWorldPos = computeWorldPosition(w/2, h/2);
                            Vector3f clickedPoint = new Vector3f(pX, pY, pZ);
                            Vector3f diff = new Vector3f();
                            Vector3f.sub(clickedPoint, eyeInWorldPos, diff);
                            draggedPointDistanceToEye = diff.length();
                            
                            System.out.println("eye     "+eyeInWorldPos);
                            System.out.println("Clicked "+clickedPoint);
                            System.out.println("diff    "+diff);
                            
                            break;
                        }
                    }
                }
                if(!punktGeklickt){
                    rot = true;
                }
            }
            if(punktGeklickt){
                    
                // XXX
                Vector3f v = computePickingRay(Mouse.getX(), Mouse.getY());
                System.out.println("ray     "+v);
                v.scale(draggedPointDistanceToEye);
                Vector3f eyeInWorldPos = computeWorldPosition(w/2, h/2);
                Vector3f p = new Vector3f(
                    eyeInWorldPos.x + v.x,
                    eyeInWorldPos.y + v.y,
                    eyeInWorldPos.z + v.z);
                System.out.println("eye     "+eyeInWorldPos);
                System.out.println("Move to "+p);
                anzeige.coords[punktIndex+0] = p.x;
                anzeige.coords[punktIndex+1] = p.y;
                anzeige.coords[punktIndex+2] = p.z;
                anzeige.reload();
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if(!Mouse.isButtonDown(0)){
                if(punktGeklickt){
                    punktGeklickt = false;
                }
                if(rot){
                    if(meshRotiert){
                        meshRotiert = false;
                        rot = false;
                    }else{
                        meshRotiert = true;
                        rot = false;
                    }
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            Display.update();
        }
        Display.destroy();
    }
   
    private void draw() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glViewport(0, 0, w, h);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluPerspective(45, (float) w / (float) h, 0.1f, 100);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
       
        float x, y, z;
        FloatBuffer buff = BufferUtils.createFloatBuffer(3);
        FloatBuffer buff1 = BufferUtils.createFloatBuffer(3);
        viewMatrix = BufferUtils.createFloatBuffer(16);
        glGetFloat(GL_MODELVIEW_MATRIX, viewMatrix);
        ViewPort = BufferUtils.createIntBuffer(16);
        glGetInteger(GL_VIEWPORT, ViewPort);
        ProjMatrix = BufferUtils.createFloatBuffer(16);
        glGetFloat(GL_PROJECTION_MATRIX, ProjMatrix);
        GLU.gluUnProject(w/2, h/2, 0f, viewMatrix, ProjMatrix, ViewPort, buff);
        Vector3f point0 = new Vector3f(-1*buff.get(0), -1*buff.get(1), -1*buff.get(2));
        GLU.gluUnProject(w/2, h/2, 1f, viewMatrix, ProjMatrix, 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();
        x = delta.x;
        y = delta.y;
        z = delta.z;
        glTranslatef(-1*x, -1*y, -1*z);
        if(meshRotiert){
            meshRot+=0.1f;
        }
        glRotatef(meshRot, 1, 1, 1);
       
        viewMatrix = BufferUtils.createFloatBuffer(16);
        glGetFloat(GL_MODELVIEW_MATRIX, viewMatrix);
        ViewPort = BufferUtils.createIntBuffer(16);
        glGetInteger(GL_VIEWPORT, ViewPort);
        ProjMatrix = BufferUtils.createFloatBuffer(16);
        glGetFloat(GL_PROJECTION_MATRIX, ProjMatrix);
       
        reloadMousePos();
        anzeige.draw();
        glPointSize(2.5f);
        glColor3f(1, 1, 0);
        glBegin(GL_POINTS);
        for(int i = 0; i < 24; i += 3){
            glVertex3f(anzeige.coords**, anzeige.coords[i+1], anzeige.coords[i+2]);
            glColor3f(1, 1, 0);
        }
        glEnd();
        glRotatef(-meshRot, 1, 1, 1);
        glTranslatef(x, y, z);
    }

    // XXX
    private Vector3f computePickingRay(int x, int y)
    {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        FloatBuffer buf1 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(x, y, 0, viewMatrix, ProjMatrix, ViewPort, buf0);
        GLU.gluUnProject(x, y, 1, viewMatrix, ProjMatrix, ViewPort, buf1);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        Vector3f punkt1 = new Vector3f(buf1.get(0), buf1.get(1), buf1.get(2));
        Vector3f delta = new Vector3f(punkt1.x-punkt0.x, punkt1.y-punkt0.y, punkt1.z-punkt0.z);
        delta.normalise();
        return delta;
    }
    private Vector3f computeWorldPosition(int x, int y)
    {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        GLU.gluUnProject(x, y, 0, viewMatrix, ProjMatrix, ViewPort, buf0);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        return punkt0;
    }
    
   
 
    private void reloadMousePos() {
        FloatBuffer buf0 = BufferUtils.createFloatBuffer(3);
        FloatBuffer buf1 = BufferUtils.createFloatBuffer(3);
 
        GLU.gluUnProject(Mouse.getX(), Mouse.getY(), 0, viewMatrix, ProjMatrix, ViewPort, buf0);
        GLU.gluUnProject(Mouse.getX(), Mouse.getY(), 1, viewMatrix, ProjMatrix, ViewPort, buf1);
        Vector3f punkt0 = new Vector3f(buf0.get(0), buf0.get(1), buf0.get(2));
        Vector3f punkt1 = new Vector3f(buf1.get(0), buf1.get(1), buf1.get(2));
        Vector3f delta = new Vector3f(punkt1.x-punkt0.x, punkt1.y-punkt0.y, punkt1.z-punkt0.z);
        delta.normalise();
        mausX = delta.x;
        mausY = delta.y;
        mausZ = delta.z;
    }
 
    public static void main(String[] args){
        new ModelEditor();
    }
   
    public class Mesh{
 
        public float[] coords;
        public int[] indecies;
        private FloatBuffer vertexBuffer;
        private int mode;
        private int vboID;
        private IntBuffer indexBuffer;
        private int iboID;
 
        public Mesh(float[] coords, int[] indecies) {
            this.coords = coords;
            this.indecies = indecies;
            reload();
        }
       
        public void reload(){
            mode = GL_LINES;
            vertexBuffer = putFloatCoords(coords);
            indexBuffer = putIntCoords(indecies);
            vboID = createVBO(vertexBuffer);
            iboID = createIBO(indexBuffer);
        }
       
        public void draw(){
            glColor4f(1, 1, 1, 1);
            glEnableClientState(GL_VERTEX_ARRAY);
           
            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glVertexPointer(3, GL_FLOAT, 0, 0);
           
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
           
            glDrawElements(mode, indexBuffer.capacity(), GL_UNSIGNED_INT, 0);
           
            glDisableClientState(GL_VERTEX_ARRAY);
        }
       
    }
   
    public static FloatBuffer putFloatCoords(float[] coords){
        ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);
        vbb.order(ByteOrder.nativeOrder());
        FloatBuffer vertexBuffer = vbb.asFloatBuffer();
        vertexBuffer.put(coords);
        vertexBuffer.position(0);
        return vertexBuffer;
    }
   
    public static IntBuffer putIntCoords(int[] ints){
        ByteBuffer vbb = ByteBuffer.allocateDirect(ints.length * 4);
        vbb.order(ByteOrder.nativeOrder());
        IntBuffer vertexBuffer = vbb.asIntBuffer();
        vertexBuffer.put(ints);
        vertexBuffer.position(0);
        return vertexBuffer;
    }
   
    public static int createVBO(FloatBuffer b){
        int id;
        id = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, id);
        glBufferData(GL_ARRAY_BUFFER, b, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        return id;
    }
   
    public static int createIBO(IntBuffer b){
        int id;
        id = glGenBuffers();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, b, GL_STATIC_DRAW);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        return id;
    }
}

Danke, das war genau das was ich wollte. Mir ist aber nicht in den Sinn gekommen, dass die Punkte ja gleich weit vom Auge entfernt sein müssen, um vernünftige Ergebnisse zu erzielen.