2016-08-01 26 views
0

Ich habe eine ziemlich große Mesh, (die ich mit OSGDB laden). Es hat auch mehrere Sub-Meshes.OpenSceneGraph Emissive Beleuchtung

Ich versuche, die Emissionsbeleuchtung einzustellen. Jedoch kann ich (vermuten) sehen, dass nur das 1. Untergitter beleuchtet ist. Wie ist es möglich, alle Sub-Meshes zu beleuchten? Ich benutze keine Beleuchtung, um die Szene zu erhellen.

Was ist der empfohlene Ansatz?

int main() 
{ 
    osg::Node * cytBuilding = osgDB::readNodeFile(OBJ_FILE); 


    osg::Group * root = new osg::Group(); 
    osg::PositionAttitudeTransform * scenePAT = new osg::PositionAttitudeTransform(); 
    root->addChild(scenePAT); 
    scenePAT->addChild(cytBuilding); 




    //material 
    osg::Material* material = new osg::Material(); 
    material->setAmbient(osg::Material::FRONT, osg::Vec4(1.0,1.0f,1.0f,1.0f)); 
    material->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0,1.0f,1.0f,1.0f)); 
    material->setSpecular(osg::Material::FRONT, osg::Vec4(0.0,0.0f,0.0f,1.0f)); 
    material->setEmission(osg::Material::FRONT, osg::Vec4(1.0,1.0f,1.0f,1.0f)); 
    osg::StateSet* stateset = new osg::StateSet(); 
    stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON); 
    root->setStateSet(stateset); 


    // viewer 
    osgViewer::Viewer viewer; 

    viewer.setSceneData(root); 
    viewer.realize(); 
    return viewer.run(); 

Als ich das Netz (osgDB :: readNodeFile()) zu lesen, es

*** line not handled *** :map_bump 
*** line not handled *** :bump 
*** line not handled *** :map_opacity 
*** line not handled *** :map_d 
*** line not handled *** :refl 
*** line not handled *** :map_kS 
*** line not handled *** :map_Ns 

resultierende Anzeige folgende Fehlermeldungen angezeigt wurde: enter image description here

gleiche Masche, wenn ich mit MeshLab Anzeige Ich sehe enter image description here

Antwort

0

Dies hängt weitgehend davon ab, wie die StateSets innerhalb des Modus Ich bin organisiert. Können Sie versuchen, die Beleuchtung auf Ihrem Root-Knoten zu erzwingen?

stateset->setMode(GL_LIGHTING, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); 

Sie könnten auch versuchen, einen kleinen Besucher zu implementieren alle Materialien und StateSets innerhalb des Modells zu entleeren, um zu sehen, wie sie zugeordnet sind, möglicherweise überschrieben seine pro Knoten mit einer OVERRIDE|PROTECTED Flagge. Haben Sie zum Testen nur versucht, Ihr Material auf alle Geoden oder Geometrien innerhalb des Modells anzuwenden?

+0

Ich setze ein Material auf einen setState und setze es auf den Root-Knoten, wird dies nicht das Material auf alle Knoten unter der Wurzel anwenden? – mkuse

+0

Nicht, es sei denn, sie sind 'OVERRIDE | GESCHÜTZT auf niedrigeren Ebenen. Sind Sie sicher, dass das Modell normal ist? Haben Sie versucht, einen normalglättenden Besucher zu verwenden, nur um zu testen: 'static void osgUtil :: SmoothingVisitor :: smooth (osg :: Geometry & g)'? –