JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7dccd40753602cd11ef28d56429a5c0cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Extreme Billboarding
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 15.07.2005, 09:03    Titel: Extreme Billboarding Antworten mit Zitat

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. Smile
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. Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 09:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 16:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 18:04    Titel: Antworten mit Zitat

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 Wink
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 18:25    Titel: Antworten mit Zitat

Achso. Smile

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. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 18:33    Titel: Antworten mit Zitat

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 Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 18:47    Titel: Antworten mit Zitat

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 Wink

Stimmt auch. Wofür brauch ich das dann überhaupt. Ich will doch nur ganz normales Extreme Billboarding machen. Razz
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 19:07    Titel: Antworten mit Zitat

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. Wink


Zuletzt bearbeitet von KI am 15.07.2005, 19:25, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 19:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 19:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 20:00    Titel: Antworten mit Zitat

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 Wink kann man natürlich auch weglassen, also rotation auf 0 und skalation auf 1.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 20:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 20:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 20:55    Titel: Antworten mit Zitat

Und woher weiß ich, ob ich -vXSize oder +vXSize machen muss?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.07.2005, 21:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum