查看: 6748|回复: 28

如何实现类似3dmax中的俯视图,前视图,左视图等

[复制链接]

该用户从未签到

发表于 2011-5-20 15:41:13 | 显示全部楼层 |阅读模式
本帖最后由 garyliyong 于 2011-5-22 08:09 编辑

我创建了一个视图,但是在我需要的时候我可以将当前视图变为俯视图或左视图等,也就是模型不动,相机的位置改变,谢谢

该用户从未签到

发表于 2011-5-20 17:10:41 | 显示全部楼层
add slavecamera

该用户从未签到

 楼主| 发表于 2011-5-20 19:08:12 | 显示全部楼层
我的意思好像没有讲清楚  刚开始有个默认的视图,怎么样将当前视图变成俯视图或左视图等,我用setViewMatrixAsLookat没能实现我的效果,其实就是改变照相机的位置,而不是主视图再加几个其它视图

该用户从未签到

发表于 2011-5-20 19:16:18 | 显示全部楼层
setViewMatrixAsLookat 是在什么时候添加的?

该用户从未签到

 楼主| 发表于 2011-5-20 20:46:30 | 显示全部楼层
我就是在一个函数里首先获取getCamera,然后setViewMatrixAsLookAt,不知道我这样做对不对,知道的人不如直接提供一下你的实现方法

该用户从未签到

发表于 2011-5-20 21:28:42 | 显示全部楼层
使用操作器即可,设置正投影方式

该用户从未签到

 楼主| 发表于 2011-5-21 08:26:33 | 显示全部楼层
回复 6# fenma3422


   你能说得具体一些吗?写个简单的示例代码可以吗?

该用户从未签到

发表于 2011-5-21 23:54:22 | 显示全部楼层
使用Slave Camera或者四个View在同一个CompositeViewer中都是可以的,注意主相机的矩阵要在回调中随时更新给另外三个相机。实现起来并没有特别复杂的地方,细心即可

该用户从未签到

 楼主| 发表于 2011-5-22 07:19:48 | 显示全部楼层
本帖最后由 garyliyong 于 2011-5-22 08:10 编辑

回复 8# array


   array,我其实只是创建了一个视图,但是在我需要的时候我可以将当前视图变为俯视图或左视图等,也就是模型不动,相机的位置改变,谢谢

该用户从未签到

 楼主| 发表于 2011-5-22 20:04:42 | 显示全部楼层
本帖最后由 garyliyong 于 2011-5-22 20:45 编辑

回复 8# array
我今天又看了一下你写的鸟瞰图相机(就是俯视图)的例子,里面是创建了一个相机,并且是正交视图,我是要实现模型不变,主相机的观察位置改变,透视矩阵不变,实现俯视图。就是我点击一下菜单栏(俯视图),相机就变换位置了。截图示例:Remo 3D中利用osg实现:

初始状态

初始状态

选择俯视图后

选择俯视图后

该用户从未签到

 楼主| 发表于 2011-5-22 21:27:52 | 显示全部楼层
我在网上看了这样一个帖子:http://forum.openscenegraph.org/viewtopic.php? t=2645&highlight=,里面也问了关于setViewMatrixAsLookAt的问题,如果设置setCameraManipulator(NULL),那就不能进行操作了,怎么样才能解决这两种问题呢?

该用户从未签到

发表于 2011-5-23 09:03:08 | 显示全部楼层
您到底要实现什么?我在新书Cookbook里会提供一个四视图的例子,不过那肯定要等到明年初了

该用户从未签到

 楼主| 发表于 2011-5-23 09:37:46 | 显示全部楼层
本帖最后由 garyliyong 于 2011-5-23 09:39 编辑

回复 12# array


    我的标题可能写错了,其实就是setViewMatrixAsLookAt为什么不起作用?我给出了一个帖子上说必须设置setCameraManipulator(NULL)才起作用,但是这样的话操作器就不起作用了?http://forum.openscenegraph.org/viewtopic.php? t=2645&highligh=

该用户从未签到

发表于 2011-5-23 10:23:18 | 显示全部楼层
回复 13# garyliyong


    你自己写个操作器的话貌似就可以,也就是说setCameraManipulator(new MyManipulatro());这样你漫游什么的就可以按照你自己的意图进行,而且也可以改变相机位置。

该用户从未签到

发表于 2011-5-23 12:44:23 | 显示全部楼层
另一个简单的方式是用Camera回调,它的执行在Manipulator更新之后,因此也可以控制相机的观察矩阵

该用户从未签到

发表于 2011-6-13 21:09:27 | 显示全部楼层
目前,我的是通过这种方式:
d.makeLookAt(boundingSphere._center+osg::Vec3( 0.0,0.0f,3.5f * boundingSphere._radius),boundingSphere._center,osg::Vec3(0.0f,1.0f,0.0f));
mViewer->getCameraManipulator()->setByInverseMatrix(d);
俯视图。其他的可类推。

该用户从未签到

发表于 2011-6-15 17:10:35 | 显示全部楼层
感谢wanghuisoftware!

