Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 03:02

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 15, 2007 16:47 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Das mit dem Mü meinte ich, wenn man den Help aus dem Richtungsvektor zieht (also richtung x glob. oben). Irgendwann werden die x und y. Komponenten sooo klein, dass sich keine Vernünftige Richtung für Help mehr ermitteln lassen (Thema Float und Runden). Jetzt sagt man folgendes: Wenn die Bewegung einen bestimmten Steilheitsgrad überschreitet (nahe ez), dann berechnet man help nicht mehr, sondern lässt ihn so wie er ist (hat aber den Nachteil, dass sich das 'Fahrzeug' nicht mehr um die eigene Achse drehen kann).
mu wäre also ein Schwellenwert für den Winkel zwischen richtung und oben.
Das Gefummel mit mu kann man sich allerdings sparen, wenn man den help-Vektor bei der tastaturabfrage 'mitpflegt', also nicht nur die Richtung aus den Eingaben ermitteln, sondern auch help um 90° verdreht auf der x/y Ebene (mit Einheitslänge). Dann wied das Keruzproduckt aus Richtung und help nie undefiniert oder uneindeutig (ausser man codiert die Geschwindigkeit auch in den Richtungsvektor und das 'fahrzeug' hält an).

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 15, 2007 17:59 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also ich habe mich heut in der Schule nochmal dran gesetzt und habe mir gedacht, dass ich evtl auch bei der Translation eine Matrizenmultiplikation ausführen muss. Ich habe es ja bisher so gemacht, dass ich beim Rotieren eine Zwischenmatrix erstelle und diese mit meiner Rotationsmatrix multipliziere, die ich dann lade. Da hatte ich es aber immer so gehandhabt, dass ich die Translationsvektoren (also die 4. Spalte) manuell eingetragen hab zb: x=0, y=0, z=-2 und dann sehe ich mein Objekt direkt vor mir.

Ich habe es jetzt mal umstellt, sodass ich auch bei der Translation eine Zwischenmatrix erstelle, dort den Translationsvektor angleiche (also in diesem Fall Zwischenvektor[14]:=-2) und dann die Matrix wieder mit meiner Rotationsmatrix multipliziere. Das Resultat war... das selbe ^^ Es sah ganz genauso aus wie vorher.

Ich weiss selber, in welcher Reihenfolge ich Translate und Rotate ausführen muss, dass ich mich um das Objekt drehe, aber ich will ja kein Rotate und Translate nutzen.

Also nochmal alle wichtigen Prozeduren:
Code:
  1. // Rotieren um die X-Achse => Drehen in Y-Z-Richtung
  2. procedure TSE_Camera.RotateX (NAngle: Single);
  3. var NewRot: TMatrix44;
  4. begin
  5.   NewRot := CreateIdentityMatrix;
  6.  
  7.   NewRot[5] :=  Cos(NAngle*DEG2RAD);
  8.   NewRot[6] :=  Sin(NAngle*DEG2RAD);
  9.   NewRot[9] := -Sin(NAngle*DEG2RAD);
  10.   NewRot[10]:=  Cos(NAngle*DEG2RAD);
  11.  
  12.   fRotation := MatrixDotMatrix(fRotation,NewRot);
  13. end;
  14.  


Code:
  1. // Rotieren um die Y-Achse => Drehen in X-Z-Richtung
  2. procedure TSE_Camera.RotateY (NAngle: Single);
  3. var NewRot: TMatrix44;
  4. begin
  5.   NewRot := CreateIdentityMatrix;
  6.  
  7.   NewRot[0] :=  Cos(NAngle*DEG2RAD);
  8.   NewRot[2] := -Sin(NAngle*DEG2RAD);
  9.   NewRot[8] :=  Sin(NAngle*DEG2RAD);
  10.   NewRot[10]:=  Cos(NAngle*DEG2RAD);
  11.  
  12.   fRotation := MatrixDotMatrix(fRotation,NewRot);
  13. end;


