|
本帖最后由 luyang0222 于 2011-4-25 10:32 编辑
我想做一束聚光灯这样的效果,用的是setSpotCutoff函数,但是我发现这束光照在有些物体上能有显示,而有些物体上却没有反应。如下两张实验图,光源是从球的球心向左照射,照在球上有效果,但是在那个方形的面上却无显示:
还有一种情况,如下图所示,光源是从立方体的中心向左照射,当setSpotCutoff(R),R<55.0f时,也是没有任何显示,当R<55.f时就变成这样:
其实我只是想让这束聚光灯照在一个面上,显示出一块圆形的光照效果,不知道怎么才能实现
具体的实现光源部分的代码如下:
osg::Group* lightRoot= new osg::Group();
//开启光照
osg::StateSet* stateset = new osg::StateSet();
stateset = lightRoot->getOrCreateStateSet();
stateset->setMode(GL_LIGHTING,osg::StateAttribute::ON);
stateset->setMode(GL_LIGHT0,osg::StateAttribute::ON);
osg::Light* light = new osg::light();
light->setLightNum(0);
light->setDirection(osg::Vec3(0.0f,1.0f,0.0f));
light->setPosition(osg::Vec4(0.f,0.f,0.f,1.0f));
light->setAmbient(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
light->setDiffuse(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
light->setSpecular(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
light->setSpotCutoff(45.f);
light->setSpotExponent(1.0f);
light->setConstantAttenuation(1.0f);
light->setLinearAttenuation(0.0f);
light->setQuadraticAttenuation(0.0f);
//创建光源
osg::LightSource* lightSource = new osg::LightSource();
lightSource->setLight(light);
lightRoot->addChild(lightSource);
return lightRoot ; |
|