查看: 2435|回复: 5

用太阳光产生阴影,太阳光的位置怎么设啊?请多指导!

[复制链接]

该用户从未签到

发表于 2011-7-28 10:56:16 | 显示全部楼层 |阅读模式
osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;
osg::ref_ptr<osg::Group>group=new osg::Group;
osg::ref_ptr<osgShadow::ShadowedScene>shadowscene=new osgShadow::ShadowedScene;
osg::ref_ptr<osgShadow::ShadowTexture>shadowtextue=new osgShadow::ShadowTexture;
shadowscene->setShadowTechnique(shadowtextue.get());
shadowscene->setCastsShadowTraversalMask(0x1);
shadowscene->setReceivesShadowTraversalMask(0x2);

//创建光照 这儿我想用太阳关如向量为 vDirect(0.3, -0.9, 0.3)
osg::ref_ptr<osg:ightSource>lightsource=new osg::LightSource;
osg::ref_ptr<osg::Light>light=lightsource->getLight();
light->setAmbient(osg::Vec4(0.5f,0.5f,0.5f,1.0f));
light->setDiffuse(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
light->setPosition(osg::Vec4(0.0f,0.0f,100.0f,1.0f));
shadowscene->addChild(lightsource.get());


//创建场景 地形在xoy平面,飞机高度为50,  光源高度为100
osg::ref_ptr<osg::Node>cessna=osgDB::readNodeFile("cessna.osg");
osg::ref_ptr<osg::MatrixTransform>cessnaMatrix=new osg::MatrixTransform;
cessnaMatrix->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f,0.0f,50.0f)));
cessnaMatrix->addChild(cessna);
//请代码阅读者,互换接收或者被接收mask,飞机投影地形是没有问题的,但是地形投影飞机却是不正确的结果
cessna->setNodeMask(0x1);
osg::ref_ptr<osg::Node>terrain=createTerrain();
terrain->setNodeMask(0x2);
shadowscene->addChild(cessnaMatrix.get());
shadowscene->addChild(terrain.get());
group->addChild(shadowscene);
viewer->setSceneData(group.get());
viewer->run();

该用户从未签到

发表于 2011-7-28 12:19:40 | 显示全部楼层
太阳是一个平行光,没有位置吧?你虚拟一个较远位置就可以了吧

该用户从未签到

发表于 2011-7-28 13:14:50 | 显示全部楼层
平行光请设置setPosition的第四个参量为0,OpenGL的书里早就强调过这一点了

该用户从未签到

发表于 2011-7-28 13:34:42 | 显示全部楼层
这个细节给忘了

该用户从未签到

 楼主| 发表于 2011-7-28 13:37:49 | 显示全部楼层
谢谢,指导
是这样的

该用户从未签到

 楼主| 发表于 2011-7-28 13:38:03 | 显示全部楼层
谢谢,指导
是这样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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