Code:
  1. procedure TSE_Camera.OnMouseMotion (X,Y: Word; XRel, YRel: SmallInt);
  2. begin
  3.   if Movable = TRUE then
  4.   begin
  5.     if (XRel > 0) then RotateY(1);
  6.     if (XRel < 0) then RotateY(-1);
  7.  
  8.     if (YRel > 0) then RotateX(1);
  9.     if (YRel < 0) then RotateX(-1);
  10.   end;
  11. end;


Die erzeugte Matrix lade ich am Ende mit:
glLoadMatrixf(@Camera.Rotation);


Noch einmal zum Problem (:)) : Das Objekt selber dreht sich wunderbar ganz toll in alle Richtungen, alles funkt super.
Ich will mich aber ums Objekt drehen ^^

(habe auch bereits mal den Translationsvektor aud der Matrix rausgenommen und manuell nach dem Laden der Matrix die Verschiebung durch Translate versucht und auch das hat kein anderes Resultat gebracht)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 16, 2007 00:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Shaddow,
diese etwas abgehobene Diskussion hat Dir nicht viel genutzt, das sehe ich ein. Bitte entschuldige, ich versuche es noch mal, und verweise auf meine Antwort von heute morgen, wie man ein Objekt von links anschauen kann.

Wenn Du dieses Beispiel so expandierst, dass Du es
--- von vorne,
--- von links,
--- von hinten,
--- von rechts
ansehen kannst, dann bist Du doch einmal um das Objekt herumgefahren, mit anderen Worten: Du hast Dich um das Objekt herumgedreht. Für den einfachen Fall, dass Du Dich nur um die Y-Achse drehst (das ist eigentlich ein 2D-Fall), bedeutet das:

1) Die KAMERA-POSITION befindet sich auf einem Kreis um das Objekt. Die einzelnen Positionen kannst Du über Sinus/Cosinus auffinden: der Vektor Koordinatenursprung-->Kamera-Position. Das nötige glTranslate ist jetzt der genau umgekehrte Vektor davon: der Vektor Kamera-Position-->Koordinatenursprung.

2) Die nötige KAMERA-ROTATION findest Du, indem Du den Winkel zwischen dem Forward-Vektor der Kamera (das ist der Vektor (0,0,+1)) und dem (Einheits-)Vektor KameraPosition -> Koordinatenursprung berechnest. Das nötige glRotate ist nun die genau entgegengesetzte Drehung um die Y-Achse: wenn die Drehung vorher positiv (gegen den Uhrzeigersinn) war, muss es jetzt eine negative Drehung (im Uhrzeigersinn) sein.

Diese Berechnungen machst Du jetzt so oft wie Du das für nötig hältst, - das heißt, z.B. 360 mal wenn Du pro Grad rendern willst - und fährst auf diese Weise um Dein Objekt herum.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 17, 2007 12:09 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ich dachte zwar kurzzeitig, ich haette es jetz verstanden... aber verstanden hab ichs trotzdem nich.
Ich versteh einfach nich, wie ich das berechnen soll. Ich verstehe weder wie ich das mit der Kreisbahn realisieren soll, noch wie ich das ganze dann fuer jedes einzelne Objekt umsetzen soll.

Im Grunde will ich ja nur wissen, wie man aus

Code:
  1.  
  2.   NewRot[5] :=  Cos(NAngle*DEG2RAD);
  3.   NewRot[6] :=  Sin(NAngle*DEG2RAD);
  4.   NewRot[9] := -Sin(NAngle*DEG2RAD);
  5.   NewRot[10]:=  Cos(NAngle*DEG2RAD);

einen Code macht, der genau das gegenteil tut ^^

