查看: 2835|回复: 17

关于osgshadow的问题

[复制链接]

该用户从未签到

发表于 2008-11-29 19:44:06 | 显示全部楼层 |阅读模式
利用osgshadow实现的飞机和雷达的阴影效果图如图1。采用的阴影技术是shadowmap,已经达到了预想的效果,只是飞机和雷达显得黑呼呼一片。而改用了shdowTexture后,效果如图2,雷达的阴影不正确,而飞机的阴影则消失了。
新建 BMP 图像.GIF
新建 BMP 图像 (2).GIF

该用户从未签到

 楼主| 发表于 2008-11-29 19:54:21 | 显示全部楼层

源代码如下

// 初始化组

shadowedScene = new osgShadow::ShadowedScene;
shadowedScene->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
shadowedScene->setCastsShadowTraversalMask(CastsShadowTraversalMask);


//自己定义的类,用来处理地形,飞机和雷达
CAnimate1* a1 = new CAnimate1();

osgSim::OverlayNode::OverlayTechnique technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;

//载入地形模型
       
osg::Node *temp = new osg::Node;
temp = osgDB::readNodeFile("e:\\RambleSystem\\pegout.osga") ;
center0 = temp->getBound().center();

//temp1是地形结点
osg::Node *temp1 = a1->build_world(temp,0,true, technique);

//temp2包括了飞机和雷达       
osg::Node *temp2 = a1->createMovingModel(center0,100.0f,temp1,mRoot.get(),true);

//设置地形为阴影接收者
osg::Node* shadowed = temp1;
shadowed->setNodeMask(ReceivesShadowTraversalMask);

//设置飞机和雷达为阴影发送者
osg::Node* shadower = temp2;
shadower->setNodeMask(CastsShadowTraversalMask);


//设置阴影技法为ShadowMap,没有问题,效果见图1
osg::ref_ptr<osgShadow::ShadowTexture> sm = new osgShadow::ShadowTexture;
shadowedScene->setShadowTechnique(sm.get());

//假如设置阴影技法为ShadowTexture,有问题,效果见图2
osg::ref_ptr<osgShadow::ShadowTexture> sm = new osgShadow::ShadowTexture;
shadowedScene->setShadowTechnique(sm.get());


shadowedScene->addChild(shadowed);
shadowedScene->addChild(shadower);

//以下设置光源
osg::ComputeBoundsVisitor cbbv;
temp1->accept(cbbv);  
osg::BoundingBox bb = cbbv.getBoundingBox();  
osg::Vec4 lightpos;   
bool postionalLight = true;        
if (postionalLight)   
{      lightpos.set(bb.center().x(),bb.center().y(),bb.zMax() + bb.radius()*2.0f ,1.0f);
    }   else   
{  lightpos.set(0.5f,0.25f,0.8f,0.0f);    }
osg::ref_ptr<osg:ightSource> ls = new osg::LightSource;   
ls->getLight()->setPosition(lightpos);

shadowedScene->addChild(ls.get());

}

[ 本帖最后由 口口广大 于 2008-11-29 19:58 编辑 ]

该用户从未签到

 楼主| 发表于 2008-11-29 19:57:55 | 显示全部楼层
以上代码参考了官方例子osgshadow的第二个飞机模型的例子,但我注意到osgshadow其中第一组模型,就是几个几何体在转圈的例子中,也是如果将shdaowMap改成shadowTexture,则无法显示阴影。

该用户从未签到

发表于 2008-11-29 19:58:55 | 显示全部楼层
飞机和雷达黑乎乎的可能是因为它们也被投射上了阴影,注意有没有正确设置阴影的投射者和接收者。
此外osgShadow库一直没有有效地得到完善。毕竟现在OSG本身的构想和发展过快,而相应的贡献者还是十分有限~~有点类似GDP发展水平和工资增长率的关系

该用户从未签到

 楼主| 发表于 2008-11-29 23:20:37 | 显示全部楼层
