Einfache Maussteuerung für Modellansicht (OpenGL)





  • Einfach den Curser auf die Mitte des Bildschirms setzen. Dann ablesen wohin er bewegt wurde. Diese Differenz für die Bewegung verwenden. Dann wieder auf die Mitte setzen usw.

    Für die Kamerasteuerung sollte dies wirklich helfen!

    http://www.codecolony.de/docs/camera2.htm
    http://www.codecolony.de/download/camera2/Camera2_SrcExeDoc.zip
    http://www.codecolony.de/download/camera2/Camera2_SrcExe.zip



  • Chiller schrieb:

    @hellihjb:
    Konkreter gesagt, (mit Bezug auf diese Seite) welche Achsen muss ich wie berechnen? In Trigonometrie war ich schon immer schlecht... 😞
    Ich habe noch nicht begriffen wie die quaternion's funktionieren, vermutlich würde das Begreifen schon helfen.

    Du kannst das Quaternion einfach in eine Axis-Angle Rotation umrechnen und dann zB mit glRotatef verwenden.



  • Oder dir die Quaternion sparen und einfach direkt Kugelkoordinaten verwenden 😉



  • dot schrieb:

    Oder dir die Quaternion sparen und einfach direkt Kugelkoordinaten verwenden 😉

    Geht auch, aber dann fehlt Dir halt die Z-Achse.



  • Was meinst du damit?



  • Ich versteh nicht ganz wie man jemandem, der offensichtlich nicht so fit in Mathe ist, Quaternionen vorschlagen kann. Zumal es fuer die Loesung ja absolut nicht erforderlich ist.



  • dot schrieb:

    Was meinst du damit?

    Du moechtest doch einen Punkt auf der Kugel durch zwei Winkel darstellen, dh Du kannst das Objekt um die X- und Y-Achse rotieren.
    Der Arcball kann das Objekt auch um sich selber drehen (Z-Achse) indem man ausserhalb des virtuellen Balls zieht.

    this->that schrieb:

    Ich versteh nicht ganz wie man jemandem, der offensichtlich nicht so fit in Mathe ist, Quaternionen vorschlagen kann. Zumal es fuer die Loesung ja absolut nicht erforderlich ist.

    Sowas gibt's doch alles fix & fertig.
    Demnach duerfte jemand der nicht so fit in Mathe ist ja auch kein OpenGL verwenden...



  • Es geht doch offensichtlich um eine Kamerasteuerung und nicht darum, ein Objekt zu drehen (zumindest hab ich das so verstanden)!? Um die Kamera auch noch um die Blickrichtung zu drehen, bräuchte man eben noch einen Winkel, so man das wirklich will.



  • dot schrieb:

    Es geht doch offensichtlich um eine Kamerasteuerung und nicht darum, ein Objekt zu drehen (zumindest hab ich das so verstanden)!?

    Aus der Fragestellung laesst sich wohl beides ableiten.
    Ob man nun das eine oder das andere dreht ist aber ja auch egal.
    Mit "Trackball-Steuerung" habe ich erstmal die Arcball-Implementierung als Standard-Loesung assoziiert.
    Aber es gibt sicher etliche Methoden die genau so gut geeignet sind.



  • Also, mein Versuch ist folgender:

    Die Mausbewegung wird gemessen und dann zu Elevation und Azimuth gerechnet.
    Die Maussteuerung sieht folgendermassen aus:

    int distanceX = MousePosition.X - OldMousePosX;
    int distanceY = MousePosition.Y - OldMousePosY;
    if (distanceX > distanceY)
    {
        if (distanceX > 0)
        {
            Azimuth++;
        }
        else if (distanceX < 0)
        {
            Azimuth--;
        }
    }
    else
    {
        if (distanceY > 0)
        {
            Elevation++;
        }
        else if (distanceY < 0)
        {
            Elevation--;
        }
    }
    
    Elevation = Elevation + distanceX;
    Azimuth = Azimuth + distanceY;
    OldMousePosX = MousePosition.X;
    OldMousePosY = MousePosition.Y;
    simpleOpenGlControl1.Invalidate();
    

    Und im OpenGL Teil:

    Gl.glTranslated(0, 0, -5);
    Gl.glRotatef(-Elevation, 1, 0, 0);  //Rotation abhängig der Maus
    Gl.glRotatef(Azimuth, 0, 1, 0);
    

    Das Problem ist aber, dass das Objekt sauber um die erste Achse Dreht, aber die zweite Achse scheinbar mitgedreht wird.
    Das heisst, wenn ich das Objekt um 180° um der X Achse Drehe (Was wunderbar klappt) aber dann um der Y-Achse drehen will, dreht sich das Objekt spiegelverkehrt.

    Anscheinend wird also immer um der Lokalen Achse gedreht, und nicht um der Globalen.

    Was mache ich falsch? (Oder besser gesagt... mach ich was richtig? 😕 )

    Grüsse
    Chiller



  • das ist schon richtig so. Bei der zweiten Rotation musst du also berücksichtigen, dass die (0 1 0)-Achse jetzt woanders ist und dementsprechend die Achse zuerst wieder an den richtigen ort rotieren.



  • Wie kann ich die Achse an den richtigen Ort rotieren ohne das ganze Gebilde zurückzudrehen? Gibt es da auch eine Funktion???

    Grüsse
    Chiller



  • Sach mal, ignorierst du meinen beitrag mit Absicht?

    Siehe dir die Links an. Da ist alles. Erläuteung wie es geht.
    Ausführbares Beispielprogramm mit Code.



  • Nein, ich habe deinen Beitrag ganz und gar nicht ingnoriert, ich bin nur nicht schlau aus der Website geworden.
    Ich versuche Heute noch mal das Problem zu lösen, vlt geht es besser wenn ich nicht am Abend spät daran arbeite...

    Das Problem mit den Beispielcodes ist, sie sind nur mangelhaft kommentiert und desswegen habe ich mühe herauszufinden was jetzt nützlich ist und was nicht.

    Gibt es nicht eine einfachere Lösung welche mit ein paar OpenGL befehlen funktioniert?

    Grüsse
    Chiller


Anmelden zum Antworten