4

太陽のように振る舞う OpenSceneGraph のランドスケープの上にポイント ソースを設定する必要があります。ライトのセットアップ方法はすでに知っていますが、次の方法で行うことができます。

//LIGHT CODE ------------------------
osg::ref_ptr<osg::Group> lightGroup (new osg::Group);
osg::ref_ptr<osg::StateSet> lightSS (root->getOrCreateStateSet());
osg::ref_ptr<osg::LightSource> lightSource1 = new osg::LightSource;
osg::ref_ptr<osg::LightSource> lightSource2 = new osg::LightSource;

// create a local light.

float xCenter = tree->getRoot()->getXCenter();
float yCenter = tree->getRoot()->getYCenter();


osg::Vec4f lightPosition (osg::Vec4f(xCenter, yCenter,75.0,1.0f));
osg::ref_ptr<osg::Light> myLight = new osg::Light;
myLight->setLightNum(1);
myLight->setPosition(lightPosition);
    myLight->setAmbient(osg::Vec4(0.8f,0.8f,0.8f,1.0f));
    myLight->setDiffuse(osg::Vec4(0.1f,0.4f,0.1f,1.0f));
    myLight->setConstantAttenuation(1.0f);
    myLight->setDirection(osg::Vec3(0.0f, 0.0f, -1.0f));
lightSource1->setLight(myLight.get());

lightSource1->setLocalStateSetModes(osg::StateAttribute::ON); 
lightSource1->setStateSetModes(*lightSS,osg::StateAttribute::ON);
//osg::StateSet* lightSS (lightGroup->getOrCreateStateSet());

lightGroup->addChild(lightSource1.get());

//Light markers: small spheres
osg::ref_ptr<osg::Geode> lightMarkerGeode (new osg::Geode);
lightMarkerGeode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3f(xCenter,yCenter,75),10.0f)));


//Tuto 9: lighting code
root->addChild(lightGroup.get());
//Tuto 9: Adding the light marker geode
root->addChild(lightMarkerGeode.get());

//LIGHTCODE END----------------

これにより、次のようなランドスケープが生成されます。

The Landscape with light above (光は球で示されます)

ただし、この光源は風景に違いをもたらすようには見えません。問題は、光をエミュレートする太陽を作成するために、どのような種類の光設定 (つまり、アンビエンス、拡散など) が必要かということです。

4

1 に答える 1

4

OSG フォーラム/メーリング リストは、通常、質問への回答に優れています: http://forum.openscenegraph.org/

ここであなたの質問に答えようとする - それはあなたが照らそうとしている材料の特性に依存します.

ロードした一部のモデルのマテリアルは、3 つのライト タイプのうち特定の 1 つにしか反応しないことがわかりました (具体的には、一部のモデルはスペキュラーのみです)。そのため、3 つすべてをオンにします。

osg::Light *light = new osg::Light;
light->setAmbient(osg::Vec4(1.0,1.0,1.0,1.0));
light->setDiffuse(osg::Vec4(1.0,1.0,1.0,1.0));
light->setSpecular(osg::Vec4(1,1,1,1));  // some examples don't have this one

あなたの場合、代わりに、地形の周囲および/または拡散プロパティを再定義できる場合があります。

于 2012-05-02T17:44:55.020 に答える