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

Aktuelle Zeit: Di Apr 16, 2024 19:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kamera via Projektionsmatrix
BeitragVerfasst: Sa Aug 23, 2014 15:32 
Offline
DGL Member

Registriert: Fr Aug 22, 2014 16:40
Beiträge: 1
Programmiersprache: c++
Hallo,

es gibt sehr viele Beispiele wie man in OpenGL eine Kamerasteuerung
herstellt. Ich brauche da eigentlich dringend eine Hilfe.

Scenario:

Kamera beobachtet eine Platte aus 45% über Ecke, diese ist drehbar
mit der Tastatur left und right, sowie beweglich rechts links Key.

Drehe ich aber meine Platte wirken danach die Tasten rechts und links nur
noch zu einem kleinen Teil,die meiste Erhöhung von zb. X wandert nun in Y
und umgekehrt.

Desswegen wirke ich direkt auf die View und Projektions Matrix ein, indem ich
die Matrixeinträge so manipuliere das bei einer Multiplikation der
korrekte XY-Anteil in die Darstellung integriert wird, das sieht so aus:

LookAt(3, 90, 45, 100);

Code:
  1.  
  2. void CGLcamera::LookAt(float yaw, float roll, float pitch, float dir)
  3. {
  4.     m_rot.z -= (yaw/10.0f);     //Seitenruder m_rot.z
  5.     m_rot.x -= (roll/10.0f);    //Nase = m_rot.x
  6.                                 //Querruder = m_rot.y  
  7.  
  8.     register float fc = -CVertex::Cos((m_rot.x + 90.0f) * PI180);
  9.  
  10.     m_cam.x =  CVertex::Cos((m_rot.z + 90.0f) * PI180)*fc;//rotate by X+90 with RightLeft
  11.     m_cam.y =  CVertex::Sin((m_rot.z + 90.0f) * PI180)*fc;//rotate by Y+90 with RightLeft
  12.     m_cam.z = -CVertex::Sin((m_rot.x + 90.0f) * PI180);   //rotate by Z+90 with UpDown    
  13.  
  14.     if(pitch > 0)//xchg xy
  15.      dir=1,m_cam = CVertex( m_cam.y, -m_cam.x, m_cam.z);
  16.     else if(pitch < 0)//xchg xy
  17.      dir=1,m_cam = CVertex( -m_cam.y, m_cam.x, m_cam.z);
  18.  
  19.     m_cam   *= dir; //direction normal +1
  20.  
  21.     m_pos   +=  m_cam;
  22. }      
  23.  




Im Anschluß Integriere ich die berechnete rotation m_cam
in die Matrix:


pCam->CGLmatrix::RotXYZ(m_cam);



Code:
  1.  
  2. void CGLmatrix::RotXYZ(CVertex rot)
  3. {
  4.     float c,s;
  5.     float x0,y0,z0;
  6.     float x1,y1,z1;
  7.     float x2,y2,z2;
  8.     register float *mod=&m_m0[0][0];
  9.  
  10.     //x
  11.     c=Cos(rot.x*PI180);
  12.     s=Sin(rot.x*PI180);
  13.  
  14.     x0 = mod[0];
  15.     y0 = mod[1];
  16.     z0 = mod[2];
  17.     x1 = mod[4]*c+mod[8]*s;
  18.     y1 = mod[5]*c+mod[9]*s;
  19.     z1 = mod[6]*c+mod[10]*s;
  20.     x2 = mod[4]*-s+mod[8]*c;
  21.     y2 = mod[5]*-s+mod[9]*c;
  22.     z2 = mod[6]*-s+mod[10]*c;
  23.  
  24.     mod[0] = x0,
  25.     mod[1] = y0,
  26.     mod[2] = z0;
  27.     mod[4] = x1,
  28.     mod[5] = y1,
  29.     mod[6] = z1;
  30.     mod[8] = x2,
  31.     mod[9] = y2,
  32.     mod[10] = z2;
  33.  
  34.     //y
  35.     c=Cos(rot.y*PI180);
  36.     s=Sin(rot.y*PI180);
  37.  
  38.     x0 = mod[0]*c+mod[8]*-s;
  39.     y0 = mod[1]*c+mod[9]*-s;
  40.     z0 = mod[2]*c+mod[10]*-s;
  41.     x1 = mod[4];
  42.     y1 = mod[5];
  43.     z1 = mod[6];
  44.     x2 = mod[0]*s+mod[8]*c;
  45.     y2 = mod[1]*s+mod[9]*c;
  46.     z2 = mod[2]*s+mod[10]*c;
  47.  
  48.     mod[0] = x0,
  49.     mod[1] = y0,
  50.     mod[2] = z0;
  51.     mod[4] = x1,
  52.     mod[5] = y1,
  53.     mod[6] = z1;
  54.     mod[8] = x2,
  55.     mod[9] = y2,
  56.     mod[10] = z2;
  57.  
  58.     //z
  59.     c=Cos(rot.z*PI180);
  60.     s=Sin(rot.z*PI180);
  61.  
  62.     x0 = mod[0]*c+mod[4]*s;
  63.     y0 = mod[1]*c+mod[5]*s;
  64.     z0 = mod[2]*c+mod[6]*s;
  65.     x1 = mod[0]*-s+mod[4]*c;
  66.     y1 = mod[1]*-s+mod[5]*c;
  67.     z1 = mod[2]*-s+mod[6]*c;
  68.     x2 = mod[8];
  69.     y2 = mod[9];
  70.     z2 = mod[10];
  71.  
  72.     mod[0] = x0,
  73.     mod[1] = y0,
  74.     mod[2] = z0;
  75.     mod[4] = x1,
  76.     mod[5] = y1,
  77.     mod[6] = z1;
  78.     mod[8] = x2,
  79.     mod[9] = y2,
  80.     mod[10] = z2;
  81. }
  82.  




