2012-04-27 4 views
3

太陽のように動作するOpenSceneGraphで私の風景の上に点光源を設定する必要があります。私はすでに光を設定する方法を知っていて、それがこの方法で行うことができます。OSGでSun光源を作成

//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---------------- 

そして、これは、このようになります景観生成されます。上記の光で

風景(光は球で示されています)

この光源は実際には風景には影響しません。 問題は、太陽をエミュレートするためにどのような光の設定(すなわち、雰囲気、拡散など)が必要かということです。何が価値があるため、OSGフォーラム/メーリングリストは、通常の質問に答えることについてかなり良いです

+0

太陽が向いていない方向性のあるライトはありませんか? –

+0

これは方向性があり、その方向は風景の上から非常に高いところからまっすぐに下がっています。 –

答えて

3

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 

場合によっては、地形の周囲および/または拡散のプロパティを再定義することができます。

+0

妥当なアイデアのように聞こえますが、彼がシーンに近づくため、明るくなります。私はもっ​​とネイティブのOSSソリューションを望んでいました。 –

+0

確かに、私の例ではライトが一番上にありますが、ライトを明るくしたくない場合は、常に1より小さい値を使用できます。または、他の減衰要因のいくつかをオンにします。 –

+0

私はあなたに助けてくれてありがとう。 –

関連する問題