Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 13.08.2004, 00:04 Titel: 3D Objekt drehen und bewegen |
|
|
Wie man Objekte um die 3 einzelnen Achsen dreht, ist einfach. Aber wie dreht man eigentlich ein Objekt um eine beliebige Achse?
Und wenn jetzt ein Objekt eine beliebige Ausrichtung hat: Wie bewegt man das Objekt korrekt "nach vorne"? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 13.08.2004, 07:35 Titel: |
|
|
Mit D3DXMatrixRotationAxis() drehst du um eine selbst definierte Achse. Wenn du D3DXMatrixTranslation() nutzt kannst du das Objekte an eine bestimmte Stelle verschieben, dabei ist egal, wie es orientiert ist.
C. |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 13.08.2004, 08:11 Titel: |
|
|
Hhmm. Mit D3DXMatrixRotationAxis() hatte ich auch schon rumhantiert. Hab damit aber nichts vernünftiges zustande gekriegt. Ich habs dafür anders hingekriegt.
Wie ist das jetzt mit der Kameraführung. Da gibt es etwas, wa ich da nicht ganz versteh:
D3DXMatrixLookAtLH(&ViewMatrix,
&D3DXVECTOR3(0,0,-10), //Position
&D3DXVECTOR3(0,0,0), // Drehung
&D3DXVECTOR3(0,1,0)); //Neigung
Es gibt bei dieser Funktion 2 Vektoren für eine vollständige Bewegung im Raum. Für ein 3D-Objekt, gibt es aber 3 Achsen: X-,Y- und Z-Achse. Wie kann das sein, dass eine Kamera nur 2 benutzt und wie hab ich das zu verstehen? Ich will zunächst eine Innenansicht von einem freifliegendem Objekt haben und später noch eine Außenansicht einbauen. Aber wie geht das? Bisher hab ich nur schwachsinn fabriziert. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 13.08.2004, 09:07 Titel: |
|
|
Die Parameter sind nicht Drehung und Neigung, sondern LookAt, bzw. WorldUp - schau mal in der Hilfe nach. |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 13.08.2004, 09:36 Titel: |
|
|
Ok, stimmt. Aber ich hab da trotzdem noch ein kleines Problem. In dem FREECAM beispiel wird nur gezeigt, wie man die Kamera links, rechts um die gesamte Achse dreht. Hoch und runter drehen ist nur begrenzt (man kann nur rauf oder runter schaun). Wie erschafft man denn eine volle Drehung nach oben bzw. nach unten?
// Berechnung der Blickrichtung in der x-z-Ebene
m_vLookAt.x = sinf(m_fRotAngleY) + m_vPosition.x;
m_vLookAt.z = cosf(m_fRotAngleY) + m_vPosition.z;
// Berechnung der Blickhöhe
m_vLookAt.y = sinf(m_fRotAngleX) + m_vPosition.y;
Ich nehme an, dass hier noch etwas rein müsste, aber was? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
criss JLI'ler
Anmeldedatum: 15.02.2004 Beiträge: 169 Wohnort: Graz Umgebung Medaillen: Keine
|
Verfasst am: 13.08.2004, 10:26 Titel: |
|
|
Im Buch auf Seite 433. (den Teil weglassen)
Ich glaube du willst die Kammera ewig weiterdrehen oder?
Wenn der Rotationswinkel größer als 360° ist wird er wieder auf 0° gesetzt. _________________ Lebe dein Leben, du kommst nicht lebend wieder rauß. |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 13.08.2004, 11:55 Titel: |
|
|
Das Problem ist eher die Frage: Wie dreht man denn korrekt?
Denn dass aus 360° dann 0° werden, ist klar.
Ich will jetzt mit den Pfeiltasten die Kamera drehen können. Wenn ich jetzt irgendwie den Drehvektor änder, klappt das einfach nicht. Wie in dem oben genannten Beispiel muss es etwas gehen. Aber das mit sinf und cosf ist mir anscheinend noch zu hoch. Vielleicht kennt jemand die passende Formel um auch die Drehung um die X-Achse klarzumachen
(die oben genannte Formel sorgt nur für eine korrekt Drehung um die Y-Achse). _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
criss JLI'ler
Anmeldedatum: 15.02.2004 Beiträge: 169 Wohnort: Graz Umgebung Medaillen: Keine
|
Verfasst am: 13.08.2004, 12:02 Titel: |
|
|
Drehvektor eher Drehwinkel.
Ein Vektor gibt eine Kraft(oder Bewegung in eine Richtung an)
Ich bin mir jetzt nicht sicher ob Ein Vektor an einer Tangente auftreten kann.
Du musst mir genauer erklären was du mit: Wie dreht man richtig? meinst
edit: Ist nur Pseudocode den musst du noch anpassen
Code: |
case PFEILTASTE_UP: rotationAngle += rotationSpeed;
break;
|
_________________ Lebe dein Leben, du kommst nicht lebend wieder rauß. |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 13.08.2004, 16:04 Titel: |
|
|
Criss, mit Drehvektor mein ich LookAt.
D3DXMatrixLookAtLH(&ViewMatrix,
&D3DXVECTOR3(0,0,-10), //Position
&D3DXVECTOR3(0,0,0), // LookAt
&D3DXVECTOR3(0,1,0)); //WorldUp
Angenommen wir benutzen deinen Pseudocode:
case PFEILTASTE_UP: rotationAngle += rotationSpeed;
break;
Setz das mal um und du wirst sehen, dass sich die Kamera maximal nur nach unten bzw. nach oben neigt. Eine volle Drehung wird da nicht eintreten. Probiers doch mal aus. Es hat was mit Sinus und Cosinusformeln zu tun. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 13.08.2004, 18:08 Titel: |
|
|
das stimmt schon. ist das nicht eh das berühmte 'gimbal lock'? da mußt du irgendwie dran vorbeiarbeiten. wenn du willst das sich der lookat um die position immer weiter dreht (dann steht die kamera ab 90° up/down auf dem kopf), dann würd ich den lookat um die kameraachse drehen, die nach rechts zeigt (kreuzpr. aus UpVector und (lookat-pos)). und zwar relativ, sodass du nicht über die 90° hinauskommst.
in einem von den links wird eh auch besprochen, wie man einen vector um einen punkt drehen kann. |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.08.2004, 08:56 Titel: |
|
|
Oh mann. Irgendwie hat mir alles nichts geholfen. Was muss man überhaupt übergeben, wenn man z.B. ne Innenansicht von nem Raumschiff haben will?
Code: |
D3DXMatrixLookAtLH(&ViewMatrix,
&D3DXVECTOR3(0,0,-10), //Position
&D3DXVECTOR3(0,0,0), // LookAt
&D3DXVECTOR3(0,1,0)); //WorldUp
|
1.Position: die Koordinaten vom Raumschiff
2.LookAt: XRotationsachse+YRotationsachse
3.WorldUp: ZRotationsachse
??????
Oder wie berechnet man jetzt so ne Innenansicht? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 14.08.2004, 15:42 Titel: |
|
|
wenn dir das alles nicht geholfen hat, dann würd ich mir mal ein gscheites mathebuch kaufen. oder im inet nachlesen.
is doch klar, wie die kamera vekoren ca. aussehen müssen, aus der sicht des piloten.
pos ist ca. da wo der kopf ist (pos des schiffes + offset)
up ist up vector des schiffes
lookat is lookat des schiffes
allerdings würde man sich wenn man herumschalten kann wahrscheinlich extra ein modell fürs cockpit bauen und das dann vorn an die kamera 'dranpicken'. |
|
Nach oben |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 14.08.2004, 16:31 Titel: |
|
|
Ich habs hingekriegt. Ich hab zu Hause mehrere Bücher und hab da was zusammengeschmissen. War ja im endeffekt gar nicht so kompliziert. Ich hab auch gesehen, was diverse Autoren sich zusammengebastelt haben. Meiner Meinung nach teilweise recht umständlich. Kein Wunder,dass ich erstmal wieder lange gebraucht hab um das Prinzip zu verstehen. Ich weiß nicht, warum mir jeder immer mit dem megalangen Quellcode als Tutorial ankam, um mir die Kamera zu erklären. _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
|