Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 17:44

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Apr 20, 2010 16:32 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Hallo alle zusammen.

Wie der Titel schon sagt, ich bin auf der Suche nach eine Lösung, wie man ein Objekt verschieben oder skalieren kann.
Ich benutze OpenGL ES 1.0 für Andoird Plattform und programmiere somit in Java. Zur Zeit ist es so, dass ich mir Objekte in Blender erstelle und mithilfe eines Obj-Loaders diese laden tuhe. Jetzt möchte ich erfahren wie ich ein Objekt, wenn ich 2 Objekte habe, verschieben kann. Ich habe also zwei Cubes (mit Blender erstellt) und eins davon möchte ich nach dem laden verschieben können. Was muss ich berücksichtigen?
Wenn ich die Objekte geladen habe, wird bei mir eine Liste mit Objekten erstellt (die die ganze Daten beinhalten, Punkte, Relationen, Farbe etc..). Darauf hin, wie es sich bei OpenGL ES gehört initialiesere ich die Buffer mit den Daten und lasse sie zeichnen so sieht es dann aus:

Code:
gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertices);  // Punkte
      gl.glNormalPointer(GL10.GL_FIXED, 0, normals);// Normalen
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// setze den Status
      gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);// Status setzten

      gl.glDrawElements(GL10.GL_TRIANGLES, verts, GL10.GL_UNSIGNED_SHORT, indices);// Zeichnen


Diese befehle führe ich aus für jedes einzelnes Objekt. Bzw. im jedem Objekt wird das ganze ausgeführt. Wie kann ich jetzt eins davon nehmen (das Iterrieren durch die Objekte kann ich ja schon :)) und verschieben. Ich kann ja mithilfe von Objekten auf die Daten wie vertices, normals... zugreifen. Was bringt es mir jedoch?

Und noch ne Frage, muss ich erst einen Cube löschen, dann den Cube den ich verschieben möchte, verschieben und dann das Cube, das ich gelöscht habe wieder Zeichnen??? Wäre das eine gute Lösung?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 20, 2010 17:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

bei OpenGLES 1.0 kannst du das noch ganz simpel über glTranslate, glRotate und glScale machen :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 20, 2010 19:40 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Hi. Das stimmt, danke für deine Antwort.
Wenn ich z.B. glRotate anwende rotieren sich beide würfel. Ich möchte sie getrennt behandeln und dies zum jeden Zeitpunkt. Bei Java3D z.B. kann ich ja eine TransformGroup erstellen und ein Objekt dieser Gruppe zuordnen oder auch mehrere. Und je nach dem entweder einen anderen rotieren lassen.
Wie wird es in OpenGL ES gemacht? Weist du das?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 20, 2010 19:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Du mußt entweder nach dem rotieren einfach wieder zurück rotieren zum original zustand, also etwa so:

Code:
glRotatef(90, 1, 0, 0);
// Zeichne Cube 1...
glRotatef(-90, 1, 0, 0);

glRotatef(130, 0, 1, 0);
// Zeichne Cube 2...
glRotatef(-130, 0, 1, 0);


oder was eleganter ist, du benutzt glPushMatrix und glPopMatrix:

Code:
glPushMatrix();
glRotatef(90, 1, 0, 0);
// Zeichne Cube 1...
glPopMatrix();

glPushMatrix();
glRotatef(130, 0, 1, 0);
// Zeichne Cube 2...
glPopMatrix();


Aya~


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 20, 2010 20:31 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Aha :).

Also warte, ich verstehe es so, die Funktion onDrawFrame(GL10 gl) wird ja ständig aufgerufen. Oder nicht? Und die Cubes werden ständig neu gezeichnet (logischer Weise, wenn die Funktion ja ständig aufgerufen wird). Jetzt muss jeweils zwischen den Cubes die Rotationen und schon muss es klappen. Ich versuche es mal :). Komme aber wieder um die Ergebnisse mitzuteilen :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Apr 20, 2010 22:27 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Es hat geklappt :), vielen vieln Dank für die Hilfe. Dieser Forum ist Einfach das geilste :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 22, 2010 11:25 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Hi da bin ich wieder.

Ich brauche wieder einbisschen Hilfe und frage nach eure Autorität :).

