查看: 1695|回复: 5

王教授、肖大师等高手,新手向您问个关于聚光灯的问题!

[复制链接]

该用户从未签到

发表于 2011-3-3 16:25:51 | 显示全部楼层 |阅读模式
研究了几天,发现聚光灯是个很麻烦的东西,老板要我们做,没办法,囧。

我在参考了肖鹏的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),得到的奇怪效果。
45435.jpg

该用户从未签到

发表于 2011-3-3 17:12:08 | 显示全部楼层
您不妨从OpenGL相关的书籍中了解这些固定管线渲染的内容,其中对于聚光灯的各种参数,以及TexGen纹理自动生成的公式都有着详细的解释

此外我不是教授,我只是本科毕业而已……

该用户从未签到

 楼主| 发表于 2011-3-3 17:20:21 | 显示全部楼层
回复 2# array


    哎,这种东西弄起来真是繁琐啊,一个效果几天都没能实现,被老板逼的弄这些,说这个免费,但是难弄啊。PS:清华的本科抵得了我们同济的硕士了。本科就出书了,我的论文还没着落呢

该用户从未签到

 楼主| 发表于 2011-3-3 17:24:02 | 显示全部楼层
回复 2# array


    请问怎么找的到肖鹏呢?我qq上问了他一点反应都没有,根本不理我的样子,我买了他的书,他该有售后解释吧,PS您的书我也买了,感觉就是例子给的少了点。

该用户从未签到

发表于 2011-3-3 17:43:45 | 显示全部楼层
哈哈,看着标题党就进来了,太虎了! 呵呵,纯帮顶!

该用户从未签到

发表于 2011-3-4 08:35:40 | 显示全部楼层
您没有给出全部的程序,因此别人无法对您的代码进行调试:您的立方体在什么位置?您的聚光灯参数是怎么设置的?您的LightSource添加在什么节点下?

您把聚光灯和纹理自动生成的概念混淆在一起,如果不能首先把这些3D开发的基本概念(这不是OSG中的概念!)梳理清楚,那么您后面的学习将举步维艰。您有必要先阅读OpenGL红宝书中相关的部分:
http://glprogramming.com/red/chapter05.html

大家都有自己的工作,没有及时反应很正常;而且并不是只有您在提问题,况且对于这种OpenGL相关的问题,阅读一些权威的参考文献会更有助于您加深理解。此外不得不提醒您的是:固定管线的内容已经是过去式了,在per-pixel lighting的时代,我们同样并不想过多纠缠于老套而且的确难以理解的glLight,glMaterial和glTexgen……

按照清华编辑的要求,我的书本来就是供OSG高端开发者和引擎爱好者理解和学习用的,对于初学者不会有太大帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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