在官方例子osgshadow中,如果使用shadowMap,则无论原物体还是阴影,都是黑乎乎一片。所以我觉得可能不是投影接受者和发送者的问题。

该用户从未签到

 楼主| 发表于 2008-12-30 19:29:45 | 显示全部楼层
已解决,谢谢!

该用户从未签到

发表于 2008-12-31 13:50:26 | 显示全部楼层
怎么解决了?
我和你的相反,用shadowMap显示不正常,用ShadowTexture显示正常

该用户从未签到

发表于 2008-12-31 15:49:24 | 显示全部楼层
osg::Node *temp = new osg::Node;
temp = osgDB::readNodeFile("e:\\RambleSystem\\pegout.osga") ;
center0 = temp->getBound().center();

这句有内存泄露吧

该用户从未签到

发表于 2008-12-31 15:52:20 | 显示全部楼层
我使用shadowMap也不行,倒是osgshadowvolunm接近俺要的效果,为什么。
我就创建一牛和草地,牛产生阴影,草地接收,结果,牛变成黑的,附近也是黑的

该用户从未签到

发表于 2009-1-4 13:57:25 | 显示全部楼层
原帖由 口口广大 于 2008-11-29 23:20 发表
在官方例子osgshadow中,如果使用shadowMap,则无论原物体还是阴影,都是黑乎乎一片。所以我觉得可能不是投影接受者和发送者的问题。

我也遇到一样的问题,请问怎么解决了?
用osg例子也是黑乎乎的

该用户从未签到

发表于 2009-1-4 23:05:22 | 显示全部楼层
建议口口给出一些解决办法或者提示也好,这样才能让这个论谈健康发展,如果大家都上来提问题而不愿意帮助别人,那么大家的水平提高得会较慢。 :lol :lol :lol :lol ,个人意见,仅供参考

该用户从未签到

 楼主| 发表于 2009-1-7 19:46:26 | 显示全部楼层
我发现是光源的问题,具体解决的我也搞不太清,我主要解决了地形高程坐标系与屏幕坐标系之间的转化问题,然后这个问题附带解决了。

[ 本帖最后由 口口广大 于 2009-1-7 19:49 编辑 ]

该用户从未签到

发表于 2009-1-8 13:43:41 | 显示全部楼层
等来你真不容易啊
光源问题是什么意思?能否具体些阿,你采用的默认光源还是自己重新设置了光源?

该用户从未签到

发表于 2009-1-8 13:48:43 | 显示全部楼层
抛开自己的例子,就说osg官方例子,我和你编译后一样的问题,官方例子就不能正常运行,也是黑乎乎一片,
期待你更精确地答案
我现在没办法,暂时换了一个显卡也能解决,官方例子也能正常运行了。
但是如果用原来的集成显卡,预编译的(osg安转包里带的,从本站下的)例子运行正常,自己编译那个例子却不正常

按照推理:如果显卡有问题,那预编译的例子也运行错误才是,排除显卡问题
如果显卡没问题,换个显卡,不重新编译,两个例子都能正确运行,又确认是显卡不支持!

我汗!!!!,留下这个问题,直到俺解决为止

该用户从未签到

 楼主| 发表于 2009-1-8 20:01:03 | 显示全部楼层
其实,你看我的第一张图,影子是正确的,但是光源没照到飞机上。可能是飞机和地形之间的位置关系一开始没有设置好,后来我将飞机和地形统一在同一个坐标系下,问题就解决了。我用的是shdowTexture,如果用shadowmap则影子有误,官方例子也是一样。

该用户从未签到

发表于 2009-1-9 08:43:22 | 显示全部楼层
多谢了!
我再继续试,这个问题我必须解决,我们最重要的就是阴影,晕阿

该用户从未签到

发表于 2009-1-11 12:03:58 | 显示全部楼层
osgShadow至今的效果一直不行。。。

不如自己做

该用户从未签到

发表于 2009-1-12 08:44:28 | 显示全部楼层
也是一个思路,不过,我还是想知道为什么,现在没空,暂时放了,闲下来再看吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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