Ich habe mir deinen post jetzt echt sicher 3 mal durchgelesen, aber ich kriegs nicht ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 17, 2007 12:52 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Du willst in die andere Richtung drehen? Leute die sich mit Matrizenrechnung auskennen, werden dir antworten: Transposition. Sprich Du must Zeilen mit Spalten in der Matrix vertauschen - also eigentlich nur die Indizes richtig verändern. Dieser Trick Funktioniert allerdings nur mit Rotationsmatrizen! Ansonstern kann man aber auch mit negaitvem Winkel drehen, das läuft auf das selbe hinaus - bei Rotationsmatrizen von denen man nur weiss, daß es sich um Rotationsmatrizen handelt, ist aber der Transpositionstrick sinnvoll.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 17, 2007 17:01 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Nein nico ^^ das will ich nicht das mit der transposition kenn ich ja.
mit "das gegenteil" meinte ich:
Ein Objekt soll sic nict um sich selbst sonder um mich drehen und da weiss ih noch immer nicht wie ich das realisieren soll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 17, 2007 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Shaddow,
ich hatte heute und gestern ziemlich viel zu tun, und dann noch gestern weggewesen und "gelumpt", heute steht mir das nochmal bevor, kann daher heute nicht. Aber ich hatte ein Beispielgrogramm für Dein erstes Programm gemacht (sonst hätte ich den Fehler nicht gefunden). Ich mache Dir einen Vorschlag: ich schreibe morgen einen Beispielcode und poste das, wenns fertig ist.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Shaddow,

Vorneweg gleich ein Paar Dinge:

1. die Reihenfolge, die ich oben beschrieben habe (zuerst Translation, dann Rotation) war falsch. Es ist genau andersrum.
2. Sei nicht enttäuscht, wenn das Resultat genauso aussieht, wie eine normale Objektrotation. Denn wenn man nur ein Objekt rotiert, kann man keinen Unterschied erkennen. Aber Du weißt ja selbst, dass es ein großer Unterschied ist, ob man zuerst rotiert und dann verschiebt, oder es andersrum macht.
3. Ich habe das Demo nur mit den OpenGL-Befehlen gemacht. Wie Du das in Deine Matrizen packst, musst Du selber wissen.
4. Das Demo arbeitet mit der Höhe/Breite des Fensters in Pixeln.
5. Ich habe drei verschiedene Fälle hineingeschrieben, die ersten beiden sind auskommentiert
6. Die globale Variable "Angle" muss zu Programmbeginn auf Null gesetzt werden.
7. Die Prozedur braucht die Units Math und dglOpenGl zum Kompilieren.

Code:
  1. Procedure DrawBigRedQuad;
  2. Var
  3.    Viewport: Array [0..3] Of Integer;
  4.    X,Y,Z: Single;
  5. Begin
  6.    glGetIntegerv(GL_VIEWPORT, @viewport);
  7.    X:= ViewPort[2];
  8.    Y:= ViewPort[3];
  9.  
  10.    glMatrixMode(GL_PROJECTION);
  11.    glLoadIdentity();
  12.    gluPerspective(45,X/Y,0.1,1000);
  13.  
  14.    glMatrixMode(GL_MODELVIEW);
  15.    glLoadIdentity;
  16.  
  17.   //---------------------------------------------------------------------------------------
  18.    If Angle >= 360         // "Angle" muss zu Beginn des Programms
  19.       Then Angle:= 0       // auf Null gesetzt werden
  20.       Else Inc(Angle,1);
  21.  
  22.    // 1. Das Objekt dreht sich um seine eigene Achse, von mir entfernt
  23.    //glTranslatef(0,0,-400);   // Weltverschiebung
  24.    //glRotatef(Angle,0,1,0);   // Rotation der verschobenen Welt
  25.  
  26.    // 2. Das Objekt dreht sich um mich, ist von mir entfernt
  27.    // (dadurch ist es manchmal nicht sichtbar)
  28.    //glRotatef(Angle,0,1,0);   // Weltrotation
  29.    //glTranslatef(0,0,-400);   // Verschiebung der rotierten Welt
  30.  
  31.    // 3. Ich drehe mich um das feststehende Objekt
  32.    // (sieht genauso aus wie 1., IST ABER NICHT DAS GLEICHE)
  33.    X:= sin(Angle*PI/180)*400;
  34.    Z:= cos(Angle*PI/180)*400;
  35.    glRotatef(-Angle,0,1,0);    // Weltrotation
  36.    glTranslatef(-X,0,-Z);      // Verschiebung der rotierten Welt
  37.                                // in Abhängigkeit von der Rotation
  38.   //---------------------------------------------------------------------------------------
  39.  
  40.    glColor4f(1,0,0,1);
  41.    glBegin(GL_QUADS);
  42.       glTexCoord2f(0,0); glVertex3f(-100,-100,0); // Links unten
  43.       glTexCoord2f(1,0); glVertex3f(+100,-100,0); // Rechts unten
  44.       glTexCoord2f(1,1); glVertex3f(+100,+100,0); // Rechts oben
  45.       glTexCoord2f(0,1); glVertex3f(-100,+100,0); // Links oben
  46.    glEnd;
  47. End;



