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))
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:
vg
Wenn's zum weinen nicht reicht, lach drüber!
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
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
Kann es sein, daß du den _Würfel _drehen möchtest, und nicht die Kamera?
Weeks of programming can save you hours of planning
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
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
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
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