Laden...

OpenGL/TK Im Kugelkoordinatensystem Kammera drehen

Erstellt von Puma321 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.823 Views
P
Puma321 Themenstarter:in
19 Beiträge seit 2013
vor 9 Jahren
OpenGL/TK Im Kugelkoordinatensystem Kammera drehen

Hallo,

Ich hab mal eine Frage bezüglich des Drehens mittels Kugelkoordinaten.

Ich hab mir eine Klasse geschrieben die mir die Kammerakoordinaten berechnet
es funktioniert auch soweit
ich kann mich komplett um den Würfel drehen
das einzige Problem ist das die Z-Achse von meinem Würfel immer genau in die Richtung der Y-Achse vom Fenster schaut (sie "wippt" zwar nach vorne und hinten (wenn ich rotiere) sie ist aber immer parallel zur Y-Achse von meinem WindowFenster)(ich hoffe dass ich es verständlich erklärt habe)

nun möchte ich dass sich diese Z-Achse auch dreht wenn ich rotiere (so wie in 3D Zeichenprogramme halt auch)
das heist ich müsste eigentlich (verbessert mich wenn es falsch ist) die Kammera um die eigene Achse drehen
nur das Problem ist wie berechne ich das mit den Mauskoordinaten und anschliesend die umsetzung in LookAt ?(
ich hab schon in Google geschaut aber leider nichts gefunden 🙁

hier noch der Code:


        private void rotate()
        {
            float dx = NewPos.X - OldPos.X;
            float dy = NewPos.Y - OldPos.Y;

            Theta += dx * Math.PI / 180.0;
            Phi += dy * Math.PI / 180.0;

            if (this.Phi < Math.PI / 2 && this.Phi > -Math.PI / 2)
            {
                Orientierung = new Point3d(0, 1, 0);
            }
            else if (this.Phi < Math.PI && this.Phi > -Math.PI)
            {
                Orientierung = new Point3d(0, -1, 0);
            }
            else if ((this.Phi < Math.PI*1.5 && this.Phi > -Math.PI*1.5))
            {
                Orientierung = new Point3d(0, -1, 0);
            }
            else if ((this.Phi < Math.PI * 2 && this.Phi > -Math.PI * 2))
            {
                Orientierung = new Point3d(0, 1, 0);
            }

            calcPos();

            OldPos = NewPos;
        }


        private void calcPos()
        {
            double x = origin.X + Radius * Math.Cos(Theta) * Math.Cos(Phi);
            double y = origin.Y + Radius * Math.Sin(Phi);
            double z = origin.Z + Radius * Math.Sin(Theta) * Math.Cos(Phi);

            Eye = new Point3d(x, y, z);
        }

und dann wird das noch mit


matrixModelview *= Matrix4.LookAt((float)o.Eye.X, (float)o.Eye.Y, (float)o.Eye.Z, (float)o.Origin.X, (float)o.Origin.Y, (float)o.Origin.Z,( float)o.Orientierung.X,( float) o.Orientierung.Y,(float) o.Orientierung.Z);

aufgefrufen

Eye, Origin und Orientierung sind alles Point3d (double Werte)

währe echt toll wenn ihr mir da ein paar Lösungsansätze geben würdet
(und schlagt mich nicht wenn ich deutsche und englische Namen gewählt habe (bin nicht so gut in Englisch))

P
157 Beiträge seit 2014
vor 9 Jahren

Huhu,

das liegt an der Aufteilung der Koordinatensystem in einzelne Quadranten... es gibt 0..90° in den verschiedensten ausprägungen, also positiv und negativ, für jede achse.

Man kann sowas ganz gut mit euler machen, muss dann aber entsprechend die ergebnisse noch mal umrechnen. hab das vor 15 jahren das letzte mal in den fingern gehabt, daher nur der denkanstoß.

ich hab dir mal nen link rausgesucht -> google translator sollte für das gröbste reichen:

Tutorial 17: Rotations

vg

Wenn's zum weinen nicht reicht, lach drüber!

5.658 Beiträge seit 2006
vor 9 Jahren

Hi Puma321,

ich verstehe das Problem noch nicht ganz. Wenn du sagst, daß du dich um einen Würfel drehen kannst, meinst du damit die Kamera? Wie (und vor allem warum) soll sich die Z-Achse drehen? Und was genau meinst du mit "wie im 3D-Zeichenprogramm"?

Wie man eine Kamera im 3D-Raum bewegt und dreht, sind eigentlich Grundlagen der 3D-Entwicklung, die in so ziemlich jeden Tutorial dazu beschrieben werden. Du kannst dir auch den Quellcode einer beliebigen Open-Source-Spieleengine anschauen, um herauszufinden, wie es dort gelöst wurde.

Ansonsten kannst du auch bei Google nach den Stichwörtern "orbital camera" oder "rotate camera around point" schauen, aber ohne Englischkenntnisse mach ich dir da nicht viel Hoffnung...

Christian

Weeks of programming can save you hours of planning

P
Puma321 Themenstarter:in
19 Beiträge seit 2013
vor 9 Jahren

Also Rotieren kann ich schon
ich hab mal in Autodesk Inventor nachgeschaut und das rotieren, das ich jetzt aktuell kann, heißt Abhängiger Orbit allerdings gibt es in Inventor auch noch den normalen Orbit also den unabhängig Orbit
und genau diesen unabhängigen Orbit möchte ich gerne "nachbauen" allerdings weis ich nicht wie ich das anstellen soll
das mit den EulerWinkeln klingt ja schon ganz interessant nur wie setz ich das dann vom bildschirm in die Winkel von meinem Würfel(Zeichenobjekt) um

angehängt noch ein bild auf dem ich die Z-Achse markiert habe die immer (fest) ist egal wie rum ich den Würfel drehe und genau diese Abhängikeit möchte ich lösen
(ich hoffe das es jetzt ein bischen verständlich war)
Englisch lesen geht eigenlich schon nur mach ich es halt nicht gerne und brauch dafür doppelt so lang 😁

bin um jeden Ratschlag dankbar

5.658 Beiträge seit 2006
vor 9 Jahren

Kann es sein, daß du den _Würfel _drehen möchtest, und nicht die Kamera?

Weeks of programming can save you hours of planning

P
Puma321 Themenstarter:in
19 Beiträge seit 2013
vor 9 Jahren

Nein ich mache einen Orbit d.h. ich möchte mit meiner Maus diesen Würfel drehen das funktioniert auch so weit nur möchte ich einen freien Orbit erstellen

ist es jetzt verständlich was ich meine?
( sorry das ich es nicht verständlicher erklähren kann

5.658 Beiträge seit 2006
vor 9 Jahren

Also entweder drehst du den Würfel oder die Kamera. Ob in einem Orbit oder mit der Maus, ist da erstmal unwichtig.

Aber wenn du willst, daß die Achsen der Szene relativ zur Kamera gleichbleiben, dann mußt du den Würfel drehen.

Weeks of programming can save you hours of planning

P
Puma321 Themenstarter:in
19 Beiträge seit 2013
vor 9 Jahren

Ok
Das heist wenn ich will dass beispielsweise, nehmen wir das rechte Bild von oben, der Würfel so wie er jetzt ist gegen den Uhrzeigersinn gedreht wird dann muss ich den Würfel um seine Achsen drehen 🤔 ???? ( das ist ja dann hoch rechen aufwendig)

Leichter geht es doch so:
Ich kann mit den letzten 3 Parametern der LookAt- Methode die Kammera um die Z-Achse drehen
Dadurch kann ich doch dann auch einfach die Kammera im Uhrzeigersinn drehen (dadurch dreht sich dann mein Würfel gegen den Uhrzeigersinn)

Und das möchte ich jetzt zusammen mit dem Orbit machen
Genau dieses Zusammen weis ich nicht wie ich es anstellen soll

5.658 Beiträge seit 2006
vor 9 Jahren

Es geht doch nicht darum, ob etwas leicht umzusetzen ist oder nicht, sondern um die Anforderungen an deine Anwendung.

Du kannst jedes beliebige Objekt um jeden beliebigen Punkt in der Szene drehen, das ist immer nur eine Matrix-Operation. Egal ob es sich um eine Kamera oder einen Würfel handelt.

Was du genau vor hast, kann ich mir aus deinen Ausführungen leider nicht entnehmen. Das kann aber auch daran liegen, daß du mit Absicht auf Groß- und Kleinschreibung* und Zeichensetzung verzichtest, und der Text dadurch halbwegs unlesbar ist.

Christian

* Danke für die Änderungen. Beim nächsten Mal bitte "editieren" anstatt "zitieren" verwenden, damit nicht die Moderatoren deine Texte anpassen müssen.

Weeks of programming can save you hours of planning