Yaw-Pitch-Roll-Rotations Berechnung einer Einheitsmatrix
- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Yaw-Pitch-Roll-Rotations Berechnung einer Einheitsmatrix
WICHTIG habe den Text des Themas geändert, da der neue Text wesendlich sinnvoller ist und das Thema besser beschreibt
Hallo Leute,
ich kämpfe gerade mit einem mathematischen Problem und komme nicht weiter. Gegeben sind zwei Punkte als Vectoren point (x,y,z) im 3D Raum. Der erste Punkt hat die Koordinaten (0,0,0) der andere (x,y,z) als Variable. Jetzt möchte ich die 3 Winkel der x/y/z Achse der Geraden erhalten, möglichst in Grad oder Radiant.
P.S: Es handelt sich quasi dabei um eine Lookat Berechnung die ich derzeit über eine Matrix Berechnung hinbekomme, kann aber dummerweise aus dieser Matrix nicht die drei Winkel ableiten, daher dachte ich ich berechne die Winkel anders herum. Das Problem ist das sich das Objekt nach der Lookat Routine nicht vernüftig drehen kann da die enstandenen Winkel unbekannt sind
Gruß Michael
Hallo Leute,
ich kämpfe gerade mit einem mathematischen Problem und komme nicht weiter. Gegeben sind zwei Punkte als Vectoren point (x,y,z) im 3D Raum. Der erste Punkt hat die Koordinaten (0,0,0) der andere (x,y,z) als Variable. Jetzt möchte ich die 3 Winkel der x/y/z Achse der Geraden erhalten, möglichst in Grad oder Radiant.
P.S: Es handelt sich quasi dabei um eine Lookat Berechnung die ich derzeit über eine Matrix Berechnung hinbekomme, kann aber dummerweise aus dieser Matrix nicht die drei Winkel ableiten, daher dachte ich ich berechne die Winkel anders herum. Das Problem ist das sich das Objekt nach der Lookat Routine nicht vernüftig drehen kann da die enstandenen Winkel unbekannt sind
Gruß Michael
Zuletzt geändert von mpz am 02.01.2011 21:37, insgesamt 4-mal geändert.
Working on
- LibSGD - MP3D Engine - 


-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: 3 Winkel einer Linie im 3D Raum
Die Winkel bekommst ganz leicht durch eine orthogonale Projektion auf die Basis-Ebenen durch das Skalarprodukt:
Am Beispiel z-Winkel mit Projektion auf xy-Ebene mit dem Vektor v = (5, 4, 3):
v auf Ebene xy Projeziert: w = (5, 4, 0)
Winkel zwischen (0, 1, 0) und w nach obiger Formel:
Allerdings würde ich es bei einer Engine bevorzugen wenn man selbst mit Matrizen arbeiten darf.
[EDIT]
Die Gerade musst du natürlich als einen Richtungsvektor darstellen
. Die Position der Geraden ist ja irrelevant.
Code: Alles auswählen
cos alpha = (vektor1 * vektor2) / (|vektor1| * |vektor2|)
alpha = acos((vektor1 * vektor2) / (|vektor1| * |vektor2|))
v auf Ebene xy Projeziert: w = (5, 4, 0)
Winkel zwischen (0, 1, 0) und w nach obiger Formel:
Code: Alles auswählen
Debug ACos((5 * 0 + 4 * 1 + 0 * 0) / (Sqr(Pow(5, 2) + Pow(4, 2) + Pow(0, 2)) * 1)) * 180.0 / #PI
51.34
[EDIT]
Die Gerade musst du natürlich als einen Richtungsvektor darstellen

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Re: 3 Winkel einer Linie im 3D Raum
Eigentlich reichen 2 Winkel um einen Punkt im Raum zu lokalisieren (Stichwort: Kugelkoordinaten)
Der Anstand, welcher ja der Radius bei Kugelkoordinaten ist, ist für ein LookAt egal ...
Den 3. Winkel brauchst du ja nur, um das Ergebnis noch mal um die Sichtachse zu drehen.
Da dieser Winkel aber aus den Angaben von nur einem Punkten nicht eindeutig bestimmt ist, kannst du ihn auch nicht berechnen.
Schließlich kann ich die Kamera ja auch x,y,z richten und dabei dann frei um die z-Achse drehen, ohne das sich das Ergebnis (nach x,y,z gucken) ändert.
Der Anstand, welcher ja der Radius bei Kugelkoordinaten ist, ist für ein LookAt egal ...
Den 3. Winkel brauchst du ja nur, um das Ergebnis noch mal um die Sichtachse zu drehen.
Da dieser Winkel aber aus den Angaben von nur einem Punkten nicht eindeutig bestimmt ist, kannst du ihn auch nicht berechnen.
Schließlich kann ich die Kamera ja auch x,y,z richten und dabei dann frei um die z-Achse drehen, ohne das sich das Ergebnis (nach x,y,z gucken) ändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 87
- Registriert: 28.11.2010 13:07
- Computerausstattung: P4 2x3.2GKz.1GB WIXP 32Bit NVIDEA GT240 1GB DDR3, AMD XP 1.8GHz Linux 32Bit NVIDEA GT240 TIi3200
- Wohnort: Germany
- Kontaktdaten:
Re: 3 Winkel einer Linie im 3D Raum
Tip:
Dreh doch mal einen Punkt/Vector z.B. 0,0,1 1.57 RAD um die X-Achse und schau Dir mal die Werte dieser Matrix an.
Nimm ruhig noch andere Vectoren die die Länge 1 haben
Dann fällt der Groschen bestimmt äh heute heißt das ja "Cent"
Die drei gesuchten Winkel stehen ja in der Matrix:
Ich gehe einfach davon aus das Du weiss wie eine Matrix aufgebaut ist bzw. welches Feld der Matrix z.B. mit m20 gemeint ist.
Im Falle einer singularen Matrix:Grüsse Joshy
Dreh doch mal einen Punkt/Vector z.B. 0,0,1 1.57 RAD um die X-Achse und schau Dir mal die Werte dieser Matrix an.
Nimm ruhig noch andere Vectoren die die Länge 1 haben
Dann fällt der Groschen bestimmt äh heute heißt das ja "Cent"