该用户从未签到

发表于 2013-1-31 16:02:20 | 显示全部楼层
garyliyong 发表于 2011-5-22 20:04
回复 8# array
我今天又看了一下你写的鸟瞰图相机(就是俯视图)的例子,里面是创建了一个相机,并且是正 ...

请问一下,这个俯视图的功能怎么实现,我现在想实现这样的功能。和你给你两个贴图一样的效果。

该用户从未签到

发表于 2013-2-2 12:10:41 | 显示全部楼层
本帖最后由 buaahc 于 2013-2-2 13:00 编辑
shininglwb 发表于 2013-1-31 16:02
请问一下,这个俯视图的功能怎么实现,我现在想实现这样的功能。和你给你两个贴图一样的效果。


如果你想实现3ds中的界面 那么3个HUD是最好的方法,或者使用3个从相机但是要设置        camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF)设置为绝对坐标系,这样拖动主相机界面时,从相机不会动,始终指向你初始化时候的那个面。。。也就是纯3ds的界面。

还有就是设置为相对坐标系,这样从相机跟着主相机动

该用户从未签到

发表于 2013-2-7 09:54:44 | 显示全部楼层
buaahc 发表于 2013-2-2 12:10
如果你想实现3ds中的界面 那么3个HUD是最好的方法,或者使用3个从相机但是要设置        camera->setReference ...

我觉着GL说的那个应该可行 三个hud貌似会有冲突吧

该用户从未签到

发表于 2013-2-7 18:58:41 | 显示全部楼层
w910916 发表于 2013-2-7 09:54
我觉着GL说的那个应该可行 三个hud貌似会有冲突吧

三个hud窗口 不过就是三个camera节点  我不知道你说的冲突是什么冲突,请说明白点,谢谢

该用户从未签到

发表于 2013-2-7 21:28:10 | 显示全部楼层
buaahc 发表于 2013-2-7 18:58
三个hud窗口 不过就是三个camera节点  我不知道你说的冲突是什么冲突,请说明白点,谢谢

哈哈 口误 打错了,,,这个多视口 最新那本osg的书上有  买来试试吧。。。还不错 够起步学习了

该用户从未签到

发表于 2013-2-7 21:32:24 | 显示全部楼层
w910916 发表于 2013-2-7 21:28
哈哈 口误 打错了,,,这个多视口 最新那本osg的书上有  买来试试吧。。。还不错 够起步学习了

起步学习。。。我08年开始学的。。。。。。。。。。。。。。。。。。。
谢谢啊。。。

该用户从未签到

发表于 2013-2-8 23:06:05 | 显示全部楼层
buaahc 发表于 2013-2-7 21:32
起步学习。。。我08年开始学的。。。。。。。。。。。。。。。。。。。
谢谢啊。。。

加油加油 好好弄

该用户从未签到

发表于 2016-6-3 10:30:07 | 显示全部楼层
请问现在这个问题你解决了吗?最近我也想实现这个功能~

该用户从未签到

发表于 2016-6-9 23:29:22 | 显示全部楼层
付宏伟 发表于 2016-6-3 10:30
请问现在这个问题你解决了吗?最近我也想实现这个功能~

。。。 。。。

该用户从未签到

发表于 2016-6-10 22:15:41 | 显示全部楼层

该用户从未签到

发表于 2016-6-12 09:43:36 | 显示全部楼层
cookbook 里面有实现,你不看书 也不看贴么?锐爷几年前都回复了。。

该用户从未签到

发表于 2017-11-17 18:03:32 | 显示全部楼层
最近也在做这个功能,看了下帖子都6年前的了......
用osg实现类似3dmax的编辑窗口,看了一些大神的书和帖子,琢磨了一周做出来了。
最关键的启发是FreeSouth大神发的帖子:http://www.osgchina.org/index.ph ... itiv&Itemid=490
讲的非常明白,一语道破天机。在此由衷感谢!并想给他生猴子!
锐爷那个没看到,一会找找。

这个需求关键在于四个视图每个都分别有自己的轨迹球操作,不需要联动。
之前用多相机,addslave,setViewMatrixAsLookAt怎么都不好使,要不动,要不就四个视图一起动(也可能是得自己重写一些方法控制,回调什么的,我不会弄......)。

FreeSouth帖子里讲,多相机的方式addslave,是一个主相机,其它都是跟随主相机的,不能单独操作的。
想要每个视图单独操作要用多视图osgViewer::CompositeViewer,加4个View视图,每个视图一个相机,每个视图有单独的TrackballManipulator操作轨迹球,setSceneData添加的是同一个物体。

接下来参考下example里CompositeViewer的例子,基本就实现了。

至于楼主说的,单击一个按钮变成左视图,1,获取当前4视图中获得焦点的视图CompositeViewer->getViewWithFocus();2,获得该视图的操作器;3,先把物体home一下;4,旋转为左视图traceBall->setRotation(osg:uat(1.0f, -1.0, -1.0, 1.0f));

希望能为之后遇到此问题的人提供一些帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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