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
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?
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?
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
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.
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.
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
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
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.
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
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.