Die drei gesuchten Winkel stehen ja in der Matrix:
Code: Alles auswählen
heading = ATan2(-m.m20,m.m00)
bank = ATan2(-m.m12,m.m11)
attitude = ASin(m.m10)
Im Falle einer singularen Matrix:
Code: Alles auswählen
if (m.m10 > 0.998)
heading = Atan2(m.m02,m.m22)
attitude = PI/2
bank = 0
elseif (m.m10 < -0.998)
heading = Atan2(m.m02,m.m22)
attitude = -PI/2
bank = 0
endif
PS. meine vielen Fehler der Rechtschreibung auf dem Forum könnt Ihr gerne ignorieren.
- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Re: 3 Winkel einer Linie im 3D Raum
Hi D.J.Peters,
ich glaube das wäre ein Ansatz. Bisher habe ich keine RotationsMatrix to Angle Funktion gefunden die die Funktion D3DXMatrixRotationYawPitchRoll(matrix, yaw, pitch, roll ) reverse zurück rollte bzw wie man auf yaw, pitch, roll kommen kann. Alle Formeln und Ansätze sind an der Wirklichkeit ( bei zwei funktionen von yaw, pitch, roll funktionierts, bei drei nicht mehr) gescheitert. Ich werd mal experimientieren und falls ich zu einem Ergebnis komme veröffentlichen...
Gruß Michael
ich glaube das wäre ein Ansatz. Bisher habe ich keine RotationsMatrix to Angle Funktion gefunden die die Funktion D3DXMatrixRotationYawPitchRoll(matrix, yaw, pitch, roll ) reverse zurück rollte bzw wie man auf yaw, pitch, roll kommen kann. Alle Formeln und Ansätze sind an der Wirklichkeit ( bei zwei funktionen von yaw, pitch, roll funktionierts, bei drei nicht mehr) gescheitert. Ich werd mal experimientieren und falls ich zu einem Ergebnis komme veröffentlichen...
Gruß Michael
Working on
- LibSGD - MP3D Engine - 


- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Re: 3 Winkel einer Linie im 3D Raum
Hi Leute,
ich fürchte ich benötige noch nen "Groschen". Hier mal meine bisherige Routine. Sobald yaw als Wert dazu kommt geht alles den Bach runter, bzw. werden die Winkel falsch angeben. Daher die Frage wie bekomme ich den Winkel mit Vectoren hin, vermutlich drei Vectoren berechnen. Hat noch jemans eine Idee die hilft ?!?!
Yaw.f = 0
Pitch.f = 20
Roll.f = 30
Ergebnis super
Yaw.f = 60
Pitch.f = 20
Roll.f = 30
Ergebnis Murx
ich fürchte ich benötige noch nen "Groschen". Hier mal meine bisherige Routine. Sobald yaw als Wert dazu kommt geht alles den Bach runter, bzw. werden die Winkel falsch angeben. Daher die Frage wie bekomme ich den Winkel mit Vectoren hin, vermutlich drei Vectoren berechnen. Hat noch jemans eine Idee die hilft ?!?!
Yaw.f = 0
Pitch.f = 20
Roll.f = 30
Ergebnis super
Yaw.f = 60
Pitch.f = 20
Roll.f = 30
Ergebnis Murx
Code: Alles auswählen
;- Beispiele funktioniert nur unter Windows
Structure D3DXMATRIX
_11.f
_12.f
_13.f
_14.f
_21.f
_22.f
_23.f
_24.f
_31.f
_32.f
_33.f
_34.f
_41.f
_42.f
_43.f
_44.f
EndStructure
Structure D3DXVector3
x.f
y.f
z.f
EndStructure
Macro D3DXToDegree(radian) ; radiant in Grad
(radian * 57.29578)
; (radian * 57.295779513082323)
EndMacro
Macro D3DXToRadian(Degree)
(Degree * 0.017453)
; (Degree * 0.017453292519943295)
EndMacro
Import "d3dx9.lib"
D3DXMatrixRotationYawPitchRoll (*pOut.D3DXMATRIX, Yaw.f, Pitch.f, Roll.f)
D3DXVec3TransformNormal (*pOut.D3DXVector3, *pV.D3DXVector3, *pM.D3DXMATRIX)
EndImport
Matrix.D3DXMATRIX
Matrix\_11 = 1
Matrix\_22 = 1
Matrix\_33 = 1
Matrix\_44 = 1
Yaw.f = 0
Pitch.f = 20
Roll.f = 30
D3DXMatrixRotationYawPitchRoll (Matrix.D3DXMATRIX, D3DXToRadian(Yaw.f), D3DXToRadian(Pitch.f), D3DXToRadian(Roll.f))
;- Berechnung 1
alpha.f = ATan2 (Sqr(Pow(Matrix\_11,2) + Pow (Matrix\_21,2)),Matrix\_31);
float1.f = D3DXToDegree(alpha)
float2.f = D3DXToDegree(-ATan2(Matrix\_33/Cos(alpha),Matrix\_32/Cos(alpha)))
float3.f = D3DXToDegree(-ATan2(Matrix\_11/Cos(alpha),Matrix\_21/Cos(alpha)))
;- Berechnung 2
If Matrix\_11 > = 0
float4.f = D3DXToDegree(ASin(Matrix\_31))
float5.f = D3DXToDegree(-ATan2(Matrix\_33,Matrix\_32))
float6.f = D3DXToDegree(-ATan2(Matrix\_11,Matrix\_21 ))
Else
float4 = D3DXToDegree(ACos(Matrix\_31))+90
float5 = D3DXToDegree(ATan2(-Matrix\_33,-Matrix\_32))
float6 = D3DXToDegree(ATan2(-Matrix\_11,-Matrix\_21 ))
EndIf
Debug "Winkel mit Matrix Routine"
Debug float1
Debug float2
Debug float3
Debug float4
Debug float5
Debug float6
pV.D3DXVector3
pV\x = 1
pV\y = 0
pV\z = 0
D3DXVec3TransformNormal (pOut.D3DXVector3, pV.D3DXVector3, @Matrix)
Debug "Vector x = 1"
Debug pV\x
Debug pV\y
Debug pV\z
Debug pOut\x
Debug pOut\y
Debug pOut\z
; What nu sprach Zeus
Working on
- LibSGD - MP3D Engine - 


