int numSplits = 0;
for ( int j = 0; j < polys.getCount (); j++ ) {
if ( i == j ) continue;
Polygon3D * poly = (Polygon3D *) polys.at ( j );
if ( poly -> classify ( *plane ) == IN_BOTH ) numSplits++;
}
if ( numSplits < bestNumSplits ) {
bestNumSplits = numSplits; bestSplitter = i;
}
}
return bestSplitter;

j Для вывода всех полупрозрачных граней в правильном порядке удобно (использовать специальный подкласс класса BspVisitor - класс BspDrawVisi-tor, описание и реализация которого приводится ниже.

EI
Class BspDrawVisitor : public BspNodeVisitor {
protected:
View * view;
const Camera * camera;
const Frustrum * frustrum;
const SubScene * subScene;
Polygon3D * tempPoly;
El
public:
BspDrawVisitor ( View * theView, const SubScene * theScene, const Camera * theCamera, const Frustrum * theFrustrum, Polygon3D * theTempPoly ) ;
virtual bool visit ( BspNode * node );
} ;
bool BspDrawVisitor :: visit ( BspNode * node ) {
subScene -> renderPoly ( *view, *camera, node -> facet,
*tempPoly, *frustrum ) ;
return false;
}

Таким образом, для вывода всего BSP-дерева в правильном порядке можно использовать следующую конструкцию:

BspDrawVisitorvisitor ( &view, &scene, kcamera,
&viewFrustrum, ktempPoly );
root -> visitPostorder ( visitor );

Для правильной обработки полупрозрачных граней мы будем использовать класс AccSubScene, унаследованный от класса SubScene. Экземпляры этого класса содержат BSP-дерево, построенное только по полупрозрачным граням, и используют его для рендеринга всех видимых полупрозрачных граней.

Описание этого класса выглядит следующим образом: о.

class AccSubScene : public SubScene {
private:
Array opaqueFaces; // opaque faces are stored here BspNode * root; // transparent are stored
// in the bsp tree
public:
AccSubScene ( const char * theName ) :
SubScene ( theName ), opaqueFaces ( "opaque Faces" )
{
root = NULL;
metaClass = kclasslnstance;

⇐ Предыдущая| |Следующая ⇒