Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

12.04.2007, 21:30

Tangentialebene an Kugeloberfläche (Rotationsmatrizen)

Hallo!

Also:
1) Ich habe ein Modell, mit einer Plane auf der xz-Ebene (Mittelpunkt im Ursprung)
2) Ich habe eine große Kugel
Nun will ich auf dieser das Modell so platzieren, dass seine "Grundebene" auf der Tangentialebene des Punktes wo es gerendert wird, liegt.

Bis jetzt habe ich diese Rotationsmatrix verwendet:

C-/C++-Quelltext

1
2
3
m_mTranslation          = ogMatrixTranslation(og3DVector(0.f, m_vPositionS.fR, 0.f));
    m_mRotation             = ogMatrixRotation(og3DVector(0.f, m_vPositionS.fPhi, m_vPositionS.fTheta));
    m_mTransform            = m_mTranslation * m_mRotation;


Wobei m_vPositionS die Position in Kugelkoordinaten speichert. Nun hat sich aber (empirisch) herausgestellt, dass das gerenderte Objekt NICHT auf dem Punkt liegt, der in m_vPositionS definiert ist. (Nebenfrage: WIESO??)

Also hab ich nach einer anderen Lösung gesucht und es dann so probiert:

C-/C++-Quelltext

1
2
m_mTransformation = ogMatrixRotationX(vPositionS.fTheta) * ogMatrixRotationY(vPositionS.fPhi) *
                                             ogMatrixTranslation(m_vPositionK);


Wobei m_vPositionK die Position auf der Kugel in kartesischen Koordinaten darstellt (umgerechnet von m_vPositionS).

Nun erscheint das Modell zwar an der richtigen Stelle, doch ist seine Basisebene nicht mehr gleich der Tangentialebene wie es bei der anderen Transformationsmatrix der Fall war. --> ist für mich eigentlich nicht verständlich...

Hoffe ihr habt eine Idee, was das sein könnte. Habe mal auf die Ungenauigkeit von float und sinf, cosf getippt... Aber dass da so massive Fehler auftreten kommt mir doch etwas spanisch vor...

Danke schon mal
Black-Panther

PS: Habe auch schon diese Version der Matrix probiert, funktioniert auch nicht:

C-/C++-Quelltext

1
2
m_mTransformation = ogMatrixRotationY(vPositionS.fPhi) * ogMatrixRotationZ(vPositionS.fTheta) * 
                                             ogMatrixTranslation(m_vPositionK);
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.04.2007, 23:02

da du auf eigene matheroutinen setzt, werfen sich bei mir folgende fragen auf:
von wo werden die winkel (vor allem theta) gemessen? (ich denk mal theta von der y achse und phi von der z achse aus?)
coordsys linkshändig/rechtshändig?
wie ist die multiplikationsreihenfolge in ogMatrixRotation?
sind vektoren bei dir zeilen oder spalten?
irgendeine illustration bezüglich dieser punkte oder z.b. ein screenshot welche variante welches falsche ergebnis liefert etc. wären evtl. hilfreich...

Zitat

m_mTransformation = ogMatrixRotationY(vPositionS.fPhi) * ogMatrixRotationX(vPositionS.Theta) * ogMatrixTranslation(m_vPositionK);


ich denk so in der art müsste es gehn...

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

13.04.2007, 08:18

Also:

1) Theta wird von der positiven y-Achse aus gemeseen -> ergo bei -y = Pi
2) Phi wird von der X-Achse gemessen
3) Das KoordSystem ist das selbe wie das von D3D
4) ogMatrixRotation multipliziert: RotX * RotY * RotZ
5) Vektoren sind Zeilen
6) Zu den Screenies... Wer ich heut Nachmittag noch posten, hab sie jetzt nicht hier...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

13.04.2007, 09:42

C-/C++-Quelltext

1
m_mTransform = ogMatrixTranslation(og3DVector(0.f, m_vPositionS.fR, 0.f)) * ogMatrixRotationY(vPositionS.fPhi) * ogMatrixRotationX(vPositionS.fTheta);


so in der art müssts imo hinhaun :doubt:

Werbeanzeige