-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: 3 Winkel einer Linie im 3D Raum
Naja, das geht eben nicht, bzw. nicht wenn nicht mehr Informationen gegeben sind wie z.B. ein Up Vektor. Außerdem kannst du das vergessen, sobald du z.B. Skalierungen mit rein bringst oder andere (vielleicht auch völlig abstruse) Verzerrungen:mpz hat geschrieben:Hi Leute,
ich fürchte ich benötige noch nen "Groschen". Hier mal meine bisherige Routine. Sobald yaw als Wert dazu kommt geht alles den Bach runter, bzw. werden die Winkel falsch angeben. Daher die Frage wie bekomme ich den Winkel mit Vectoren hin, vermutlich drei Vectoren berechnen. Hat noch jemans eine Idee die hilft ?!?!
Code: Alles auswählen
D3DXMatrixRotationYawPitchRoll (Matrix.D3DXMATRIX, D3DXToRadian(Yaw.f), D3DXToRadian(Pitch.f), D3DXToRadian(Roll.f))
D3DXMatrixScaling(MatrixScaling.D3DXMatrix, 1.0, 3.0, 1.0)
D3DXMatrixMultiply(Matrix, Matrix, MatrixScaling)
Code: Alles auswählen
Yaw.f = 0
Pitch.f = 20
Roll.f = 30
Code: Alles auswählen
0.00000042688683
47.51522445678711
29.99949264526367
[EDIT]
Du müsstest aber ja einen Up-Vektor haben wenn ich das richtig sehe. Aber dann hast du eigentlich alles was du brauchst, und ich verstehe den Umweg über die Matrizen nicht, wenn du eh nur die 3 Winkel haben willst und keine Transformationsmatrix für das LookAt.
Du musst praktisch rausfinden bei welchen 3 Winkeln der rotierte Rightvektor (1, 0, 0), der Upvektor (0, 1, 0) und der Viewvektor (0, 0, 1) ergibt.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Re: 3 Winkel einer Linie im 3D Raum
Hi,
grossen Dank an Gnasen der mit mir diese Matrix-Lösung in Kleinarbeit hinbekommen hat. Hier gibt es aber verschiedene "Winkelmöglichkeiten" die die selbe Matrix erzeugt. Daher kommt nicht der "gleiche" Winkel raus sondern eine YawPitchRoll Mischung die die gleiche Matrix erzeugen. In der Praxis funktioniert das super. Da ich im Netz keine vergleichbare Lösung gefunden haben kommt hier die Lösung.
"Allerdings würde ich halt darauf hinweisen, dass der Code für linkshändig orientierte Koordinatensysteme ist. Nur zur Sicherheit bevor noch andere verzweifeln."
grossen Dank an Gnasen der mit mir diese Matrix-Lösung in Kleinarbeit hinbekommen hat. Hier gibt es aber verschiedene "Winkelmöglichkeiten" die die selbe Matrix erzeugt. Daher kommt nicht der "gleiche" Winkel raus sondern eine YawPitchRoll Mischung die die gleiche Matrix erzeugen. In der Praxis funktioniert das super. Da ich im Netz keine vergleichbare Lösung gefunden haben kommt hier die Lösung.
"Allerdings würde ich halt darauf hinweisen, dass der Code für linkshändig orientierte Koordinatensysteme ist. Nur zur Sicherheit bevor noch andere verzweifeln."
An DarkDragon
auch mitMatrixScaling funktioniert die Formel, allerdings ist es bei DX9 wichtig die Matrixen in der richtigen Reihenfolge zu multiplizieren
Richtig -> D3DXMatrixMultiply(Matrix, MatrixScaling, Matrix)
Code: Alles auswählen
;- Beispiele funktioniert nur unter Windows
Structure D3DXMATRIX
_11.f
_12.f
_13.f
_14.f
_21.f
_22.f
_23.f
_24.f
_31.f
_32.f
_33.f
_34.f
_41.f
_42.f
_43.f
_44.f
EndStructure
Structure D3DXVector3
x.f
y.f
z.f
EndStructure
Macro D3DXToDegree(radian) ; radiant in Grad
(radian * 57.29578)
; (radian * 57.295779513082323)
EndMacro
Macro D3DXToRadian(Degree)
(Degree * 0.017453)
; (Degree * 0.017453292519943295)
EndMacro
Import "d3dx9.lib"
D3DXMatrixRotationYawPitchRoll (*pOut.D3DXMATRIX, Yaw.f, Pitch.f, Roll.f)
D3DXVec3TransformNormal (*pOut.D3DXVector3, *pV.D3DXVector3, *pM.D3DXMATRIX)
EndImport
Matrix.D3DXMATRIX
Matrix\_11 = 1
Matrix\_22 = 1
Matrix\_33 = 1
Matrix\_44 = 1
Yaw.f = 320
Pitch.f = -120
Roll.f = -42
D3DXMatrixRotationYawPitchRoll(Matrix.D3DXMATRIX, D3DXToRadian(Yaw), D3DXToRadian(Pitch), D3DXToRadian(Roll))
Debug "-----RESULT AFTER ROTATION-----"
Debug Matrix\_11
Debug Matrix\_12
Debug Matrix\_13
Debug Matrix\_21
Debug Matrix\_22
Debug Matrix\_23
Debug Matrix\_31
Debug Matrix\_32
Debug Matrix\_33
;- Berechnung
theta.f = ATan2(Matrix\_33,Matrix\_31)+#PI
phi.f = ATan2(Sin(theta)*Matrix\_31+Cos(theta)*Matrix\_33, -Matrix\_32)
ksi.f = ATan2(Cos(theta)*Matrix\_11-Sin(theta)*Matrix\_13,-Cos(theta)*Matrix\_21+Sin(theta)*Matrix\_23)
Debug ""
Debug "yaw " + StrF(D3DXToDegree(theta))
Debug "pitch " + StrF(D3DXToDegree(phi))
Debug "roll " + StrF(D3DXToDegree(ksi))
Debug ""
Yaw.f = D3DXToDegree(theta)
Pitch.f = D3DXToDegree(phi)
Roll.f = D3DXToDegree(ksi)
Matrix2.D3DXMATRIX
Matrix2\_11 = 1
Matrix2\_22 = 1
Matrix2\_33 = 1
Matrix2\_44 = 1
D3DXMatrixRotationYawPitchRoll(Matrix2.D3DXMATRIX, D3DXToRadian(Yaw), D3DXToRadian(Pitch), D3DXToRadian(Roll))
Debug "-----RESULT AFTER ROTATION (invers berechnete Transformationswinkel)-----"
Debug Matrix2\_11
Debug Matrix2\_12
Debug Matrix2\_13
Debug Matrix2\_21
Debug Matrix2\_22
Debug Matrix2\_23
Debug Matrix2\_31
Debug Matrix2\_32
Debug Matrix2\_33
CallDebugger
Working on
- LibSGD - MP3D Engine - 