Fürs Prinzip ist es völlig egal ob Du das mit Matrizen oder mit Translate/Rotate machst. VIEL WICHTIGER IST ABER, zu erkennen, dass man mit diesen beiden Befehlen Rotate/Translate bereits alles in der Tasche hat. Ehrlich! Du kannst damit komplexe animierte Objekte herstellen, wenn Du diesen Schritt jetzt schaffst. Es ist alles Trigonometrie und 3D-Mathe, häufig sogar gar nicht kompliziert. Was Du mit OpenGL machen kannst, hängt NUR VON DEINER VORSTELLUNGSKRAFT AB.
Traude


Zuletzt geändert von Traude am So Feb 18, 2007 13:06, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 13:01 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Erst ma danke fuer deine Mühe :)

Aber alles was du da geschrieben hast, wusste ich schon ^^

Traude hat geschrieben:
3. Ich habe das Demo nur mit den OpenGL-Befehlen gemacht. Wie Du das in Deine Matrizen packst, musst Du selber wissen.

Genau das ist es, was ich wissen wollte ^^ Wie uebersetze ich Rotate+Translate in eine Matrix


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Öh, das hab ich aus Deinen Fragen nicht herausgehört.

Wenn Du glRotate sagst, brauchst Du ja einen Winkel. Also HAST Du einen Winkel, nicht wahr? den übergibst Du an Deine MatrixErzeugungs-Funktion (Du hast ja sogar schon eine geschrieben!), und als Ergebnis kommt jetzt eine X- oder Y- oder Z-Rotationsmatrix heraus. Diese Rotationsmatrix fütterst Du mit glLoadMatrix oder glMultMatrix (je nachdem) ins OpenGl hinein.
Aber das weißt Du doch selber oder?


Nachtrag: oder möchtest Du wissen, wie man um eine beliebige Achse rotiert? Genau das tut glRotate ja schließlich.
Ich habe das nach diesem Link gemacht: http://www.gris.informatik.tu-darmstadt.de/~tkirste/GDV-I/03-Affin.pdf,
Du findest die nötigen Unterlagen auf Seite 14.


Zuletzt geändert von Traude am So Feb 18, 2007 13:41, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 13:40 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Genau das hab ich ja schon alles. Ich lasse ein Objekt um seine Achse rotieren. Aber ich willl, dass das Objekt um mich herum rotiert. Mir gehts jetz nur drum: wie veraendere ich meinen Code, dass genau das passiert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Neuerlicher Anlauf,
diesmal hab ich die glRotate-Befehle in DEINE Matrixschreibweise übersetzt und habe bei Punkt drei noch eine Objektrotation hinzugefügt (wenn Dir das jetzt auch nicht gefällt, dann geb ichs auf):

Code:
  1. Type
  2.   TTransfMatrix = Array[0..15] Of Single;


