查看: 1619|回复: 7

聚光灯问题

[复制链接]

该用户从未签到

发表于 2010-10-22 17:42:18 | 显示全部楼层 |阅读模式
你们好,我在自己的小程序上想添加一个聚光灯,下面是根据编程指南来做的。但是结果发现聚光灯无法显示,同时我的运动模型也是暗的。。请问是我的参数设置问题,还是其他问题?另外,关于聚光灯的设置一般遵循什么思想。。谢谢!
osg::ref_ptr<osg::Image>createSpotLightImage(const osg::Vec4 & centerColour,const osg::Vec4& backgroundColour,unsigned int size ,float power)
{
//创建image对象
osg::ref_ptr<osg::Image >image=new osg::Image ;
//动态分配一个size*size大小的image;
image->allocateImage (size,size,1,GL_RGBA,GL_UNSIGNED_BYTE);
//填充image
float mid=(float(size)-1)*0.5f;
float div=2.0f/float(size);
for(unsigned int r=0;r<size;r++)
{
  unsigned char*ptr=image->data (0,r,0);
  unsigned int c=0;
  for(;c<size;++c);
  {
   float dx=(float(c)-mid)*div;
   float dy=(float(r)-mid)*div;
   float r=powf(1.0f-sqrtf(dx*dx+dy*dy),power);
   if(r<0.0f)r=0.0f;
   osg::Vec4 color=centerColour*r+backgroundColour*(1.0f-r);
   *ptr++=(unsigned char)((color[0])*255.0f);
   *ptr++=(unsigned char)((color[1])*255.0f);
   *ptr++=(unsigned char)((color[2])*255.0f);
   *ptr++=(unsigned char)((color[3])*255.0f);
  }
}
return image.get ();
}
//创建聚光灯状态属性
osg::ref_ptr<osg::StateSet>createSpotLightDecoratorState(unsigned int lightNum,unsigned int textureUnit)
{
osg::ref_ptr<osg::StateSet>stateset=new osg::StateSet;
stateset->setMode (GL_LIGHT0+lightNum,osg::StateAttribute::ON );
osg::Vec4  centerColour(1.0f,0.0f,1.0f,0.0f);
osg::Vec4 ambientColour(0.05f,0.05f,0.05f,1.0f);
osg::ref_ptr<osg::Texture2D>texture=new osg::Texture2D();
texture->setImage(createSpotLightImage(centerColour,ambientColour,64,1.0));
texture->setBorderColor(osg::Vec4(ambientColour));
texture->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_BORDER);
texture->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_BORDER);
texture->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_BORDER);
stateset->setTextureAttributeAndModes(textureUnit,texture.get(),osg::StateAttribute::ON );
stateset->setTextureMode(textureUnit,GL_TEXTURE_GEN_S,osg::StateAttribute::ON);
stateset->setTextureMode(textureUnit,GL_TEXTURE_GEN_T,osg::StateAttribute::ON);
stateset->setTextureMode(textureUnit,GL_TEXTURE_GEN_R,osg::StateAttribute::ON);
stateset->setTextureMode(textureUnit,GL_TEXTURE_GEN_Q,osg::StateAttribute::ON);
    return stateset.get ();
}
//创建聚光灯节点
osg::ref_ptr<osg::Node >creatSpotlightNode(const osg::Vec3&position,const osg::Vec3&direction,float angle,unsigned int lightNum,unsigned int textureUnit)
{
osg::ref_ptr<osg::Group>group=new osg::Group;
//创建光源
osg::ref_ptr<osg:ightSource>lightsoure=new osg::LightSource;
osg::ref_ptr<osg::Light>light=lightsoure->getLight ();
light->setLightNum (lightNum);
light->setPosition (osg::Vec4(position,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->setSpotCutoff(20.0f);
    light->setSpotExponent(50.0f);
    light->setDirection(osg::Vec3(1.0f,1.0f,-1.0f));
group->addChild(lightsoure);

//计算法向量
osg::Vec3 up(0.0f,0.0f,1.0f);
up=(direction^up)^direction;
up.normalize();
osg::ref_ptr<osg::TexGenNode>texgenNode=new osg::TexGenNode;
    texgenNode->setTextureUnit(textureUnit);
osg::ref_ptr<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.0,100));
group->addChild(texgenNode.get());
return group.get();
}
void main()
{
osgViewer::Viewer viewer;
osg::Vec3 center(0.0f,0.0f,0.0f);
float radius=50.0f;
osg::ref_ptr<osg::Group >root=new osg::Group ();
osg::ref_ptr<osg::Node >glider=osgDB::readNodeFile("glider.osg");
if(glider.get())
{
  const osg::BoundingSphere& bs=glider->getBound ();
  float size=radius/bs.radius()*0.3f;
}
root->addChild(glider.get());
root->setStateSet (createSpotLightDecoratorState(0,1));
root->addChild (creatSpotlightNode(osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(0.0f,1.0f,1.0f),60.0f,0,1));
osgUtil::Optimizer optimizer;
optimizer.optimize (root.get() );
viewer.setSceneData(root.get());
viewer.setCameraManipulator(new TrainCamera());
viewer.run();
}
上面的TrainCamera设置的是一个运动的视点。。