Dann translatiere ich die neue Position der Kamera m_pos separat:


pCam->CGLmatrix::Translate(m_pos);


Code:
  1.  
  2. //Move matrix by Vector-direction  multiply a point with a matrix
  3. void CGLmatrix::Translate(const CVertex pos)
  4. {
  5.     register float *mod=&m_m0[0][0];
  6.     mod[12] = mod[0]*pos.x+mod[4]*pos.y+mod[8]*pos.z+mod[12];
  7.     mod[13] = mod[1]*pos.x+mod[5]*pos.y+mod[9]*pos.z+mod[13];
  8.     mod[14] = mod[2]*pos.x+mod[6]*pos.y+mod[10]*pos.z+mod[14];
  9.     mod[15] = mod[3]*pos.x+mod[7]*pos.y+mod[11]*pos.z+mod[15];
  10. }
  11.  


Und aktiviere die neue Matrix in OpenGL mit:

glLoadMatrixf(&CGLmatrix::m_m0[0][0]);


Das Problem ist bei meiner Ansteuerung,die einer 3D Egoperspektive entspricht,
das dort nur noch wirkt : "gehe n vorwärts mit Winkel a°"

Daher lasse ich das LookAt weg, und die Berechnung CGLmatrix::RotXYZ
rotiert die Scene, leider ist danach die Translation der Position, nicht mehr Tastatur-
Richtungsentprechend!

Also: yaw roll pitch force und einen (rl-offset).

Das eigens hergestellte LookAt funktiniert in einem Egoshooter besser.

Wie das glLookAt von OpenGL wirkt bleibt für mich ein Mysterium da ich
in OpenGL Y gegen Z vertauschte. Ich benötige geistig das rechthand Koordinatensystem.

Frage a)
Wie kann ich am besten eine Tastaturansteuerung herstellen, die aus
rechts und links up und down eine yaw roll pitch -Ansteuerung für eine Egoperspektiven generiert?

Irgendwie gefällt mir nicht die Tastatur eingaben in in eine Flugzeugsteuerung umzurechnen nur um meine Scene immer gleichnamig
bewegen zu können.


Interessant das mir GluProject sehr genau Auskunft gibt über die Logische XY-Position zb der Maus
Umgekehrt müsste ein GluUnProject mein Problem lösen, ich hätte gerne mal den Quellentext von beiden.
Das auszuexperimentieren dürfte einige Zeit beanspruchen, freu mich falls jemand eine einfachere Lösung kennt.

Ich möchte gerne direkt meine Tastatur so in die Matrix integrieren das rechts "immer" rechts bleibt,egal wie die Rotation der Scene ist.

Frage b)
Hat jemand einen anderen Matrixintegrations -Vorschlag der für die einfache
Aufgabe besser geeignet ist ?


Video zum bisherigen: http://youtu.be/qfuSzISu0ig

Gruß
Karsten


Zuletzt geändert von Achromat am So Aug 24, 2014 16:29, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera via Projektionsmatrix
BeitragVerfasst: So Aug 24, 2014 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich würde zuerst mal das [code="cpp"] durch [code=cpp] ersetzen, dann wird dein posting leserlich.  ;-)

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 21 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.074s | 18 Queries | GZIP : On ]