Code:
  1. //********************************************************************
  2. Function CreateIdentityMatrix: TTransfMatrix;
  3. Var I: Integer;
  4. Begin
  5.    For I:= 0 To 15 Do Result[I]:= 0;
  6.    Result[0] :=1;
  7.    Result[5] :=1;
  8.    Result[10]:=1;
  9.    Result[15]:=1;
  10. End;
  11. //********************************************************************
  12. Function RotX_Matrix(NAngle: Single): TTransfMatrix;
  13. Const DEG2RAD = PI/180;
  14. begin
  15.    Result := CreateIdentityMatrix;
  16.  
  17.    Result[5] := Cos(NAngle*DEG2RAD);
  18.    Result[6] := Sin(NAngle*DEG2RAD);
  19.    Result[9] := -Sin(NAngle*DEG2RAD);
  20.    Result[10]:= Cos(NAngle*DEG2RAD);
  21. end;
  22. //********************************************************************
  23. Function RotY_Matrix(NAngle: Single): TTransfMatrix;
  24. Const DEG2RAD = PI/180;
  25. begin
  26.    Result := CreateIdentityMatrix;
  27.  
  28.    Result[0] := Cos(NAngle*DEG2RAD);
  29.    Result[2] := -Sin(NAngle*DEG2RAD);
  30.    Result[8] := Sin(NAngle*DEG2RAD);
  31.    Result[10]:= Cos(NAngle*DEG2RAD);
  32. end;


Code:
  1. //********************************************************************
  2. Procedure DrawBigRedQuad(AReceiver,AEvent,AContent: Integer);
  3. Var
  4.    Viewport: Array [0..3] Of Integer;
  5.    LocalRotX_Matrix: TTransfMatrix;
  6.    LocalRotY_Matrix: TTransfMatrix;
  7.    X,Y,Z: Single;
  8. Begin
  9.    glMatrixMode(GL_PROJECTION);
  10.    glLoadIdentity();
  11.    glGetIntegerv(GL_VIEWPORT, @viewport);
  12.    X:= ViewPort[2];
  13.    Y:= ViewPort[3];
  14.    gluPerspective(45,X/Y,0.1,1000);
  15.  
  16.    glMatrixMode(GL_MODELVIEW);
  17.    glLoadIdentity;
  18.  
  19.    //----------------------------------------------------------------------------------------------------
  20.    If Angle >= 360         // "Angle" muss zu Beginn des Programms
  21.       Then Angle:= 0       // auf Null gesetzt werden
  22.       Else Inc(Angle,1);
  23.  
  24.    LocalRotX_Matrix:= RotX_Matrix(-Angle);
  25.    LocalRotY_Matrix:= RotY_Matrix(-Angle);
  26.  
  27.    // 1. Das Objekt dreht sich um seine eigene Achse, von mir entfernt
  28.    //glTranslatef(0,0,-400);   // Weltverschiebung
  29.    //glMultMatrixf(@LocalRotY_Matrix);  // Rotation der verschobenen Welt
  30.  
  31.    // 2. Das Objekt dreht sich um mich, ist von mir entfernt
  32.    // (dadurch ist es manchmal nicht sichtbar)
  33.    //glMultMatrixf(@LocalRotY_Matrix);  // Weltrotation
  34.    //glTranslatef(0,0,-400);   // Verschiebung der rotierten Welt
  35.  
  36.    // 3. Ich drehe mich um ein rotierendes Objekt
  37.    // (sieht genauso aus wie 1., IST ABER NICHT DAS GLEICHE)
  38.    X:= sin(Angle*PI/180)*400;
  39.    Z:= cos(Angle*PI/180)*400;
  40.    glMultMatrixf(@LocalRotY_Matrix);  // Weltrotation
  41.    glTranslatef(-X,0,-Z);      // Verschiebung der rotierten Welt
  42.                                // in Abhängigkeit von der Rotation
  43.    glMultMatrixf(@LocalRotX_Matrix);  // Objektrotation
  44.    //----------------------------------------------------------------------------------------------------
  45.  
  46.    glColor4f(1,0,0,1);
  47.    glBegin(GL_QUADS);
  48.       glTexCoord2f(0,0); glVertex3f(-100,-100,0); // Links unten
  49.       glTexCoord2f(1,0); glVertex3f(+100,-100,0); // Rechts unten
  50.       glTexCoord2f(1,1); glVertex3f(+100,+100,0); // Rechts oben
  51.       glTexCoord2f(0,1); glVertex3f(-100,+100,0); // Links oben
  52.    glEnd;
  53. End;
  54. //********************************************************************


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 15:42 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Wir kommen der Sache ja jetz immer naeher ^^

