查看: 2721|回复: 7

如何将camera 拉近, 实现放大功能

[复制链接]

该用户从未签到

发表于 2014-7-31 08:47:15 | 显示全部楼层 |阅读模式

各位大哥,

小弟想实现一个功能,一直没有想得太明白。


该功能是一个菜单,点击该菜单之后,可以拉近 camera 和 场景图中物体的 距离,实现放大功能。
场景图物体已经被鼠标左右键旋转,放大等。


我的想法是下面两个方法:

1. 重新设置 camera->setViewMatrixAsLookat(eyepoint, center,upDirection)
如果用此方法,是否是先
camera->getViewMatrixAsLookat(eyepoint, center,upDirection) 获取当前值,
然后再更改eyepoint位置?

2.利用漫游器
osgGA::MatrixManipulator中的
setByMatrix()来设置相机的位置姿态矩阵,
感觉这个更加复杂,如何来设置这个矩阵。


小弟的两个想法不是很成熟,
望给予点更详细的例子或者说明。

这个功能是不是就是 鼠标滚轮的放大,缩小功能?我自己要实现,该如何呢?
只是拉近camera与场景图中物体的距离,实际上物体并没有并scale?

多谢。

该用户从未签到

发表于 2014-7-31 09:13:39 | 显示全部楼层
如果不使用osg自带的控制器(cameraManipulator),使用你第一条思路,现在场景中显示出来物体,然后通过你上面的方法,调整摄像机也行,或者使用节点回调,来调节单个的你需要显示的图。如果使用控制器了,osg自带的控制器,能满足你的需要,你修改下控制器也行。

该用户从未签到

 楼主| 发表于 2014-8-1 08:52:09 | 显示全部楼层
本帖最后由 rubby 于 2014-8-1 08:59 编辑
ysw 发表于 2014-7-31 09:13
如果不使用osg自带的控制器(cameraManipulator),使用你第一条思路,现在场景中显示出来物体,然后通过你 ...


多谢ysw大哥,

我是使用了 osg 自带的控制器 TrackballManipulator。
但是这个控制器在 win7 下鼠标中键缩放都ok,
现在在win8 下鼠标中键缩放不ok。
所以想做个菜单,用户点击这个菜单,自己修改 camera位置,进行缩放。

小弟按照你的提示,我实验如下:

1.第一种方法:当用户点击菜单后,指向如下动作:
  1.        
  2. mViewer->getCamera()->getViewMatrixAsLookAt( eye,center,up);
  3.        
  4.         osg::Vec3 discount = eye-center;
  5.         float x = discount.x()*(1.0f-factor); //factor 是缩放比例
  6.         float y=  discount.y()*(1.0f-factor);
  7.         float z = discount.z()*(1.0f-factor);

  8.         mViewer->getCamera()->setViewMatrixAsLookAt( eye+osg::Vec3(x,y,z),center,up);
复制代码


经过测试,eye的值确实改变了,但是场景图并没有放大,毫无变化

2. 第二种方法:

我继承了TrackballManipulator。将zoomModel()方法改为public暴露出来,
当用户点击菜单后,执行如下动作:
  1. myManipulator->zoomModel(factor,true);
复制代码


但是一运行,程序报错,访问冲突。



麻烦 大哥,再帮我看看原因。

该用户从未签到

发表于 2014-8-1 09:23:56 | 显示全部楼层
rubby 发表于 2014-8-1 08:52
多谢ysw大哥,

我是使用了 osg 自带的控制器 TrackballManipulator。

第一种方法如果在没有控制器的情况下有用(TrackBallManipulator),一旦使用了控制器,viewer中camera的viewMatrix就不起作用了,它的一切行为控制都是通过控制器来控制的(trackBallManipulator). 你可以这样,viewer->getCameraManipulator()->setMatrix().传递一个矩阵那样,能够进行调节,这样场景中的所有物体都进行了调整。如果你只想调节单个物体的位置,可以使用下面这个方法。

第二中方法是你想要操控的物体,在场景中是一个node节点,你可以继承nodeCallBack,实现下这个函数,然后通过这个函数,来实时获得node的位置信息,把这个矩阵修改一下,在用setMatrix().进行操作,也能够改变物体的位置。osg编译好,有个自带的例子,来实现控制器的,你可以看下。

该用户从未签到

 楼主| 发表于 2014-8-4 16:29:59 | 显示全部楼层
ysw 发表于 2014-8-1 09:23
第一种方法如果在没有控制器的情况下有用(TrackBallManipulator),一旦使用了控制器,viewer中camera的v ...

根据您的提示,已经解决。
特来拜谢。

该用户从未签到

发表于 2014-8-5 17:25:53 | 显示全部楼层
rubby 发表于 2014-8-4 16:29
根据您的提示,已经解决。
特来拜谢。

没事,多多交流,共同学习

该用户从未签到

发表于 2015-7-4 13:52:12 | 显示全部楼层
rubby 发表于 2014-8-4 16:29
根据您的提示,已经解决。
特来拜谢。

我现在也是这个问题,请问你怎么弄的哇,我用zoommodel没反应

该用户从未签到

 楼主| 发表于 2015-7-10 10:49:49 | 显示全部楼层
np199364 发表于 2015-7-4 13:52
我现在也是这个问题,请问你怎么弄的哇,我用zoommodel没反应

我使用第二种方法解决的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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