|
研究了几天,发现聚光灯是个很麻烦的东西,老板要我们做,没办法,囧。
我在参考了肖鹏的osg入门编程指南里的聚光灯示例一章,他写的很复杂(相对于我而言),我就是弄不懂,如何控制聚光灯的发射点和照射的方向。下面是他写的那段创建聚光灯节点的源码,请各位高手帮我分析分析:
osg::Node* createSpotLightNode(const osg::Vec3& position, const osg::Vec3& direction, float angle, unsigned int lightNum, unsigned int textureUnit)
{ /*理论上这个函数很好理解,其中position是聚光灯的位置,而direction就是控制聚光灯的方向,但是我修改了这些参数后得到的完全和想的不一样,而且我弄不明白这其中的变化规律,比方说,position我令其等于Vec3(0.f,0.f,0.f),direction我令其为Vec3(0.0f,0.0f,-1,0f),聚光灯就没有了,而当我把direction改为(0.0f,1.0f,-1,0f),又会从一个不可思议的方向射出,*/
osg::Group* group = new osg::Group;
//创建光源
osg:ightSource* lightsource = new osg::LightSource;
osg::Light* light = lightsource->getLight();
light->setLightNum(lightNum);
light->setPosition(osg::Vec4(position,1.0f));
light->setAmbient(osg::Vec4(0.00f,0.00f,0.05f,1.0f));
light->setDiffuse(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
group->addChild(lightsource);
//计算法向量
osg::Vec3 up(0.0f,0.0f,1.0f);
up = (direction ^ up) ^ direction;
up.normalize();
//创建自动生成纹理坐标节点
osg::TexGenNode* texgenNode = new osg::TexGenNode;
//关联纹理单元
texgenNode->setTextureUnit(textureUnit);
//设置纹理坐标生成器
osg::TexGen* texgen = texgenNode->getTexGen();
//设置模式为视觉线性
texgen->setMode(osg::TexGen::EYE_LINEAR);
//从视图中指定参考平面
texgen->setPlanesFromMatrix(osg::Matrixd::lookAt(position, position+direction, up)*
osg::Matrixd::perspective(angle,1.0,0.1,100));/*我怀疑问题的关键就在这里,但是我弄不明白这个函数是什么意思,其中的相关参数是用来控制什么的*/
group->addChild(texgenNode);
return group;
}
下面这张截图就是将direction的参数改为(0.0f,1.0f,-1,0f),得到的奇怪效果。
|
|