作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要在 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----------------
这将产生一个看起来像这样的景观:
上面有光的风景(光用球体表示)
不过,这种光源似乎并没有真正对景观产生影响。问题是需要什么样的灯光设置(即氛围、漫射等)来制作模拟太阳的灯光。
最佳答案
就其值(value)而言,OSG 论坛/邮件列表通常非常善于回答问题: http://forum.openscenegraph.org/
在这里尝试回答您的问题 - 这取决于您尝试点亮的 Material 的属性。
我发现我加载的某些模型上的 Material 只会对 3 种光类型中的一种产生 react (具体而言,某些模型仅具有镜面反射),因此我只打开所有 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
对于您的情况,您也可以重新定义地形的环境和/或漫反射属性。
关于c++ - 在 OSG 中创建太阳光源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10343643/
请看下图: 蓝色框是div。现在我要做的是实现一种 2.5D 功能: 我希望灰色阴影有点像 3D。起初我想像这样将“Y”轴分配给 box-shadow 值: "box-shadow: -5px -5p
我是一名优秀的程序员,十分优秀!