查看: 2033|回复: 8

通过透明包围盒看模型,出现异常现象

[复制链接]

该用户从未签到

发表于 2009-10-21 11:51:59 | 显示全部楼层 |阅读模式
这是什么问题啊?   图片在附件里。
转动观察角度,时而正常,时而异常~!

异常

异常

正常

正常

该用户从未签到

 楼主| 发表于 2009-10-21 11:58:53 | 显示全部楼层
第一张图, 异常的部分, 可能是变成透明的了~!!

等待解答。。。。。。。。。。。。。。。。。。

该用户从未签到

发表于 2009-10-21 12:26:54 | 显示全部楼层
您没有提供任何可供参考的信息,抱歉我无法判断

该用户从未签到

 楼主| 发表于 2009-10-21 12:40:59 | 显示全部楼层
就这些设置:

state->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
state->setMode(GL_BLEND,osg::StateAttribute::ON);
state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
osg::Vec4 color( 1,1,1, 0.4 );
osg::BlendFunc    *blendFunc = new osg::BlendFunc();
osg::BlendColor    *blendColor= new osg::BlendColor(color);
blendFunc->setSource(osg::BlendFunc::CONSTANT_ALPHA);
blendFunc->setDestination(osg::BlendFunc::ONE_MINUS_CONSTANT_ALPHA);

state->setAttributeAndModes(blendFunc,osg::StateAttribute::ON);
state->setAttributeAndModes(blendColor,osg::StateAttribute::ON);

state->setMode(GL_LIGHTING, osg::StateAttribute::OFF |osg::StateAttribute:ROTECTED);

该用户从未签到

发表于 2009-10-21 12:51:42 | 显示全部楼层
您可以尝试设置一下渲染顺序setRenderBinDetails,而不是直接使用TRANSPARENT_BIN。设置为TRANSPARENT_BIN的节点会自动被附加一个AlphaFunc的属性,我不知道这会不会对您的Blend融混产生什么影响

该用户从未签到

 楼主| 发表于 2009-10-21 15:42:38 | 显示全部楼层
问题已解决, 多谢array~!!
加了一句:
state->setRenderBinDetails( 100, "RenderBin" );


再请教个小问题:

怎样在 MatrixManipulator 类中,得到当前的摄像机位置信息?  (就是eyePosition, lookatPosition)

该用户从未签到

发表于 2009-10-21 17:15:11 | 显示全部楼层
getInverseMatrix(),即观察矩阵,然后自己从中分解(OpenGL有相关的公式)

该用户从未签到

 楼主| 发表于 2009-10-21 17:15:15 | 显示全部楼层
我想实现这样一个功能:
选择一个模型后,摄像机自动移动到该模型的 相对位置。(即从模型的正前方观察该模型)
在未选择任何模型时,摄像机是可以随意操作的(平移、旋转、缩放等)。

现在的问题是:  中心点的位置可以平滑的过度, 但眼睛的位置怎样实现平滑过度啊?


附上代码,不对的地敬请指正,  才接触osg。

这个MatrixManipulator派生类是别人写的,理解得不是很明白..

  1. bool CityManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)
  2. {
  3.         osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*> (&us);
  4.         if( !viewer )
  5.                 return false;

  6.         osg::Vec3d dis( _center-_centerTo );
  7.         if( m_IsQuery && dis.length() > m_fMoveSpeed )
  8.         {
  9.                 _center = _center + _toDirection * m_fMoveSpeed;
  10.                 return false;
  11.         }
  12.         else if(m_IsQuery)
  13.         {
  14.                 _center = _centerTo;                        // 校位
  15.                 m_IsQuery = false;

  16.                 _homeEye[2] =  _center[2]+100.f;                // 调整观察位置
  17.                 _homeEye[1] =  _center[1]-300.f;
  18.                 _homeEye[0] =  _center[0];
  19.                  computePosition(_homeEye, _center, _homeUp);
  20.         }

  21. }



  22. void CityManipulator::computePosition(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up)
  23. {
  24.     if (!_node)
  25.         return;

  26.     // compute rotation matrix
  27.     osg::Vec3d lv(center-eye);
  28.     _distance = lv.length();
  29.     _center = center;

  30.     osg::Matrixd rotation_matrix = osg::Matrixd::lookAt(eye,center,up);

  31.     _rotation = rotation_matrix.getRotate().inverse();

  32.      osg::Quat tmp(-osg::PI/4, osg::Vec3(1.0,0,0));
  33.      _rotation = _rotation*tmp;

  34.     CoordinateFrame coordinateFrame = getCoordinateFrame(_center);
  35.     _previousUp = getUpVector(coordinateFrame);

  36.     clampOrientation();
  37. }


  38. void CityManipulator::clampOrientation()
  39. {
  40.     osg::Matrixd rotation_matrix;
  41.     rotation_matrix.makeRotate(_rotation);

  42.     osg::Vec3d lookVector = -getUpVector(rotation_matrix);
  43.     osg::Vec3d upVector = getFrontVector(rotation_matrix);

  44.     CoordinateFrame coordinateFrame = getCoordinateFrame(_center);
  45.     osg::Vec3d localUp = getUpVector(coordinateFrame);
  46.     //osg::Vec3d localUp = _previousUp;

  47.     osg::Vec3d sideVector = lookVector ^ localUp;

  48.     if (sideVector.length()<0.1)
  49.     {
  50.         osg::notify(osg::INFO)<<"Side vector short "<<sideVector.length()<<std::endl;

  51.         sideVector = upVector^localUp;
  52.         sideVector.normalize();

  53.     }

  54.     Vec3d newUpVector = sideVector^lookVector;
  55.     newUpVector.normalize();

  56.     osg::Quat rotate_roll;
  57.     rotate_roll.makeRotate(upVector,newUpVector);

  58.     if (!rotate_roll.zeroRotation())
  59.     {
  60.         _rotation = _rotation * rotate_roll;
  61.     }
  62. }



  63. osg::Matrixd CityManipulator::getInverseMatrix() const
  64. {
  65.     return osg::Matrixd::translate(-_center)*osg::Matrixd::rotate(_rotation.inverse())
  66.                 *osg::Matrixd::translate(0.0,0.0,-_distance);
  67. }


复制代码

该用户从未签到

发表于 2009-10-21 20:49:14 | 显示全部楼层
我只能说,您自己的算法,就用自己的方法解决,没有一定之规
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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