|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 09:03 Titel: Extreme Billboarding |
|
|
Hi,
ich bin hier vor einer mittelschweren Verzweiflung. Ich habe ein 3D-Projekt, in dem es Quads gibt, welche immer zur Kamera ausgerichtet sein sollen.
Am besten gefällt mir die Viewpoint oriented Methode:
Ich krieg die entsprechende World-Matrix einfach nicht hin. Ich bin mir aber sicher einer von euch Mathe-Profs wird eine Lösung haben.
Es soll kein solches Billboarding sein, wie im DX-SDK-Projekt, da dort das Quad nur um die Y-Achse rotiert wird.
Es soll gewissermaßen Extreme Billboarding sein. Also um alle 3 Achsen.
Ich habe rausgefunden, dass es auch einen Unterscheid macht in welcher Reihenfolge ich die Rotaionsmatritzen zusammensetze. (matRotX * matRotY * matRotZ ungleich matRotZ * matRotY * matRotX)
Ich suche die Formel mit der sich die Billboard-World-Matrix errechnen lässt. Es gäbe natürlich auch die Möglichkeit in den Vertexbuffer zu schreiben und die Kooardinaten "manuell" anzupassen, aber eigentlich will ich das nicht.
Danke schonmal
-KI |
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 15.07.2005, 09:16 Titel: |
|
|
Normalerweise reichen X- und Y-Achse.
Is net so schwer. Nimmst halt ne Matrix, skalierst sie, dann nimmst du eine X- und Y-Achsen-Matrix, multiplizierst sie miteinander und zum Schluss _41, _42, _43 setzen. Für X-Achse is die selbe Gleichung wie für Y.
Gruß _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 16:26 Titel: |
|
|
HomeLess_PunkDrummer hat Folgendes geschrieben: | Normalerweise reichen X- und Y-Achse.
Is net so schwer. Nimmst halt ne Matrix, skalierst sie, dann nimmst du eine X- und Y-Achsen-Matrix, multiplizierst sie miteinander und zum Schluss _41, _42, _43 setzen. Für X-Achse is die selbe Gleichung wie für Y.
Gruß |
Was jetzt genau? Eine Matrix nehmen und skalieren? Eine Einheitsmatrix? Um welchen Faktor soll sie denn skaliert werden?
Und was ist einen X- bzw- Y-Achesenmatrix. Ich würde mich freuen, wenn du das noch etwas genauer beschreiben könntest.
Was bedeutet _41, _42, _43 setzen? Soll ich diese Segmente auf 1 setzen?
Mich interessiert natürlich auch der Sinn dahinter... aber ertsmal soll es übehaupt funktionieren. |
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 15.07.2005, 18:04 Titel: |
|
|
Oh sorry *hehe*
Also, ich meinte eine Scalematrix... diese Skalierst du mit den drei Faktoren
Code: |
vScale.x 0 0 0
0 vScale.y 0 0
0 0 vScale.z 0
0 0 0 1 |
Dann eine Matrix, die um die x-Achse rotiert ist, und eine um die y-Achse:
CPP: | RotY=MatrixRotationY(AngleY);
RotX=MatrixRotationX(AngleX);
|
Dann multiplizierst du die drei:
CPP: | Trans=RotX*RotY*Scale; |
Die drei Elemente _41, _42, _43 sind ide Position... also x, y, z;
CPP: | Trans._41=vPos.x;
Trans._42=vPos.y;
Trans._43=vPos.z;
lpD3DDevice->SetTransform(D3DTS_WORLD, Trans); |
Naja, ist eigentlich nicht so schwer
Aber du amchst noch nicht lange 3D?
Gruß _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 18:25 Titel: |
|
|
Achso.
Und woher weiß ich was AngleY und AngleX ist? Muss ich da irgendwelche Winkel vorher ausrechen?
Woher ist der Skalierungsvektor vScale? Soll ich den einfach auf (1.0f, 1.0f, 1.0f) machen?
Und die Position ist der Mittelpunkt des Quads, oder wie?
Ich hab schon viel mit D3D gemacht, aber Billboarding eben noch nie. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.07.2005, 18:33 Titel: |
|
|
KI hat Folgendes geschrieben: |
Woher ist der Skalierungsvektor vScale? Soll ich den einfach auf (1.0f, 1.0f, 1.0f) machen? |
Dann könntest du den ja genausogut weglasesn _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 18:47 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | KI hat Folgendes geschrieben: |
Woher ist der Skalierungsvektor vScale? Soll ich den einfach auf (1.0f, 1.0f, 1.0f) machen? |
Dann könntest du den ja genausogut weglasesn |
Stimmt auch. Wofür brauch ich das dann überhaupt. Ich will doch nur ganz normales Extreme Billboarding machen. |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 19:07 Titel: |
|
|
HomeLess_PunkDrummer
Aus deinem Beitrag kann ich nur entnehmen, wie man eine Matrix skaliert, dreht und verschiebt. Aber es geht ja um Billboarding! Ich muss wissen um welchen Winkel ich das Quad drehen muss!
Klar, eine Matrix skalieren, rotieren, verschieben kann jeder.
Zuletzt bearbeitet von KI am 15.07.2005, 19:25, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.07.2005, 19:16 Titel: |
|
|
CPP: | //Vektoren aus der Matrix bestimmen
vKamX=D3DXVECTOR3(Kameramatrix._11, Kameramatrix._21, Kameramatrix._31);
vKamY=D3DXVECTOR3(Kameramatrix._12, Kameramatrix._22, Kameramatrix._32);
vKamZ=D3DXVECTOR3(Kameramatrix._13, Kameramatrix._23, Kameramatrix._33);
//und normalisieren
D3DXVec3Normalize(&vKamX, &vKamX);
D3DXVec3Normalize(&vKamY, &vKamY);
D3DXVec3Normalize(&vKamZ, &vKamZ); |
CPP: | vXSize=((vKamX*cosf(fRotation)*fScaling)+(vKamY*sinf(-fRotation)*fScaling))*0.5;
vYSize=((vKamX*sinf(fRotation)*fScaling)+(vKamY*cosf( fRotation)*fScaling))*0.5;
|
CPP: | Vertices[i+0].vPosition=vPosition-vXSize+vYSize;//Links oben
Vertices[i+1].vPosition=vPosition+vXSize+vYSize;//Rechts oben
Vertices[i+2].vPosition=vPosition-vXSize-vYSize;//Links unten |
Also, der code geht davon aus, das du einen Mittelpunkt vom Sprite hast, und daraus mit den Vektoren die Eckpunkte berechnest. so hab ich das mla gemacht, ging wunderbar. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 19:49 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | CPP: | vXSize=((vKamX*cosf(fRotation)*fScaling)+(vKamY*sinf(-fRotation)*fScaling))*0.5;
vYSize=((vKamX*sinf(fRotation)*fScaling)+(vKamY*cosf( fRotation)*fScaling))*0.5;
|
Also, der code geht davon aus, das du einen Mittelpunkt vom Sprite hast, und daraus mit den Vektoren die Eckpunkte berechnest. so hab ich das mla gemacht, ging wunderbar. | Wofür brauche ich fRotation und fScaling? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.07.2005, 20:00 Titel: |
|
|
achja, das war, wenn ich die Sprites drehen wollte, also um die Achse von der Kamera durchs sprite
und skalation, tja, wenns halt größer werden soll kann man natürlich auch weglassen, also rotation auf 0 und skalation auf 1. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 20:17 Titel: |
|
|
Das Problem bei der Methode ist, dass man die Koordinaten im Vertexbuffer direkt verändern muss. Ich wollte das ja eigentlich über eine Worldmatrix regeln... |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.07.2005, 20:49 Titel: |
|
|
naja, ok, da musst du halt für jedes Sprite die Weltmatrix extra setzten, und jedes Sprite einzelnt rendern. So berechnest du das einmal und renderst alles in einem Rutsch. Müsste man evtl. testen was schneller ist. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.07.2005, 20:55 Titel: |
|
|
Und woher weiß ich, ob ich -vXSize oder +vXSize machen muss? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.07.2005, 21:27 Titel: |
|
|
ok, stell dir n Kreuz vor. In der Mitte, das ist der Mittelpunkt des Sprites, der wert der gespeichert wird. Jetzt weißt du wie lang die Balken nach oben und nahc rechts sind. In die anderen, haben halt die sleben Werte nur negativ. der Trick ist halt auch das das Richtugnsvektoren sind, das das Sprite somit ausgerichtet ist.
So, dann musste ja jetzt um eine Ecke zu finden, den Hoch und den rechtsvekotr addieren. Wenn du dir das in 2D mit dem kreuz vorstellst ist es logisch, in 3D funzt das halt genauso. Damit kannste jetzt mit den beidne Werten alle 4 Punkte ausrechnen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|