JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Frustum & Bounding-Sphere

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



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 14.06.2005, 16:38    Titel: Frustum & Bounding-Sphere Antworten mit Zitat

Moin Moin,

mir bereit mein Sichtbarkeitstest mit einer Bounding-Sphere etwas Kopfzerbrechen. Und zwar ist der Sichtbarkeitstest zu früh der Meinung, das eine Sphere nicht mehr sichtbar ist. Hier mal 2 Bildchen was ich meine:

>> Der weiße Klops ist die Bounding-Sphere, Radius und Mittelpunkt der ganzen Geschichte sollten eigentlich passen.


>> Hier ist jetzt noch ein relativ großer Teil des "Klops" zu sehen, aber der Sichtbarkeitstest ist schon der überzeugung das da nichts mehr ist.

Hier mal etwas Code:
Zuerst das berechnen des Abstandes des Mittelpunktes zu den einzelnen Planes des Frustum:

CPP:
CEDLL float cePointPlaneDistance(const D3DXVECTOR3 &vPoint, const CEPLANE &cePlane)
{
   return cePlane.a * vPoint.x + cePlane.b * vPoint.y + cePlane.c * vPoint.z + cePlane.d;
}



Hier die ganze Marie in der Benutzung:
CPP:
bool CEFrustum::IsSphereinFrustum(CEOBJECT ceObject)
{
   int iTrueCounter = 0;
   for(int i=0;i < 6; i++) {
      float fDistance = cePointPlaneDistance(ceObject.vecCenter,m_Plane[i]);
      //char cTest[1024];
      //sprintf(cTest,"int: %d: fDistance: %f - Radius: -%f\n",i,fDistance,ceObject.fRadius);
      //CE_WRITELOG(cTest);
      if(fDistance <= -ceObject.fRadius)
         return false;
      else
         iTrueCounter++;
   }
   if(iTrueCounter==6)
      return true;
   else
      return false;
}


Und hier noch das errechnen der Planes:
CPP:
void CEFrustum::ExtractPlanes(D3DXMATRIX viewMat, D3DXMATRIX projMat, bool bNormalize)
{
   D3DXMATRIX comboMatrix;
   D3DXMatrixMultiply(&comboMatrix, &viewMat, &projMat);

   // Left clipping Plane:
   m_Plane[0].a   = comboMatrix._14 + comboMatrix._11;
   m_Plane[0].b   = comboMatrix._24 + comboMatrix._21;
   m_Plane[0].c   = comboMatrix._34 + comboMatrix._31;
   m_Plane[0].d   = comboMatrix._44 + comboMatrix._41;

   // Right clipping Plane:
   m_Plane[1].a   = comboMatrix._14 - comboMatrix._11;
   m_Plane[1].b   = comboMatrix._24 - comboMatrix._21;
   m_Plane[1].c   = comboMatrix._34 - comboMatrix._31;
   m_Plane[1].d   = comboMatrix._44 - comboMatrix._41;

   // Top clipping Plane:
   m_Plane[2].a   = comboMatrix._14 - comboMatrix._12;
   m_Plane[2].b   = comboMatrix._24 - comboMatrix._22;
   m_Plane[2].c   = comboMatrix._34 - comboMatrix._32;
   m_Plane[2].d   = comboMatrix._44 - comboMatrix._42;

   // Bottom clipping Plane:
   m_Plane[3].a   = comboMatrix._14 + comboMatrix._12;
   m_Plane[3].b   = comboMatrix._24 + comboMatrix._22;
   m_Plane[3].c   = comboMatrix._34 + comboMatrix._32;
   m_Plane[3].d   = comboMatrix._44 + comboMatrix._42;

   // Near clipping Plane:
   m_Plane[4].a   = comboMatrix._13;
   m_Plane[4].b   = comboMatrix._23;
   m_Plane[4].c   = comboMatrix._33;
   m_Plane[4].d   = comboMatrix._43;

   // Far clipping plane
   m_Plane[5].a   = comboMatrix._14 - comboMatrix._13;
   m_Plane[5].b   = comboMatrix._24 - comboMatrix._23;
   m_Plane[5].c   = comboMatrix._34 - comboMatrix._33;
   m_Plane[5].d   = comboMatrix._44 - comboMatrix._43;

   // Normalize Planes falls gewünscht:
   if(bNormalize == true)
   {
      NormalizePlane(m_Plane[0]);
      NormalizePlane(m_Plane[1]);
      NormalizePlane(m_Plane[2]);
      NormalizePlane(m_Plane[3]);
      NormalizePlane(m_Plane[4]);
      NormalizePlane(m_Plane[5]);
   }
} //ExtractPlanes


Hat jemand ne Idee woran es liegen könnte?
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 30.07.2005, 15:04    Titel: Antworten mit Zitat

ich hab die berechnung net ganz kapiert, muss mir das erstma richtig durchlesen (bin ja im urlaub); soweit ich da gesehen hab berechnest du irgendwo den radius von den mittelpunkten der planes zu den mittelpunkten der kugel, kann das sein das du noch die wurzel ziehen musst? Wie gesagt habs nur oberflächlich gelesen ... denken fällt in ferien schwer Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SK
Mini JLI'ler


Alter: 36
Anmeldedatum: 11.06.2005
Beiträge: 20

Medaillen: Keine

BeitragVerfasst am: 30.07.2005, 15:28    Titel: Antworten mit Zitat

sry war schwachsinn! der algorithmus is gut, werd ich mir merken. ich wunder mich bloß warum du d < -r in deiner schleife stehn hast. müsste es nicht d < r heißen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 01.08.2005, 21:37    Titel: Antworten mit Zitat

Uh, das dingen ist schon älter... wie war das doch gleich. Die Werte die verglichen werden sind in jedem Fall negativ. Ich glaube alles was hinter der Plane ist ist positiv... irgendsowas war da...
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
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