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