查看: 1370|回复: 6

求教:如何使一个模型始终显示在屏幕右下方,并可跟随场景旋转

[复制链接]

该用户从未签到

发表于 2012-6-26 19:11:16 | 显示全部楼层 |阅读模式
本帖最后由 lxcshd 于 2012-6-26 19:12 编辑

我想实现这样的效果:
一个模型始终显示在屏幕的右下方,当用鼠标或键盘进行场景漫游操作时,该右下方的模型会随着旋转操作进行旋转,但大小和位置不会被平移或缩放操作影响。求教这个效果该怎么实现?
我之前试图参照HUD的实现方法,但得到的效果是该模型始终不变,不会旋转。请问应该用什么方法可以实现旋转?

该用户从未签到

发表于 2012-6-26 20:03:12 | 显示全部楼层
添加HUD是对的,然后设置更新回调,在回调里将其矩阵设置成相机的矩阵就可以了 具体你可以参考坐标轴示例,在论坛里搜一下好了

该用户从未签到

 楼主| 发表于 2012-6-27 15:27:29 | 显示全部楼层
garyliyong 发表于 2012-6-26 20:03
添加HUD是对的,然后设置更新回调,在回调里将其矩阵设置成相机的矩阵就可以了 具体你可以参考坐标轴示例, ...

好的,谢谢

该用户从未签到

发表于 2012-6-27 15:47:21 | 显示全部楼层
方法很多

该用户从未签到

发表于 2012-6-27 16:24:34 | 显示全部楼层
本帖最后由 eway 于 2012-6-27 16:28 编辑

实现过程大概如下
  1.        
  2.         class testCameraUpdateCallback:public osg::NodeCallback
  3.         {
  4.         public:
  5.                 virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
  6.                 {
  7.                         if(nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
  8.                         {
  9.                                 osg::Camera* camera = dynamic_cast<osg::Camera*>(node);
  10.                                 if (camera)
  11.                                 {
  12.                                         osg::View* view = camera->getView();
  13.                                         if (view && view->getNumSlaves() > 0)
  14.                                         {
  15.                                                 osg::View::Slave* slave = &view->getSlave(0);
  16.                                                 if(slave->_camera.get() == camera)
  17.                                                 {
  18.                                                         osg::Camera* masterCam = view->getCamera();
  19.                                                         osg::Vec3 eye, center, up;
  20.                                                         masterCam->getViewMatrixAsLookAt(eye, center, up, 30);
  21.                                                         osg::Matrixd matrix;
  22.                                                         matrix.makeLookAt(eye-center, osg::Vec3(0, 0, 0), up); // always look at (0, 0, 0)
  23.                                                         camera->setViewMatrix(matrix);
  24.                                                 }
  25.                                         }
  26.                                 }
  27.                         }
  28.                         traverse(node,nv);
  29.                 }
  30.         };

  31.         osg::Camera* DrawUnit::createHUD()
  32.         {
  33.                 osg::Camera* camera = new osg::Camera;
  34.                //======这个是位置,设置为左下==============
  35.                 camera->setProjectionMatrix(osg::Matrix::ortho2D(0, 18, 0, 14));
  36.                 camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  37.                 camera->setViewMatrix(osg::Matrix::identity());
  38.                 camera->setClearMask(GL_DEPTH_BUFFER_BIT);
  39.                 camera->setRenderOrder(osg::Camera::POST_RENDER);
  40.                 camera->setUpdateCallback(new testCameraUpdateCallback);
  41.                 camera->setAllowEventFocus(false);
  42.                //============防止被近端剪裁=============
  43.                 camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);

  44.                 osg::Node* node = osgDB::ReadNodeFile("cow.osg");
  45.                 osg::StateSet *state = geode->getOrCreateStateSet();
  46.                 state->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

  47.                 camera->addChild(node);
  48.             return camera;
  49.         }
复制代码

该用户从未签到

 楼主| 发表于 2012-6-27 18:54:48 | 显示全部楼层
eway 发表于 2012-6-27 16:24
实现过程大概如下

太感谢了

该用户从未签到

发表于 2012-7-11 14:02:36 | 显示全部楼层
标记一下,原来也遇到过同样问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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