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

Aktuelle Zeit: Fr Jul 18, 2025 07:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jun 30, 2010 13:18 
Offline
DGL Member

Registriert: Mi Okt 28, 2009 16:51
Beiträge: 10
Hallo Forumnutzer,

da ich hier immer super Tipps bekomme habe, werde ich es heute wieder versuchen ;-)

Ich habe eine Szene ähnlich dem Bild unten angefertigt. Die Kamera wird an der Position (0, 0, -5) initialisiert und schaut auf die Szene. Die Squares (x,y) sind feste in der Szene befestigt. Nun möchte ich es erreichen, dass ich mit der Kamera rotiere. Z.B. zu der linken oberen Ecke. Ich würde also einmal um die x und einmal um die y-Achse rotieren.


Problem ist nur, dass die Szene sich ständig anpasst und nicht bleibt. Also schaue ich immer in die Mitte und schaffe es nicht die obere linke Ecke zu betrachten (mit der Kamera).

Gibt es eine Möglichkeit das doch zu realisieren? Könnt ihr mir da ein bisschen helfen?


Hier ist mal ein Ausschnitt von meinem bisherigen Code:

Setup der Kamera
Code:
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);
glMatrixMode(GL_PROJECTION);

glLoadIdentity();
float ratio = self.bounds.size.width / self.bounds.size.height;
glFrustumf(-ratio, ratio, -ratio, ratio, 1, 1000);
glEnable(GL_DEPTH_TEST);

glMatrixMode(GL_MODELVIEW);


render-Funktion, die ständig updated:
Code:
[EAGLContext setCurrentContext:context];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

static const GLfloat squareVertices[] = {
    -0.5f,  -0.33f,
    0.5f,  -0.33f,
    -0.5f,   0.33f,
    0.5f,   0.33f,
};



static const GLubyte squareColors[] = {
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255,
};


glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);


glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];


Das Ganze versuche ich auf einem iPhone zu realisieren. Die Größe des Displays ist da 320 * 480 px;

Soooo und nun könnt ihr mir helfen ;-)

Danke RapidM


Zuletzt geändert von rapidm am Do Jul 01, 2010 11:16, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 30, 2010 14:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Nach:

Code:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();


rotierst du mittels glRotate einmal um x und einmal um y. z.B.

oder du nutzt gluLookAt. Wobei ich nicht weiss ob das bei OpenGL ES überhaupt noch zur Verfügung steht.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 30, 2010 14:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
oder du nutzt gluLookAt. Wobei ich nicht weiss ob das bei OpenGL ES überhaupt noch zur Verfügung steht.

Liegt glaub ich an der OpenGL ES Version....jedenfalls wenn es kein gluLookAt gibt ist das auch schnell programmiert. Die nötige Berechnung der Matrix findet sich im Wiki. Ansonsten einfach mal mein CoolMath anschauen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 30, 2010 15:07 
Offline
DGL Member

Registriert: Mi Okt 28, 2009 16:51
Beiträge: 10
Also ich habe das mit rotatef() dahinter versucht. Allerdings rotiert wieder nur das Viereck ;-(

Ich habe gluLookAt & glFrustum als Funktion in OpenGLES integriert. Kann man das dann auch einfach damit machen? Problem ist wirklich, dass es nicht auf das Objekt angewendet werden soll, sondern die XY-Plane konstant stehen bleiben soll ...

Eine andere Überlegung war von mir die Objekte auf der XY Plane zu positionieren und dann diese entsprechend zu Transformieren mittels Translatef(). Meint ihr das geht so einfach?

LG & DANKE für die ganzen Tipps...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 30, 2010 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also du solltest mal versuchen GENAU zu sagen was du erreichen willst.

Ich weiß einfach nicht was du mit "Problem ist nur, dass die Szene sich ständig anpasst und nicht bleibt." oder "die XY-Plane konstant stehen bleiben soll" meinst. ;)

Jedenfalls kannst du mit gluLookAt recht intuitiv angeben wo du hinschauen willst. Du sagst einfach wo der Betrachter sein soll und nennst einen Punkt auf den die Kamera blicken soll. Fertig. Wichtig ist natürlich das du gluLookAt an der richtigen Stelle auf die ModelView-Matrix anwendest. Normalweise macht man das ungefähr so:

Code:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(....);
glPushMatrix();
// rendern
glPopMatrix();

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 30, 2010 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Tausche dein Whiteboard gegen die Ultimative Antwort.

greetings
Ne, Scherz. Außerdem ist die Antwort weltbekannt: 42.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 30, 2010 17:59 
Offline
DGL Member

Registriert: Mi Okt 28, 2009 16:51
Beiträge: 10
Also ich möchte eigentlich aufgrund der Beschleunigungssensoren die Kamera in der Welt verschieben, wobei sie immer bei z=5 steht.

Code:
   glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   float ratio = self.bounds.size.width / self.bounds.size.height;
   glFrustumf(-ratio, ratio, -ratio, ratio, 1, 1000);
   gluLookAt(0, 0, 5, center[0] , center[1] , 0, 0, 1, 0);
   glMatrixMode(GL_MODELVIEW);


Und so habe ich das bisher gemacht:
Code:
#define FILTERFACTOR 0.1
#define kAccelerometerFrequency  100.0 // wird beim updaten immer aufgerufen

   z = (acceleration.z * FILTERFACTOR) + (accel[2] * (1.0 - FILTERFACTOR));
   x = (acceleration.x * FILTERFACTOR) + (accel[0] * (1.0 - FILTERFACTOR));
   y = (acceleration.y * FILTERFACTOR) + (accel[1] * (1.0 - FILTERFACTOR));

   if (z > 0.0) {
      m_phi = atan(x / z) + M_PI / 2.0;
   } else if (z < 0.0) {
      m_phi = atan(x / z) - M_PI / 2.0;// + M_PI;
   } else if (x < 0) {
      m_phi = M_PI/2.0;
   } else if (x >= 0) {
      m_phi = 3 * M_PI/2.0;
   }


Code:
        CLLocationDirection degrees = newHeading.trueHeading;
   center[0] = cos(DEGREES_TO_RADIANS(fmod(degrees+90, 360)));
   center[1] = m_phi;


Leider klappt das nur bedingt, da es Werte zwischen -1 und 1 sind. Somit wird der Betrachtungspost nicht viel verändert. Sollte man hier eher mit einem Winkel arbeiten ???

Ich hoffe diesmal war es etwas verständlicher!

LG RapidM


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 01, 2010 00:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Wieso erinnert mich das an den 3DS? :D

Ich weiss jetzt nicht wie die Achsen bei den Sensoren ausgerichtet sind, kann leider nur im Simulator testen.
Wenn ich mir das iPhone vor die Nase halte in der "Standardansicht" dann ist der Vektor 0,0,-1 ?
Also z=-1 ist da wo die Hometaste ist? Dann ist wohl x die Seite und y die Tiefe? Aber mit welchen Vorzeichen?


bzgl deines Codes:

nur wenn z gleich 0.0 ist wird überhaupt x geprüft. Ist das so gewollt?

[edit]hab da noch was gefunden. Da hat wohl OpenGL Einfluss gehabt. :)[/edit]

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.008s | 16 Queries | GZIP : On ]