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

Aktuelle Zeit: Fr Jul 18, 2025 03:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 15:06 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Hi,

habe einer Kamera Klasse in der ich die 3 Vectoren für gluLookAt() halte, hier will ich eine "Seitwärts-Bewegung" auf den Pfeiltasten machen.

Dafür transformiere ich meine Koordinaten wie folgt:
Code:
case Qt::Key_Left:
{
            QVector3D UpRel, TarRel, CrossProd;
            UpRel = m_UpVector - m_PositionVector;
            TarRel = m_TargetVector - m_PositionVector;
            UpRel.normalize();
            TarRel.normalize();
            CrossProd = QVector3D::crossProduct(UpRel, TarRel);

            m_PositionVector = m_PositionVector + CrossProd;
            m_TargetVector = m_TargetVector + CrossProd;
            m_UpVector = m_UpVector + CrossProd;
            break;
}


Hier habe ich nun den Effekt das sich die Kamera "Wegdreht":

Bild
Bild

1. Bild: Vor dem Tastendruck, Kamera hat Koordinaten: Posi=0:0:-2 Targ=0:0:-1 Up=0:1:-2
2. Bild: Nach dem Tastendruck, Kamera hat Koordinaten: Posi=1:0:-2 Targ=1:0:-1 Up=1:1:-2

Wenn ich mir die Koordinaten angucke sieht das eigentlich so aus wie ich mir das auch gedacht habe, nur gerendert passt es nicht :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

du musst dir den Vektor berechnen, der nach rechts bzw. links zeigt. Dazu Bildest du einfach das VektorProdukt aus m_UpVector und m_TargetVector. Und dann addierst du zu deinem m_PositionVector den Berechneten (evtl noch mit einem Faktor skalieren, das es nich zu weit verrückt)

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich glaube das Problem ist das m_UpVector bei dir ein Punkt und eben kein Vektor (Richtung) ist. Es ist ratsam entsprechende Namen für deine Variablen zu verwenden. Jedenfalls erwartet gluLookAt für die letzten drei Argumente einen Vektor, keinen Punkt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 18:10 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Zitat:
du musst dir den Vektor berechnen, der nach rechts bzw. links zeigt. Dazu Bildest du einfach das VektorProdukt aus m_UpVector und m_TargetVector. Und dann addierst du zu deinem m_PositionVector den Berechneten (evtl noch mit einem Faktor skalieren, das es nich zu weit verrückt)

Das is im Prinzip das was ich mache, geht aber nicht.
Zitat:
Ich glaube das Problem ist das m_UpVector bei dir ein Punkt und eben kein Vektor (Richtung) ist. Es ist ratsam entsprechende Namen für deine Variablen zu verwenden. Jedenfalls erwartet gluLookAt für die letzten drei Argumente einen Vektor, keinen Punkt.

Nene, m_UpVector ist schon n Vector, wird auch verschoben, aber irgentwie wohl nicht richtig. So rufe ich gluLookAt() am beim Rendern auf:
Code:
gluLookAt(m_PositionVector.x(), m_PositionVector.y(), m_PositionVector.z(),
          m_TargetVector.x(), m_TargetVector.y(), m_TargetVector.z(),
          m_UpVector.x(), m_UpVector.y(), m_UpVector.z());


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Nene, m_UpVector ist schon n Vector, wird auch verschoben, aber irgentwie wohl nicht richtig.

Ähm....ja genau da ist das Problem: Den Up-Vektor musst/darfst du nicht verschieben...es ist ein Vektor, kein Punkt.

Dieser Thread hat übrigens fast genau das gleiche Thema:
viewtopic.php?f=2&t=9146

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 18:44 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Hab den anderen Thread schon mal durch gelesen gehabt, aber irgentwie versteh ich das wohl nicht ;)

Nach welcher Regel formt man den dann um?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Fr Apr 09, 2010 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Nach welcher Regel formt man den dann um?

Ok, nehmen wir an der Vektor (0,1,0) zeigt nach oben. Jetzt gehst du 2 Meter nach vorne, ein 3.5 Meter nach links und drehst dich dreimal im Kreis (auf der XZ-Ebene).
Wo ist jetzt oben? => Immer noch (0,1,0) ;) :)
Also gar nichts machen solange du nicht außerhalb der XZ-Ebene rotierst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Sa Apr 10, 2010 00:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

less dir nochmal genau schritt für schritt durch was ich geschrieben habe. Und dann mach es genau so wie ich es geschrieben habe:
-VektorProdukt (SideVector) aufstelln: SideVector = m_TargetVector x m_UpVector
-berechneten Vektor (SideVector) auf Punkt dazu addieren (evtl skalieren): m_PositionVector += SideVektor*Faktor
-FERTSCH^^