Das Laden, scalieren, rotieren habe ich wunderbar hinbekommen. Das Problem liegt jetzt daran, dass das Objekt, das nicht Ursprungskordinaten besitzt, nicht um eigene Achse gedreht wird. Das Heist wenn ich ein Cube habe (Jede seite eines Cubes ist 1cm lang z.B.), das auf der X-Achse z.B. bei -2 sich befindet, im Raudius von 2cm vom Mittelpunkt gedreht wird. Auch wenn ich dieses Cube ins Ursprungposition transformiere, und dann rotiere, sehe ich kein Ergebniss. Es ist so als ob nicht die Position des Cubes ausgetauscht wird, sondern die Position der Ebene auf der sich der Cube befindet.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 22, 2010 12:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

umh so ganz verstehen tue ich grad nicht genau was du meinst, aber.. wenn du einen Cube via glTranslate um 5 einheiten auf X verschiebst und dann via glRotate drehst bekommst du ein anderes ergebnis als wenn du erst drehst und dann verschiebst.

Also:

Um den Cube um seinen mittelpunkt zu drehen:
Zuerst: glTranslate
Dann: glRotate

Um den Cube im 5cm radius um den welt mittelpunkt zu drehen:
Zuerst: glRotate
Dann glTranslate(5cm..);

War es das was du meinst?

Oder meinst du das dein Objekt sich von anfang an nicht im Ursprung befindet, also es nicht via glTranslate etc verschoebne wurde, sondern die vertices schon sonstwo sind? Dann müßtest du den mittelpunkt des Objektes errechnen und zuerst um diesen zurück translaten.

Mittelpunkt findest du in dem du alle vertices des Objektes durchgehst und jeweils den minimalen und maximalen wert von X, Y und Z dir speicherst. Und dann einfach eben den mittelpunkt zwischen minX und maxX etc.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 22, 2010 13:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Falls es das ist, was Aya vermutet, dann schau mal ins Tutorial_Matrix2

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Apr 22, 2010 19:16 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Hi.

Danke für die Antworten. Ich denke Ihr habt mich nicht Vertsanden. Ich transformiere das Objekt in die Mittelpunkt position also (0,0,0) und dann lass ich ihn rotieren. Der Cube dreht sich jedoch nicht um seine eigene Achse, sondern im Radius von bla bla cm.
Also wenn ich ein Cube im Blender erstellt habe der auf X-Achse bei 5 stand, dreht er den Cube im Radius von 5cm auch wenn ich ihn in die Ursprungspositoon (0,0,0) stelle.
Ich habe eine Anwendung die auf Handy läuft, per Touchscreen bewege ich die Modele. Am Anfang steht der Cube wirklich auf x=5, dann ziehe ich ihn ins mittelpunkt lass ihn rotieren, klappt net :(


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 23, 2010 09:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wäre schlimm, wenn es nicht so wäre ^^
Wenn du in Blender dein Objekt bei X=5 positionierst, dann wird beim exportieren die Transformationsmatrix auf das Mesh angewendet und damit hat dein Mesh nun nicht mehr die Lokalen Koordinaten sondern alle sind mit X+5 versetzt.
Entweder du packt das Objekt, in Blender, wieder auf 0,0,0 oder du fängst an recht kompliziert die Transformation auf X-Achse zu kompensieren.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 23, 2010 09:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Prinzipiell sollte es reichen VOR dem rotieren das Objekt auf den Nullpunkt zu verschieben und ggf. dannach dann halt wieder zurück schieben.

Also etwa:

Code:
glTranslate(-5, 0, 0);
glRotate(angle, 0, 1, 0);
glTranslate(5, 0, 0);


Einfacher wäre aber natürlich entweder in Blender schon im Nullpunkt zu modelieren, oder alternativ beim Export die VertexKoordinaten im LocalSpace belassen und eben die Transformations Informationen mit exportieren.. oder eben beim Import anhand der Bounding Box den mittelpunkt berechnen und dann alle Vertices dementsprechend offsetten.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Apr 23, 2010 21:26 
Offline
DGL Member

Registriert: So Mär 14, 2010 16:53
Beiträge: 24
Hi.

Habe es jetzt so gemacht, dass beim Importiern des Objectes (da sowieso jede einzelne Kooridnate ausgelesen wird) nach den kleinsten und größten wert für x,y,z Achse geschaut wird. Anhand diesen Daten kann ich den Mittelpunkt des Cubes oder was auch immer es ist berechnen. Bevor das Objekt dem Renderer übergeben wird, verschiebe ich alle Punkte, so dass das Objekt sich genau auf 0,0,0 befindet :). Es klappt auch wunderbar muss ich mal sagen :)

Aber weis ja nicht was sonst noch so kommt. Und ob es nicht wirklich eine bessere Lösun dafür gäbe hmmm


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 17 Queries | GZIP : On ]