JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Bounding Box von X-Models (DirectX 8.1)

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 17.09.2004, 19:31    Titel: Bounding Box von X-Models (DirectX 8.1) Antworten mit Zitat

Tach,
Ich bin's mal wieder. Jetzt wo mein Programm im Prinzip fertig ist kümmere ich mich noch um die performance. Also habe ich Frustum culling hinzugefügt. Klappt super. Ich benutze bounding boxes.
Aber wie kann ich die bounding box eines *.x-models kriegen? Muss ich alle Punkte aus dem FVF nach dem größten durchsuchen? Oder geht das einfacher?
Im voraus schonmal danke.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 17.09.2004, 20:13    Titel: Antworten mit Zitat

2 neue Vektoren: einen mit den Minimalwerten aller X-File Vektoren und einen mit den Maximalwerten. Im Prinzip sehr easy:
alle Vektroen durchgehen und wenn irgendeinenr der 3 Werten kleiner oder größer als der Mini bzwe. Maximalvektor ist ersetzen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 17.09.2004, 20:45    Titel: Antworten mit Zitat

Am Schluss nicht vergessen auf mögliche Skalierungen,... des Objektes einzugehen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 17.09.2004, 22:01    Titel: Antworten mit Zitat

Danke für die Antworten ich werd's versuchen.
P.S. Ich werd die Bounding Box in ein Feld von 8 Vektoren speichern und darauf dann mit D3DXVec3Transform die Transformationsmatrix des Objekts anwenden.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 02:09    Titel: Antworten mit Zitat

Für die BB sollten zwei Vektoren (z.B. linke obere, rechte untere) reichen. Die anderen kannst du dir berechnen.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 12:19    Titel: Antworten mit Zitat

Die transformierte Bounding Box muss ich aber mit 8 Vektoren da sie ja auch rotiert sein kann. Und auf grund des aufbaus meines programms wäre es ziemlich ineffektiv die untrasformierte nur mit 2 Vektoren zu speichern.
P.S. Sorry mir ist grad erst aufgefallen dass ich die frage in der falschen kategorie gestellt hab. Kann ja vielleicht ein moderator mal in DirectX-OpenGL schieben.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 13:39    Titel: Antworten mit Zitat

Dr. Best hat Folgendes geschrieben:
Die transformierte Bounding Box muss ich aber mit 8 Vektoren da sie ja auch rotiert sein kann. Und auf grund des aufbaus meines programms wäre es ziemlich ineffektiv die untrasformierte nur mit 2 Vektoren zu speichern.
P.S. Sorry mir ist grad erst aufgefallen dass ich die frage in der falschen kategorie gestellt hab. Kann ja vielleicht ein moderator mal in DirectX-OpenGL schieben.

Das mit den rotieren kann aber nur funktionieren wenn du auch OBB's verwendest! Ansonsten musst du die BoundindBox so berechnen dass sie so groß ist, dass die Rotation nicht von Relevanz ist(sich das Objekt also immer in der Box befindet, egal wie es rotiert wurde). Ich denke für ein Frustum Culling sollte das ausreichen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 21:03    Titel: Antworten mit Zitat

Notfalls gibts ja auch noch Bounding Spheres Wink
Dabei ist die Rotation sowieso egal und du brauchst nur einen Variable für den Radius Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 23:24    Titel: Antworten mit Zitat

Das Frustum culling klappt prima so wie es ist. Da mein Programm für andere zum spiele machen ist weiß ich nicht was für objekte verwendet werden. Daher sind mir Bounding spheres und BoundingBoxes aus nur 2 Vektoren zu unpräzise. Es könnt ja sein das Objekte verwendet werden die sehr lang gezogen sind.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 18.09.2004, 23:26    Titel: Antworten mit Zitat

äh, eine Bounding Box besteht im Prinzip immer aus nur 2 Vektoren.
Du kannst jedes beliebige Achsenausgerichtete Rechteck im 3 Dimensionale Raum mit genau 2 Vektoren bestimmen!

