查看: 1334|回复: 0

【求助】天空盒的视锥范围

[复制链接]

该用户从未签到

发表于 2013-6-13 16:20:53 | 显示全部楼层 |阅读模式
本帖最后由 xulin_2005 于 2013-6-18 13:53 编辑

【目的】
     想做一个天空盒的效果,并且可以分地面上和地面下的两种效果。

【问题】    将天空分成两块,一个半球做天空,一个圆面做地面,发现当视点里地面很近时会出现漏空的地方。

【详细描述】
根据osgvertexprogram例子修改,将原先的圆球改成了半球,然后修改了其中用于观察矩阵转换的回调函数,想要设计出地面和地上的天空盒效果,发现在地下向上观察时会有一部分天空露出的情况(其实应该被遮掉),基本上是接近垂心时会发生这种情况,请问是否是视锥的问题,有什么办法可以解决么?

没做观察矩阵修改的情况(半球形的天空)

图像 1.png
添加了观察矩阵变换的效果,天空盒的效果
图像 2.png


天空盒效果下,从半球圆心下观察的效果,出现一部分天空露出的问题,(其实应该是被遮掉的)

天空盒1

天空盒1


变换观察矩阵的代码
  1. class MoveEarthySkyWithEyePointTransform : public osg::Transform
  2. {
  3. public:
  4.         /** Get the transformation matrix which moves from local coords to world coords.*/
  5.         virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
  6.         {
  7.                 static osg::Vec3                _prePos;
  8.                 osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
  9.                 if (cv)
  10.                 {
  11.                         osg::Vec3 eyePointLocal = cv->getEyeLocal();
  12.                         if ( _prePos.z() > 0.0f )
  13.                         {
  14.                                 eyePointLocal -= osg::Vec3(0.0f, 0.0f, 5.0f);
  15.                         }
  16.                         else
  17.                         {
  18.                                 eyePointLocal += osg::Vec3(0.0f, 0.0f, 5.0f);
  19.                         }
  20.                         matrix.preMultTranslate(eyePointLocal);

  21.                         if ( _prePos != eyePointLocal )
  22.                         {
  23.                                 _prePos = eyePointLocal;
  24.                                 log("观察视角变换: %f,%f,%f", _prePos.x(), _prePos.y(), _prePos.z());
  25.                         }
  26.                 }
  27.                 return true;
  28.         }

  29.         /** Get the transformation matrix which moves from world coords to local coords.*/
  30.         virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
  31.         {
  32.                 osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
  33.                 if (cv)
  34.                 {
  35.                         osg::Vec3 eyePointLocal = cv->getEyeLocal();
  36.                         matrix.postMultTranslate(-eyePointLocal);
  37.                 }
  38.                 return true;
  39.         }
  40. protected:

  41. };
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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