Also das hatte ich soweit schon ma in etwa:

Code:
  1.   glLoadMatrixf(@Camera.Rotation);
  2.   glTranslatef(0,0,-2);


Rotation ist jetzt eine Rotationsmatrix, wo die vierte Spalte die Form (0,0,0,1) hat, also keine Auswirkungen.

Wenn ich jetz "manuell" mit Translate um einen Vektor verschiebe, dann funkt alles so wie ich möchte. Aber in der Matrix gibt es ja nicht umsonst diese 4. Spalte, das ist ja die Verschiebungsvektor, den will ich ja nutzen. Wenn ich jetz die vierte Spalte in der Form (0,0,-2,1) mache und das Translate nutze, dann dreht sich wieder nur das Objekt.

Ich muss jetz einfach dieses Translate irgendwie in die Rotationsmatrix einbauen. Habe das bereits ueber das erzeugen einer seperaten Matrix, die dann mit der Rotationsmatrix multipliziert wird, getestet, aber bringt nix.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Wie sich Deine endgültige Transformations-Matrix verhält, hängt davon ab wie Du sie erzeugt hast. Du musst dazu einfach Deine Kenntnisse über Matrizenmultiplikation zu Hilfe rufen (Matrixmultiplikationen sind nicht kommutativ):

Wenn Du eine Matrix basteln willst, die SOWOHL rotiert ALS AUCH verschiebt, musst Du Dir überlegen, was Du haben willst:



----- Wenn Du zuerst verschieben und dann erst rotieren möchtest, musst du zuerst eine Translationsmatrix erzeugen und sie dann mit einer Rotationsmatrix multiplizieren. Das Gleiche kommt heraus, wenn man es wie Du macht, indem man einfach die letzte Spalte mit Werten besetzt. Offenbar warst Du Dir nicht bewußt, dass Du damit bereits eine Rechenoperation vollzogen hast.

TRANSFORMATIONSMATRIX1 = TRANSLATIONSMATRIX X ROTATIONSMATRIX



----- Wenn Du zuerst rotieren und dann verschieben willst, dann erzeugst du einfach Deine Rotationsmatrix zuerst und multiplizierst Deine Translationsmatrix dazu:

TRANSFORMATIONSMATRIX2 = ROTATIONSMATRIX X TRANSLATIONSMATRIX


und die beiden sind nicht identisch:

TRANSFORMATIONSMATRIX1 <> TRANSFORMATIONSMATRIX2


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 18:14 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also ich habe jetzt (dank der aktiven Hilfe von Traude ^^) die Lösung ^^


Es geht nicht, dass ich nur eine Matrix habe und diese Matrix dann du Multiplikation immer wieder verändere.
Ich brauche
1 Translationsmatrix (Eine Einheitsmatrix, bei der nur die 4. Spalte verändert wird (Translationsvektor)
1 Rotationmatrix (EIne Matrix, bei der die ersten 3 spalten per Sin/Cos berechnet werden, wie im Tutorial Nachhilfe beschrieben wird)

1 Transformationsmatrix, die das Produkt aus beiden Matrizen ist

Wenn man diese Matrix lädt, geht alles Wunderbar.
Ich habe das jetz nur kurz getestet und es geht. Ich gleiche das nachher noch kurz auf die Funktionen an und poste hier den Code ^^
Danke nochma


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]