Denk mal an die Rect Struktur die Spiechert auch nur 2 Punkte und keine 4, obwohl ein Viereck vier hat.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 00:51    Titel: Antworten mit Zitat

Aber wenn ich jetzt eine lange BoundingBox habe (z.B. x=1 y=1 z=100) und diese dann an allen Achsen um 45° drehe dann wäre die Box auf einmal ein Würfel. Sie würde einen sehr viel größeren Raum einschließen als das Objekt tatsächlich einnimmt. Das Culling wäre unpräzise. Da verwende ich lieber acht vektoren. Ich muss ja eh alle 8 Eckpunkte überprufen auch wenn ich sie nur in 2 Vektoren speichere und später errechne.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 01:10    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
2 neue Vektoren: einen mit den Minimalwerten aller X-File Vektoren und einen mit den Maximalwerten. Im Prinzip sehr easy:

alle Vektroen durchgehen und wenn irgendeinenr der 3 Werten kleiner oder größer als der Mini bzwe. Maximalvektor ist ersetzen.


Ich hab's jetzt mal versucht. Aber so hab ich das nicht hingekriegt. Also hab ich nochmal ins DX Culling sampel geguckt und siehe da: Ich hab gefunden was ich suchte:
Code:
    // Determine bounding box of the teapot
    D3DXVECTOR3 vecMin;
    D3DXVECTOR3 vecMax;
    BYTE* pVertices;
    if( FAILED( hr = m_pMeshTeapot->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID*)&pVertices) ) )
        return hr;
    hr = D3DXComputeBoundingBox( (D3DXVECTOR3*)pVertices, m_pMeshTeapot->GetNumVertices(),
        D3DXGetFVFVertexSize(m_pMeshTeapot->GetFVF()), &vecMin, &vecMax );
    m_pMeshTeapot->UnlockVertexBuffer();

_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 19.09.2004, 01:19    Titel: Antworten mit Zitat

äh, ich hab mal folgendes gelesen:
Kollision ist nur mit Achsenausgerichteten Quader einfach, sind sie es nicht kann man nicht mehr so einfach testen, ob ein Punkt in ihnen liegt.

Wurden sie durch eine Matrix rotiert, bzw transformiert, so wendet man die Matrix einfach auf den Punkt an. Dadurch testet man nicht ob der Punkt im transformierten Quader ist, sondern ob der transformierte Punkt im nicht transformierten Quader ist, was viel einfacher ist, aber den gleichen effekt hat.

Man kann das glaub ich auch auf Ebenen anwenden, die man ja zum ViewFrustrum Culling braucht.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 35
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 02:02    Titel: Antworten mit Zitat

Ich lasse einfach mal code sprechen:
Code:
bool ModelVisible(int obj) {
   //Wir zählen mit, wievielen Punkt links/rechts,
   //vorne/hinten etc. außerhalb liegen
   int f=0,n=0, l=0,r=0, t=0,b=0;

   for (int k=0; k<8; k++) {
      n+=(D3DXPlaneDot(&Frustum[4], &model[obj].BoxTransed[k]) < 0.0f);
      f+=(D3DXPlaneDot(&Frustum[5], &model[obj].BoxTransed[k]) < 0.0f);}

   if (n==8||f==8) return 0;

   for (int i=0; i<8; i++) {
      l+=(D3DXPlaneDot(&Frustum[0], &model[obj].BoxTransed[i]) < 0.0f);
      r+=(D3DXPlaneDot(&Frustum[1], &model[obj].BoxTransed[i]) < 0.0f);}

   if (r==8||l==8) return 0;

   for (int j=0; j<8; j++) {
      t+=(D3DXPlaneDot(&Frustum[2], &model[obj].BoxTransed[j]) < 0.0f);
      b+=(D3DXPlaneDot(&Frustum[3], &model[obj].BoxTransed[j]) < 0.0f);}

   if (t==8||b==8) return 0;
   return 1;}

Wie wohl schon oft genug gesagt klappt das Prima.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
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