该用户从未签到

 楼主| 发表于 2010-10-23 15:05:47 | 显示全部楼层
另外请问有谁知道书中的#include"Tex.h"这个文件在哪里。。。help…………谢谢了

该用户从未签到

发表于 2010-10-24 09:49:10 | 显示全部楼层
对不起,我发新帖总是提示验证码错误,借你的地方求助一下

我是学习的《OSG编程入门指南 》上纹理节点访问的例子 ,ive格式的提取不出纹理图片来,
osg::Texture2D对象——getImage()
跟ive生成时选择的压缩方式有关吗?
osg格式可以获取纹理图,
不压缩生成ive也可以获取,
加参数--compressed ……就不行了

该用户从未签到

发表于 2010-10-24 10:46:10 | 显示全部楼层
纹理压缩之后需要您修改一下遍历器里面的代码,重新分配纹理压缩模式~~~楼上的朋友如果您购买了本书,请您参考以下链接:
http://bbs.osgchina.org/thread-2766-1-1.html
您可以给我发个邮件,我会把相关源代码发给您~~~~~

该用户从未签到

发表于 2010-10-24 11:20:02 | 显示全部楼层
您好,我买了《OpenSceneGraph三维渲染引擎编程指南》,放在办公室了,不记得您说的彩图编号,纹理节点访问的例子,我照着写进去了,就是ive的读取不了纹理,您说的“纹理压缩之后需要您修改一下遍历器里面的代码,重新分配纹理压缩模式”,我不明白,能不能细说一下啊

该用户从未签到

发表于 2010-10-24 17:23:00 | 显示全部楼层
具体请您先认真阅读理解理解这个例子,然后再调试修改~~~

该用户从未签到

发表于 2010-10-26 12:25:32 | 显示全部楼层
flysky您好,不好意思,是在节点访问类中不能用texture2D的getImage获取图片吗?可是texture2D对象没有别的纹理中获取图片的函数呀;我试着把纹理贴到一个新建的几何体上是可以显示的。ive模型的mipmapData值是9,是不是要取出哪一层来呢,有个(大概这样子的函数)getMipmapData(int level)的函数取出来的也不是啊

该用户从未签到

发表于 2010-12-30 11:44:28 | 显示全部楼层
另外请问有谁知道书中的#include"Tex.h"这个文件在哪里。。。help…………谢谢了
llosg 发表于 2010-10-23 15:05


同问,根据《三维渲染引擎编程指南》书中的聚光灯实例的代码敲出来后,提示说找不到#include "Tex.h"这个,同时vertex[][]的定义无效,
求教,谢谢:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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