查看: 1656|回复: 4

王教授,请教您一个关于光源中setSpotCutoff的问题

[复制链接]

该用户从未签到

发表于 2011-4-25 10:30:34 | 显示全部楼层 |阅读模式
本帖最后由 luyang0222 于 2011-4-25 10:32 编辑

我想做一束聚光灯这样的效果,用的是setSpotCutoff函数,但是我发现这束光照在有些物体上能有显示,而有些物体上却没有反应。如下两张实验图,光源是从球的球心向左照射,照在球上有效果,但是在那个方形的面上却无显示:
788.jpg 44656.jpg
还有一种情况,如下图所示,光源是从立方体的中心向左照射,当setSpotCutoff(R),R<55.0f时,也是没有任何显示,当R<55.f时就变成这样:
78687.jpg 6586.jpg
其实我只是想让这束聚光灯照在一个面上,显示出一块圆形的光照效果,不知道怎么才能实现
具体的实现光源部分的代码如下:
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 ;

该用户从未签到

发表于 2011-4-25 13:27:16 | 显示全部楼层
你从球心照,那等不是给球挡住了

该用户从未签到

 楼主| 发表于 2011-4-25 13:39:20 | 显示全部楼层
回复 2# tianxiao888


    不会挡住的。如下图,光源是从小球中心向右发射,在大球上还能看见效果
5465465.jpg

该用户从未签到

 楼主| 发表于 2011-4-27 09:26:06 | 显示全部楼层
苦等指点

该用户从未签到

发表于 2011-4-28 08:12:25 | 显示全部楼层
这种OpenGL固定管线的问题我实在不想回答,您只要反复调整自己的光源参数就可以了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表