Du ziehst bei dir von den Vektoren noch die Position ab, bevor du das VektorProdukt aufstellst, das is aber unsinnig. Was sollten das dann für Vektoren sein? Und dann addierst du den Vektor (SideVektor) nicht nur auf die Position, sondern auch auf die Vektoren, das ist auch nicht richtig, wie Coolcat dir ja schon erklärt hat ;)

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: So Apr 11, 2010 19:42 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Hm jaaa, so langsam kommt Licht ins dunkel ;)

Also ich hab das jetzt sooo gemacht:
Zitat:
-VektorProdukt (SideVector) aufstelln: SideVector = m_TargetVector x m_UpVector

Code:
            QVector3D UpRel, TarRel, CrossProd;
            UpRel = m_UpVector;
            TarRel = m_TargetVector;
            //UpRel.normalize();
            //TarRel.normalize();
            CrossProd = QVector3D::crossProduct(UpRel, TarRel);

Zitat:
-berechneten Vektor (SideVector) auf Punkt dazu addieren (evtl skalieren): m_PositionVector += SideVektor*Faktor

Code:
            m_PositionVector += CrossProd*0.01;
            m_TargetVector += CrossProd*0.01;


Dann wirkt das so als würde man die Kamera auf der X-Achse in den Zylinder rotieren... könnte das am perspektivischen View liegen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: So Apr 11, 2010 23:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

nein das liegt daran, das du schon wieder den m_TargetVector änderst. Nochma zur Erklärung: die Vektoren (m_TargetVector und m_UpVector) geben nur an, in welche Richtung die Kamera guckt. m_TargetVector ist die Richtung in die die Kamera guckt, da das aber eine Achse ist, auf der man die Kamera noch 360° drehen kann muss man noch einen 2. Vektor angeben. Das is m_UpVector, der sagt der Kamera wo oben ist. Die haben rein gar nix mit der Position zu tun, nur mit der Ausrichtung. Du willst aber nur die Position ändern, also darfst du auch nur m_PositionVector ändern! Un die ganzen Zwischenschritte über die Variablen könnte man sich auch sparen:
Code:
m_PositionVector += crossProduct(m_UpVector, m_TargetVector)*0.01


MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Mo Apr 12, 2010 11:37 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
Hi,

Code:
m_PositionVector += crossProduct(m_UpVector, m_TargetVector)*0.01

Ok, wenn ich das so mache bewegt sich die Kamera parabellförmig auf der XZ-Ebene von dem Zylinder weg.

Also die 3 Punkte bzw. Vektoren die ich gluLookAt übergebe, liegen in welchen Koordinatensystem? Ich hab das jetzt so verstanden das Position und Target im Welt-System liegen, und was Coolcat gesagt hat habe ich so verstanden das der UpVector seinen Ursprung in der Kamera-Position hat. Am Anfang habe ich gedacht alle liegen im Welt-System. Oder ist es so das nur die Position in dem Welt-System liegt und Up und Target sind relativ zur Position? Irgentwie bin ich jetzt noch verwirrter wie vorher ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Mo Apr 12, 2010 12:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich hab das jetzt so verstanden das Position und Target im Welt-System liegen, und was Coolcat gesagt hat habe ich so verstanden das der UpVector seinen Ursprung in der Kamera-Position hat.

Das ist auch richtig so. Allerdings ist ein Vektor eine Richtung und hat keinen Ursprung in dem Sinne, aber ich denke du meinst das richtige.

Vermutlich rufst du gluLookAt an der falschen Stelle auf. Es müsste eigentlich in etwa wie folgt richtig sein. (Ich nutze meine eigene Math-Lib...da ist das alles anders.)
Code:
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
glPushMatrix();

// rendern ...

glMatrixMode (GL_MODELVIEW);
glPopMatrix();

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Mo Apr 12, 2010 13:35 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
okay, wenigstens etwas :lol:

Wenn ich meine Struktur mal weg lasse und alles in eine Sequenz schreibe mache ich das im Prinzip so:
Code:
            glDrawBuffer(GL_BACK);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();

            // width=breite des glfensters, height = höhe des glfensters, fov nehme ich hier 45 grad
            double top = m_dPlanNear * tan(m_dFieldOfView * PI /360) * m_dZoomFactor;
            m_Frustum.Top = top;
            m_Frustum.Bottom = (-top);
            m_Frustum.Left = (-top * (double)width/(double)height);
            m_Frustum.Right = (top * (double)width/(double)height);
            glFrustum(m_Frustum.Left, m_Frustum.Right, m_Frustum.Bottom, m_Frustum.Top, m_dPlanNear, m_dPlanFar);

            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
           
            // m_PositionVector, m_TargetVector und m_UpVector sind QVector3D. x,y,z sind double
            gluLookAt(m_PositionVector.x(), m_PositionVector.y(), m_PositionVector.z(),
                    m_TargetVector.x(), m_TargetVector.y(), m_TargetVector.z(),
                    m_UpVector.x(), m_UpVector.y(), m_UpVector.z());
            glPushMatrix();
            m_bRender(); // zeichnet den Zylinder in einem Würfel von -0.5/-0.5/-0.5 bis 0.5/0.5/0.5
            glPopMatrix();

            glFlush();

Als initiale Kameraposition hab ich
Code:
#define DefaultCamPosX 0.0
#define DefaultCamPosY 0.0
#define DefaultCamPosZ -2.0
#define DefaultCamTarX 0.0
#define DefaultCamTarY 0.0
#define DefaultCamTarZ 1.0
#define DefaultCamUpX 0.0
#define DefaultCamUpY 1.0
#define DefaultCamUpZ 0.0


[edit]Im resizeGL mache ich das:
Code:
glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    m_Camera->m_bCalcFrustum(width, height);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Mo Apr 12, 2010 23:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich glaub uns is da ein kleiner fehler unterlaufen... Das Target ist kein Vektor, sondern der Punkt auf den die Cam blickt (siehe hier)
Da is das ganze n bisl anders. Da musst du dir als erstes den TargetVektor aufstellen, dann das Vektorprodukt berechnen und dann die Position und das Target verschieben. Also so ungefähr:
Code:
TargetVector = m_PositionVector - m_TargetVector; //Bitte änder TargetVector in deinem Code um (TargetPos), nich das es dich wieder verwirrt!!!
VecProd = crossProduct(m_UpVector, TargetVector)*Faktor;
m_PositionVector += VecProd;
m_TargetVector += VecProd;


Hier das ganze nochma in Pascal, da ich mich mit C nicht so richtig auskenn. Das ist 1 zu 1 aus meinem Bsp-Prog. kopiert, mit dem es funktioniert:
Code:
if gluIsKeyDown(VK_LEFT) then begin
    TargetVec[0] := CamPos.Pos[0] - CamPos.Target[0];
    TargetVec[1] := CamPos.Pos[1] - CamPos.Target[1];
    TargetVec[2] := CamPos.Pos[2] - CamPos.Target[2];

    tmp := gluVectorProd(TargetVec, CamPos.Up);
    CamPos.Pos[0] := CamPos.Pos[0] + tmp[0]*0.001;
    CamPos.Pos[1] := CamPos.Pos[1] + tmp[1]*0.001;
    CamPos.Pos[2] := CamPos.Pos[2] + tmp[2]*0.001;

    CamPos.Target[0] := CamPos.Target[0] + tmp[0]*0.001;
    CamPos.Target[1] := CamPos.Target[1] + tmp[1]*0.001;
    CamPos.Target[2] := CamPos.Target[2] + tmp[2]*0.001;
  end;


€: Hier nochma dein Code vom anfang mit den korrigierten Stellen:
Code:
case Qt::Key_Left:
{
            QVector3D UpRel, TarRel, CrossProd;
            //UpRel = m_UpVector - m_PositionVector;
            TarRel = m_TargetVector - m_PositionVector;
            //UpRel.normalize();
            //TarRel.normalize();
            CrossProd = QVector3D::crossProduct(m_UpVector, TarRel);
            CrossProd.normalize();

            m_PositionVector = m_PositionVector + CrossProd*Faktor;
            m_TargetVector = m_TargetVector + CrossProd*Faktor;
            //m_UpVector = m_UpVector + CrossProd;
            break;
}


MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kamera seitwärts bewegen
BeitragVerfasst: Di Apr 13, 2010 08:49 
Offline
DGL Member

Registriert: Mo Nov 30, 2009 10:13
Beiträge: 23
aaahh, ja so klingt das einleuchtend ;D jetzt hab ichs verstanden
sooooo gehts endlich:
Code:
        case Qt::Key_Left:
        {
            QVector3D CrossProd = QVector3D::crossProduct(m_UpVector, m_PositionVector - m_TargetVector)*0.01;
            m_PositionVector += CrossProd;
            m_TargetVector += CrossProd;
            break;
        }

m_PositionVector und m_TargetVector sollte ich für das Verständnis evtl. in Point umbenennen^^

danke euch!!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
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.011s | 14 Queries | GZIP : On ]