Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat
Aber nicht wegen der Tiefe, sondern bei meiner Funktion die prüfen soll, ob ein Knoten sichtbar ist:
NodeIsVisible(SOctNode* Node)
// Prüfen ob BoundingSphere des Knoten im ViewFrustum ist
// wenn ja -> NodeIsVisible(Node->children
// wenn nein: return
// wenn schneidet: prüfen ob Bounding Box im ViewFrustum ist
// wenn ja -> NodeIsVisible(Node->children[i]
// wenn nein: return
Quellcode |
|
1 2 3 4 5 6 7 8 9 |
NodeIsVisible(SOctreeNode *Node) { if(IsVisible(Node->BoundingSphere) == OUT) return; else if(IsVisible(Node->BoundingSphere) == IN) NodeIsVisible(Node->children[alle]; else ... // hier kommt dann das gleiche mit der BoundingBox } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
void CStatics::NodeIsVisible(SOctNode *Node) { if(Node != NULL) { float fDistance; WORD iVertxOut = 0; WORD iVertxIn = 0; tbVector3 fCheckPoints[8]; tbVector3 vMiddle = Node->vMiddle; tbVector3 vEdge = Node->vEdge; float fSqRadius; // Sphere check fSqRadius = tbVector3LengthSq(vMiddle); for(WORD h = 0; h < 6; h++) { fDistance = tbPlaneDotCoords( m_pFrustum->Planes[h], Node->vMiddle); if(fDistance * fDistance < -fSqRadius) { // Sphere is out Node->isVisible = false; return; } iVertxIn += 1; } if(iVertxIn < 6) // Intersecting { // Box check fCheckPoints[0] = vMiddle + tbVector3(vEdge.x, vEdge.y, vEdge.z); fCheckPoints[1] = vMiddle + tbVector3(vEdge.x, -vEdge.y, vEdge.z); fCheckPoints[2] = vMiddle + tbVector3(-vEdge.x, -vEdge.y, vEdge.z); fCheckPoints[3] = vMiddle + tbVector3(-vEdge.x, vEdge.y, vEdge.z); fCheckPoints[4] = vMiddle + tbVector3(vEdge.x, vEdge.y, -vEdge.z); fCheckPoints[5] = vMiddle + tbVector3(vEdge.x, -vEdge.y, -vEdge.z); fCheckPoints[6] = vMiddle + tbVector3(-vEdge.x, -vEdge.y, -vEdge.z); fCheckPoints[7] = vMiddle + tbVector3(-vEdge.x, vEdge.y, -vEdge.z); // calculate our distances to each of the planes for(WORD i = 0; i < 6; ++i) { for(WORD j = 0; j < 8; ++j) { // find the distance to this plane fDistance = tbPlaneDotCoords( m_pFrustum->Planes[i], fCheckPoints[j]); if(fDistance < 0.0f) iVertxOut += 1; } // Wenn Knoten nicht sichtbar, return if(iVertxOut == 8) { Node->isVisible = false; return; } iVertxOut = 0; } } // Node is Visible Node->isVisible = true; // Wenn es kein Blatt war, weitersplitten if(!(Node->isLeaf)) { for(WORD k = 0; k < 8; ++k) { NodeIsVisible(Node->pChildren[k]); } } } } |
Werbeanzeige