-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: 3 Winkel einer Linie im 3D Raum
Hallo,
Außerdem kannst du die Gerade ja an ihrer eigenen Achse drehen, wesshalb du nie alle 3 Winkel nur anhand der Geraden und der Matrix errechnen könntest, sondern du bräuchstes noch einen Vektor wie du selbst erkannt hast:
Gut möglich. Die Reihenfolge ist aber ja garnicht interessant. Ich wollte damit ja nur klarstellen, dass wenn du weitere Transformationen hast (es muss ja nichtmal Scaling sein, sondern kann auch eine Projektion auf eine Ebene sein o.ä.), ob nun davor oder danach kannst du alles weitere wieder vergessen, die Winkel werden nichtmehr stimmen. Auch mit deiner Reihenfolge funktioniert es nicht, denn es kommtmpz hat geschrieben:An DarkDragon
auch mitMatrixScaling funktioniert die Formel, allerdings ist es bei DX9 wichtig die Matrixen in der richtigen Reihenfolge zu multiplizieren
stattyaw 319.9946289063
pitch -119.9979858398
roll -69.6847839355
raus.Yaw.f = 320
Pitch.f = -120
Roll.f = -42
Code: Alles auswählen
;- Beispiele funktioniert nur unter Windows
Structure D3DXMATRIX
_11.f
_12.f
_13.f
_14.f
_21.f
_22.f
_23.f
_24.f
_31.f
_32.f
_33.f
_34.f
_41.f
_42.f
_43.f
_44.f
EndStructure
Structure D3DXVector3
x.f
y.f
z.f
EndStructure
Macro D3DXToDegree(radian) ; radiant in Grad
(radian * 57.29578)
; (radian * 57.295779513082323)
EndMacro
Macro D3DXToRadian(Degree)
(Degree * 0.017453)
; (Degree * 0.017453292519943295)
EndMacro
Import "d3dx9.lib"
D3DXMatrixRotationYawPitchRoll (*pOut.D3DXMATRIX, Yaw.f, Pitch.f, Roll.f)
D3DXVec3TransformNormal (*pOut.D3DXVector3, *pV.D3DXVector3, *pM.D3DXMATRIX)
D3DXMatrixScaling(*Matrix.D3DXMatrix, X.f, Y.f, Z.f)
D3DXMatrixMultiply(*Matrix, *MatrixA, *MatrixB)
EndImport
Matrix.D3DXMATRIX
Matrix\_11 = 1
Matrix\_22 = 1
Matrix\_33 = 1
Matrix\_44 = 1
Yaw.f = 320
Pitch.f = -120
Roll.f = -42
D3DXMatrixRotationYawPitchRoll(Matrix.D3DXMATRIX, D3DXToRadian(Yaw), D3DXToRadian(Pitch), D3DXToRadian(Roll))
D3DXMatrixScaling(MatrixScaling.D3DXMatrix, 1.0, 3.0, 1.0)
D3DXMatrixMultiply(Matrix, MatrixScaling, Matrix)
Debug "-----RESULT AFTER ROTATION-----"
Debug Matrix\_11
Debug Matrix\_12
Debug Matrix\_13
Debug Matrix\_21
Debug Matrix\_22
Debug Matrix\_23
Debug Matrix\_31
Debug Matrix\_32
Debug Matrix\_33
;- Berechnung
theta.f = ATan2(Matrix\_33,Matrix\_31)+#PI
phi.f = ATan2(Sin(theta)*Matrix\_31+Cos(theta)*Matrix\_33, -Matrix\_32)
ksi.f = ATan2(Cos(theta)*Matrix\_11-Sin(theta)*Matrix\_13,-Cos(theta)*Matrix\_21+Sin(theta)*Matrix\_23)
Debug ""
Debug "yaw " + StrF(D3DXToDegree(theta))
Debug "pitch " + StrF(D3DXToDegree(phi))
Debug "roll " + StrF(D3DXToDegree(ksi))
Debug ""
Yaw.f = D3DXToDegree(theta)
Pitch.f = D3DXToDegree(phi)
Roll.f = D3DXToDegree(ksi)
Matrix2.D3DXMATRIX
Matrix2\_11 = 1
Matrix2\_22 = 1
Matrix2\_33 = 1
Matrix2\_44 = 1
D3DXMatrixRotationYawPitchRoll(Matrix2.D3DXMATRIX, D3DXToRadian(Yaw), D3DXToRadian(Pitch), D3DXToRadian(Roll))
Debug "-----RESULT AFTER ROTATION (invers berechnete Transformationswinkel)-----"
Debug Matrix2\_11
Debug Matrix2\_12
Debug Matrix2\_13
Debug Matrix2\_21
Debug Matrix2\_22
Debug Matrix2\_23
Debug Matrix2\_31
Debug Matrix2\_32
Debug Matrix2\_33
CallDebugger
Doch ob das in der Praxis so immer funktionieren wird bezweifel ich stark. Angenommen du willst dass eine menschliche Figur nach vorne schaut, dann kann der Kopf oben, links, rechts, unten, einfach überall sein und das wählst du mit dieser Methode praktisch willkürlich aus.mpz hat geschrieben:grossen Dank an Gnasen der mit mir diese Matrix-Lösung in Kleinarbeit hinbekommen hat. Hier gibt es aber verschiedene "Winkelmöglichkeiten" die die selbe Matrix erzeugt. Daher kommt nicht der "gleiche" Winkel raus sondern eine YawPitchRoll Mischung die die gleiche Matrix erzeugen. In der Praxis funktioniert das super.
Zuletzt geändert von DarkDragon am 02.01.2011 20:52, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- mpz
- Beiträge: 505
- Registriert: 14.06.2005 15:53
- Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
- Wohnort: Berlin, Tempelhof
Re: 3 Winkel einer Linie im 3D Raum
Hi Darkdragon,
im Detail muss ich mich geschlagen geben. Ich habe "Dein Scaling" in einem Praktischen Beispiel eingeben und da hat es auch gut funktioniert. Das Obejekt sah zwar verzerrt aus wurde aber trotzdem korrekt gezeichnet. Für meine Funktion ist die Formel absolut aussreichend und ich werde bei Lookat eh nichts verzerren
Gruß Michael
im Detail muss ich mich geschlagen geben. Ich habe "Dein Scaling" in einem Praktischen Beispiel eingeben und da hat es auch gut funktioniert. Das Obejekt sah zwar verzerrt aus wurde aber trotzdem korrekt gezeichnet. Für meine Funktion ist die Formel absolut aussreichend und ich werde bei Lookat eh nichts verzerren
Gruß Michael
Working on
- LibSGD - MP3D Engine - 

