查看: 1950|回复: 6

Speedtree5.0嵌入osg时,相机联动问题

[复制链接]

该用户从未签到

发表于 2011-4-25 11:22:55 | 显示全部楼层 |阅读模式
大家好,我在将Speedtree5.0嵌入osg时,相机出现了问题。我设置了一个cameramanipulator,在osg中可正常运行,但当Speedtree作为一个节点加入场景后,我首先屏蔽了Speedtree的相机控制,然后再把osg相机的初始位置传给Speedtree,但是Speedtree场景不能动。
请问这是为什么?我需要在哪里做改进?
因Speedtree版权限制,恕代码不能上传。
在此谢过各位,大家有什么解决方法都可以留言给我,我都试试。

该用户从未签到

发表于 2011-4-26 08:46:35 | 显示全部楼层
如果您不能给出足够的信息,便没有人能给您提供相应的帮助。我只能猜测您对于SpeedTree的相机控制的代码没有屏蔽成功

该用户从未签到

 楼主| 发表于 2011-4-27 16:54:11 | 显示全部楼层
回复 2# array


    谢谢王老师,我已经把相机设置好了。参考姐妹书里的场景漫游,做了个相机控制器,修改Capplication的cameraposition值。

    但是还些问题想问您,

    如果不禁用渲染列表,就无法绘制Speedtree节点,但是貌似是个投机取巧的办法;

    在有Speedtree节点的场景中,加入一个其他的节点,绘制出的图像就会有问题,如下图:

      cow&speedtree.png

     我觉得好像是Speedtree的场景被包在牛肚子里了……控制相机的时候,后面的黑物体会跟着动,有遮挡关系。

     这个树叶还是一如既往的混乱……

     请老师指点一二,谢谢!
cow&speedtree.png

该用户从未签到

发表于 2011-4-28 08:32:10 | 显示全部楼层
如果不禁用渲染列表,就无法绘制Speedtree节点,但是貌似是个投机取巧的办法
不是投机取巧,这是最好的封装其它渲染工具的方案

绘制混乱的一个可能性是,外部渲染工具在渲染结束时设置了一些OpenGL的状态,而OSG的State类没能知道这些改变,比较典型的是顶点的ClientState:外部工具可能已经关闭了它,而OSG并不知道,那么在绘制下一个物体时就会出现问题。您可以尝试在drawImplementation()的末尾添加下面的语句:
  1. osg::State* state = renderInfo.getState();
  2.     state->lazyDisablingOfVertexAttributes();
  3.     state->applyDisablingOfVertexAttributes();
复制代码
此外computeBound()也是一个必须要实现的方法,否则远近平面裁减时会得不到正确的结果

该用户从未签到

 楼主| 发表于 2011-4-28 14:28:46 | 显示全部楼层
回复 4# array

osg::State* state = renderInfo.getState();

state->lazyDisablingOfVertexAttributes();

state->applyDisablingOfVertexAttributes();


在我的工程里,没有找到lazyDisablingOfVertexAttributes和applyDisablingOfVertexAttributes两个函数,我用的是2.83版的。
这个是网上查到的两个函数:

  1. void State::lazyDisablingOfVertexAttributes()
  2. {
  3.     // OSG_NOTICE<<"lazyDisablingOfVertexAttributes()"<<std::endl;
  4.     if (!_useVertexAttributeAliasing)
  5.     {
  6.         _vertexArray._lazy_disable = true;
  7.         _normalArray._lazy_disable = true;
  8.         _colorArray._lazy_disable = true;
  9.         _secondaryColorArray._lazy_disable = true;
  10.         _fogArray._lazy_disable = true;
  11.         for(EnabledTexCoordArrayList::iterator itr = _texCoordArrayList.begin();
  12.             itr != _texCoordArrayList.end();
  13.             ++itr)
  14.         {
  15.             itr->_lazy_disable = true;
  16.         }
  17.     }

  18.     for(EnabledVertexAttribArrayList::iterator itr = _vertexAttribArrayList.begin();
  19.         itr != _vertexAttribArrayList.end();
  20.         ++itr)
  21.     {
  22.         itr->_lazy_disable = true;
  23.     }
  24. }
  25. void State::applyDisablingOfVertexAttributes()
  26. {
  27.     //OSG_NOTICE<<"start of applyDisablingOfVertexAttributes()"<<std::endl;
  28.     if (!_useVertexAttributeAliasing)
  29.     {
  30.         if (_vertexArray._lazy_disable) disableVertexPointer();
  31.         if (_normalArray._lazy_disable) disableNormalPointer();
  32.         if (_colorArray._lazy_disable) disableColorPointer();
  33.         if (_secondaryColorArray._lazy_disable) disableSecondaryColorPointer();
  34.         if (_fogArray._lazy_disable) disableFogCoordPointer();
  35.         for(unsigned int i=0; i<_texCoordArrayList.size(); ++i)
  36.         {
  37.             if (_texCoordArrayList[i]._lazy_disable) disableTexCoordPointer(i);
  38.         }
  39.     }
  40.     for(unsigned int i=0; i<_vertexAttribArrayList.size(); ++i)
  41.     {
  42.         if (_vertexAttribArrayList[i]._lazy_disable) disableVertexAttribPointer(i);
  43.     }
  44.     // OSG_NOTICE<<"end of applyDisablingOfVertexAttributes()"<<std::endl;
  45. }
复制代码

是不是可以用state->disableAllVertexArrays()代替?但是,还是没作用。

我修改了dds压缩纹理图,树叶有了变化,但是我觉得不能根本解决问题:

dds修改

dds修改

树叶产生的变化

树叶产生的变化


您对此有没有什么看法?

该用户从未签到

发表于 2011-4-29 08:19:43 | 显示全部楼层
我没有看法,我对您的程序一无所知

该用户从未签到

发表于 2011-6-30 15:28:29 | 显示全部楼层
请问楼主SpeedTree 5.0 SDK哪里能够下到,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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