我要发帖 回复

正式会员

2

主题

29

积分

0

专家分

:

私信
发表时间 : 2008-6-11 00:50:20 | 浏览 : 3375    评论 : 6
上次和hesicong讨论了一下,他建议我自己继承一个manipulator,我觉得太麻烦,最后找到了一个已有的manipulator,叫做NodeTrackerManipulator,这个可以直接实现固定观察中心为某一个node,我写了个简单的例子如下:
#include <osg/ref_ptr>
#include <osg/Group>
#include <osgViewer/Viewer>
#include <osgDB/readFile>
#include <osgGA/TrackBallManipulator>
#include <osg/MatrixTransform>
#include <osgGA/NodeTrackerManipulator>
#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    osg::ref_ptr<osg::Group> root =
        new osg::Group;
    osg::ref_ptr<osg::Node> cow;
    cow = osgDB::readNodeFile("cow.osg");
    //osg::ref_ptr<osg::Node> cessna;
    //cessna = osgDB::readNodeFile("cessna.osg");
    osg::ref_ptr<osg::MatrixTransform> mtleft =
        new osg::MatrixTransform();
    osg::ref_ptr<osg::MatrixTransform> mtright =
        new osg::MatrixTransform();
    osg::Matrix m;
    m.makeTranslate(10,0,0);
    mtleft->setMatrix(m);
    mtleft->addChild(cow.get());

    m.makeTranslate(-10,0,0);
    mtright->setMatrix(m);
    mtright->addChild(cow.get());

    root->addChild(mtright.get());
    root->addChild(mtleft.get());

    osg::ref_ptr<osgGA::NodeTrackerManipulator>
        ntm = new osgGA::NodeTrackerManipulator;
    ntm->setTrackNode(mtright.get());                                           //这一句就是设置作为观察中心的node

    osgViewer::Viewer viewer;
    viewer.setCameraManipulator(ntm.get());
    viewer.setSceneData( root.get() );
   
    return viewer.run();
}


小弟才接触osg没多久,今天第一次发帖,如有不对的地方还望大家指正,呵呵

评分

参与人数 1积分 +10 收起 理由
FlySky + 10

查看全部评分

最近VR访客

FlySky 评论于2008-6-11 01:19:05
不错,,支持~~~~~~~~~

不过,可以直接对viewer的矩阵变换进行设置,矩阵变换效果是一样的~~~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
simbaforrest 评论于2008-6-11 03:26:20
能说说怎么做吗?

原帖由 FlySky 于 2008-6-11 01:19 AM 发表
不错,,支持~~~~~~~~~

不过,可以直接对viewer的矩阵变换进行设置,矩阵变换效果是一样的~~~~~
FlySky 评论于2008-6-11 09:15:47
作为事件处理,你只需要继承一个manipulator,然后再把事件处理都变换为矩阵的变换,并对viewer设置(setViewMatrix)就好了啊~~感觉那样好像有点和NodeTrackerManipulator累赘了,呵呵~~~~

作为效果来做,就直接设置变换(setViewMatrix)就可以了啊,呵呵~~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
simbaforrest 评论于2008-6-11 10:52:30
原帖由 FlySky 于 2008-6-11 09:15 AM 发表
作为事件处理,你只需要继承一个manipulator,然后再把事件处理都变换为矩阵的变换,并对viewer设置(setViewMatrix)就好了啊~~感觉那样好像有点和NodeTrackerManipulator累赘了,呵呵~~~~

作为效果来做, ...



直接设置viewmatrix的话好像不行吧?,我试过,没效果啊。。。
FlySky 评论于2008-6-11 11:50:44
直接设置viewmatrix的话好像不行吧?,我试过,没效果啊。。。


可以的, 你得设置每一帧都更新变换~~~~~~~~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
没出息的汉子 评论于2009-12-16 23:11:28
我试了一下,上面代码结果视点在左边的个相机的左边,貌似不太对.大家有实验一下么?

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-6-24 02:30 AM

返回顶部