Hallo,
Ich habe zwei kleine Probleme mit einem Java Programm das ich im Moment mit Java Jogl versuche zu schreiben. Zum ersten habe ich ein Problem mit der Datenverwaltung. Da ich eine vielzahl von Gebäuden darstellen möchte habe ich eine ziemlich große Datenmenge die verarbeitet werden soll. Das laden und co funktioniert soweit einwandfrei, allerdings möchte ich mich bei diesen Gebäuden dann mit der Kameraperspektive bewegen können und das Problem ist das ich jedesmal die Daten neu lade bei jeder kleinen Bewegung. Leider weiß ich nicht so ganz wie ich das sonst realisieren soll. Hatte überlegt ob es vieleicht eine Art Container für Objekte gibt, damit man nur diesen neu laden muss. Hab aber im Internet nichts gefunden... Habe auch schon versucht die Gebäude in die "init"-Methode zu schreiben damit diese nur einmal am Anfang aufgerufen werden... Allerdings funktioniert dies genauso wenig.
Hier die relevanten Methoden:
Methode init:
Methode Display
Mein zweites Problem ist, wenn ich zu den Gebäuden hinein zoom verschwinden die ab nehm gewissen Abstand. Da habe ich leider auch keine Ahnung woran das liegen könnte. Denke mal das hängt zusammen mit der reshape-Methode. Allerdings womit genau weiss ich nicht.
Wäre echt super wenn mir da jemand helfen könnte. Da ich doch noch ein bisschen ein Anfänger bin was das angeht und mich nicht sio auskenne.
Danke schonmal im Voraus.
Mit freundlichen Grüßen
Stacks
Ich habe zwei kleine Probleme mit einem Java Programm das ich im Moment mit Java Jogl versuche zu schreiben. Zum ersten habe ich ein Problem mit der Datenverwaltung. Da ich eine vielzahl von Gebäuden darstellen möchte habe ich eine ziemlich große Datenmenge die verarbeitet werden soll. Das laden und co funktioniert soweit einwandfrei, allerdings möchte ich mich bei diesen Gebäuden dann mit der Kameraperspektive bewegen können und das Problem ist das ich jedesmal die Daten neu lade bei jeder kleinen Bewegung. Leider weiß ich nicht so ganz wie ich das sonst realisieren soll. Hatte überlegt ob es vieleicht eine Art Container für Objekte gibt, damit man nur diesen neu laden muss. Hab aber im Internet nichts gefunden... Habe auch schon versucht die Gebäude in die "init"-Methode zu schreiben damit diese nur einmal am Anfang aufgerufen werden... Allerdings funktioniert dies genauso wenig.
Hier die relevanten Methoden:
Methode init:
Java:
public void init(GLAutoDrawable gLDrawable)
{
gl = gLDrawable.getGL();
//kartesische Kamerakoordinaten initialisieren
eye_x = RADIUS*(float)Math.cos(theta)*(float)Math.cos(phi);
eye_y = RADIUS*(float)Math.cos(theta)*(float)Math.sin(phi);
eye_z = RADIUS*(float)Math.sin(theta);
//Endpunkte der Kimme bestimmen
view_up_end_x = eye_x + view_up_x;
view_up_end_y = eye_y + view_up_y;
view_up_end_z = eye_z + view_up_z;
gLDrawable.addKeyListener(this);
// Bestimmung der Maximalwerte
int oneSetter=0;
for(int i=0; i<data.Data.getSize();i++){
for(int j=0;j<data.Data.data.get(i).getSizeWall();j++){
for (int k=0;k<data.Data.data.get(i).wall.get(j).getSize();k++){
data.Point nPoint=data.Data.data.get(i).wall.get(j).getWallPoints(k);
if(oneSetter==0){
xmin=nPoint.getX();
xmax=xmin;
ymin=nPoint.getY();
ymax=ymin;
zmin=nPoint.getZ();
zmax=zmin;
oneSetter++;
}else{
if(nPoint.getX()<xmin){
xmin=nPoint.getX();
}else if(nPoint.getX()>xmax){
xmax=nPoint.getX();
}
if(nPoint.getY()<ymin){
ymin=nPoint.getY();
}else if(nPoint.getY()>ymax){
ymax=nPoint.getY();
}
if(nPoint.getZ()<zmin){
zmin=nPoint.getZ();
}else if(nPoint.getZ()>zmax){
zmax=nPoint.getZ();
}
}
}
}
for(int j=0;j<data.Data.data.get(i).getSizeRoof();j++){
for (int k=0;k<data.Data.data.get(i).roof.get(j).getSize();k++){
data.Point nPoint=data.Data.data.get(i).roof.get(j).getRoofPoints(k);
if(nPoint.getX()<xmin){
xmin=nPoint.getX();
}else if(nPoint.getX()>xmax){
xmax=nPoint.getX();
}
if(nPoint.getY()<ymin){
ymin=nPoint.getY();
}else if(nPoint.getY()>ymax){
ymax=nPoint.getY();
}
if(nPoint.getZ()<zmin){
zmin=nPoint.getZ();
}else if(nPoint.getZ()>zmax){
zmax=nPoint.getZ();
}
}
}
}
//Bestimmung Länge der Seiten
xdiff= xmax-xmin;
ydiff= ymax-ymin;
zdiff= zmax-zmin;
if(xdiff<ydiff){
xdiff=ydiff;
}
if(xdiff<zdiff){
xdiff=zdiff;
}
System.out.println("Ränder berechnen");
}
Methode Display
Java:
public void display(GLAutoDrawable gLDrawable){
// GL-Objekt holen
gl = gLDrawable.getGL();
//GLU- und GLUT-Instanzen erzeugen
glu = new GLU();
// Modellmatrix initialisieren
gl.glLoadIdentity();
// Kamera positionieren
glu.gluLookAt(eye_x,eye_y,eye_z,0,0,0,view_up_x,view_up_y,view_up_z);
//Berechnen und Ausgeben des Winkels zwischen view-up-Vektor und Blickrichtung
float produkt = eye_x*view_up_x+eye_y*view_up_y+eye_z*view_up_z;
float length_eye = (float)Math.sqrt(eye_x*eye_x+eye_y*eye_y+eye_z*eye_z);
float length_view_up =
(float)Math.sqrt(view_up_x*view_up_x+view_up_y*view_up_y+view_up_z*view_up_z);
float angle = (float)Math.acos(produkt/(length_eye*length_view_up));
System.out.println("Winkel zwischen Blickrichtung und view-up-Vektor nach " + number_of_changes +
" Änderungen: " + angle/Math.PI*180);
//--------------------------Bilden der Gebäude------------------------
if ((gl instanceof GLJPanel)
&& !((GLJPanel) gl).isOpaque()
&& ((GLJPanel) gl)
.shouldPreserveColorBufferIfTranslucent()) {
gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
} else {
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
}
//Transformation der Werte zwischen -1 und 1
for(int i=0; i<data.Data.getSize();i++){
System.out.println("new Buidling");
for(int j=0;j<data.Data.data.get(i).getSizeWall();j++){
//System.out.println("new Wall");
gl.glColor3f(1.0f, 1.0f, 0.0f);
gl.glBegin(GL.GL_POLYGON);
for (int k=0;k<data.Data.data.get(i).wall.get(j).getSize();k++){
data.Point nPoint=data.Data.data.get(i).wall.get(j).getWallPoints(k);
gl.glVertex3f((-1+(2*(nPoint.getX()-xmin))/xdiff), (-1+(2*(nPoint.getY()-ymin))/xdiff), (-1+(2*(nPoint.getZ()-zmin))/xdiff));
// System.out.print(nPoint.getX()+" "+nPoint.getY()+" "+nPoint.getZ()+", ");
}
gl.glEnd();
}
for(int j=0;j<data.Data.data.get(i).getSizeRoof();j++){
//System.out.println("new Roof");
gl.glColor3f(1.0f, 1.0f, 1.0f);
gl.glBegin(GL.GL_POLYGON);
for (int k=0;k<data.Data.data.get(i).roof.get(j).getSize();k++){
data.Point nkPoint=data.Data.data.get(i).roof.get(j).getRoofPoints(k);
gl.glVertex3f((-1+(2*(nkPoint.getX()-xmin))/xdiff), (-1+(2*(nkPoint.getY()-ymin))/xdiff), (-1+(2*(nkPoint.getZ()-zmin))/xdiff));
}
gl.glEnd();
}
}
System.out.println("Gebäude zeichnen");
//Pufferinhalt weitergeben
gl.glFlush();
}
Mein zweites Problem ist, wenn ich zu den Gebäuden hinein zoom verschwinden die ab nehm gewissen Abstand. Da habe ich leider auch keine Ahnung woran das liegen könnte. Denke mal das hängt zusammen mit der reshape-Methode. Allerdings womit genau weiss ich nicht.
Java:
public void reshape(GLAutoDrawable gLDrawable, int x, int y,
int width, int height){
GL gl = gLDrawable.getGL();
float h = (float) height / (float) width;
gl.glMatrixMode(GL.GL_PROJECTION);
System.err.println("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR));
System.err.println("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER));
System.err.println("GL_VERSION: " + gl.glGetString(GL.GL_VERSION));
gl.glLoadIdentity();
gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
}
Wäre echt super wenn mir da jemand helfen könnte. Da ich doch noch ein bisschen ein Anfänger bin was das angeht und mich nicht sio auskenne.
Danke schonmal im Voraus.
Mit freundlichen Grüßen
Stacks