利用osg实现类似3dsMax的四视图效果

本文介绍了如何利用osg库来创建类似3dsMax的四视图编辑窗口,重点在于每个视图都有独立的轨迹球操作。通过osgViewer::CompositeViewer和多个View视图实现,每个视图对应一个相机,并设置TrackballManipulator。关键步骤包括设置SceneData、获取焦点视图、操作轨迹球进行视角转换。作者分享了实现这一功能的关键代码,以帮助遇到相同问题的读者。
摘要由CSDN通过智能技术生成

用osg实现类似3dmax的编辑窗口,看了一些大神的书和帖子,做出了例子。
最关键的启发是FreeSouth大神发的帖子:http://www.osgchina.org/index.php?option=com_content&view=article&id=134:usecompositiv&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:Quat(1.0f, -1.0, -1.0, 1.0f));

希望能为之后遇到此问题的人提供一些帮助
附上关键代码:

RECT rect;
::GetWindowRect(m_hWnd, &rect);
osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);


// Create the viewer for this window
//创建复合视图compositeViewer对象,及4个视图
m_ViewerSet=new osgViewer::CompositeViewer();
osg::ref_ptr<osgViewer::View> Viewer1 = new osgViewer::View();
osg::ref_ptr<osgViewer::View> Viewer2 = new osgViewer::View();
osg::ref_ptr<osgViewer::View> Viewer3 = new osgViewer::View();
osg::ref_ptr<osgViewer::View> Viewer4 = new osgViewer::View();
//为四个视图创建四个独立的轨迹球
m_traceball1 = new osgGA::TrackballManipulator();
m_traceball2 = new osgGA::TrackballManipulator();
m_traceball3 = new osgGA::TrackballManipulator();
m_traceball4 = 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值