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
|
Verfasst am: 17.09.2004, 19:31 Titel: Bounding Box von X-Models (DirectX 8.1) |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 17.09.2004, 20:13 Titel: |
|
|
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 |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.09.2004, 20:45 Titel: |
|
|
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 |
|
 |
Dr. Best Senior JLI'ler

Alter: 35 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 17.09.2004, 22:01 Titel: |
|
|
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 18.09.2004, 02:09 Titel: |
|
|
Für die BB sollten zwei Vektoren (z.B. linke obere, rechte untere) reichen. Die anderen kannst du dir berechnen.
C. |
|
Nach oben |
|
 |
Dr. Best Senior JLI'ler

Alter: 35 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.09.2004, 12:19 Titel: |
|
|
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 |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 18.09.2004, 13:39 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.09.2004, 21:03 Titel: |
|
|
Notfalls gibts ja auch noch Bounding Spheres
Dabei ist die Rotation sowieso egal und du brauchst nur einen Variable für den Radius  _________________ 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 |
|
 |
Dr. Best Senior JLI'ler

Alter: 35 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.09.2004, 23:24 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 18.09.2004, 23:26 Titel: |
|
|
ä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 |
|
 |
Dr. Best Senior JLI'ler

Alter: 35 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.09.2004, 00:51 Titel: |
|
|
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 |
|
 |
Dr. Best Senior JLI'ler

Alter: 35 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.09.2004, 01:10 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.09.2004, 01:19 Titel: |
|
|
ä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 |
|
 |
Dr. Best Senior JLI'ler

Alter: 35 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.09.2004, 02:02 Titel: |
|
|
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 |
|
 |
|