|
本帖最后由 xulin_2005 于 2013-6-18 13:53 编辑
【目的】
想做一个天空盒的效果,并且可以分地面上和地面下的两种效果。
【问题】 将天空分成两块,一个半球做天空,一个圆面做地面,发现当视点里地面很近时会出现漏空的地方。
【详细描述】
根据osgvertexprogram例子修改,将原先的圆球改成了半球,然后修改了其中用于观察矩阵转换的回调函数,想要设计出地面和地上的天空盒效果,发现在地下向上观察时会有一部分天空露出的情况(其实应该被遮掉),基本上是接近垂心时会发生这种情况,请问是否是视锥的问题,有什么办法可以解决么?
没做观察矩阵修改的情况(半球形的天空)
添加了观察矩阵变换的效果,天空盒的效果
天空盒效果下,从半球圆心下观察的效果,出现一部分天空露出的问题,(其实应该是被遮掉的)
天空盒1
变换观察矩阵的代码- class MoveEarthySkyWithEyePointTransform : public osg::Transform
- {
- public:
- /** Get the transformation matrix which moves from local coords to world coords.*/
- virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
- {
- static osg::Vec3 _prePos;
- osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
- if (cv)
- {
- osg::Vec3 eyePointLocal = cv->getEyeLocal();
- if ( _prePos.z() > 0.0f )
- {
- eyePointLocal -= osg::Vec3(0.0f, 0.0f, 5.0f);
- }
- else
- {
- eyePointLocal += osg::Vec3(0.0f, 0.0f, 5.0f);
- }
- matrix.preMultTranslate(eyePointLocal);
- if ( _prePos != eyePointLocal )
- {
- _prePos = eyePointLocal;
- log("观察视角变换: %f,%f,%f", _prePos.x(), _prePos.y(), _prePos.z());
- }
- }
- return true;
- }
- /** Get the transformation matrix which moves from world coords to local coords.*/
- virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
- {
- osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
- if (cv)
- {
- osg::Vec3 eyePointLocal = cv->getEyeLocal();
- matrix.postMultTranslate(-eyePointLocal);
- }
- return true;
- }
- protected:
- };
复制代码
|
|