查看: 1700|回复: 8

请问有没有控制3d模型运动的例子啊?

[复制链接]

该用户从未签到

发表于 2010-5-16 17:11:39 | 显示全部楼层 |阅读模式
请问有没有使用键盘来控制模型运动的例子啊?

该用户从未签到

 楼主| 发表于 2010-5-16 17:12:57 | 显示全部楼层
哪位大侠能给一个简单的例子啊,就是使用键盘控制模型移动的就行~谢谢啦~

该用户从未签到

 楼主| 发表于 2010-5-16 18:07:59 | 显示全部楼层
怎么没有人理我啊?

该用户从未签到

 楼主| 发表于 2010-5-16 18:08:55 | 显示全部楼层
求助啊,给个类似的例子也好啊~

该用户从未签到

发表于 2010-5-16 18:13:20 | 显示全部楼层
您搜索一下以前的帖子,,有人提供有相关的示例~~您也可以采用更新回调来控制物体运动,,通过继承osg::NodeCallback来控制~~~~~或者,,,您也可以参考osgpick和osgmanipulator这个两个例子来改写~~~~~~~

该用户从未签到

发表于 2010-5-16 18:16:11 | 显示全部楼层
您好!我们回帖肯定没有那么快,,每个人都有自己的事情,,只是工作之余抽时间出来的!!请您谅解,也请各位会员积极参与回帖!!!

该用户从未签到

发表于 2010-5-16 19:30:56 | 显示全部楼层
class EventOP:public osgGA::GUIEventHandler
{
public:
        EventOP(osg::MatrixTransform* node);//构造函数
        virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
private:
        osg::MatrixTransform * OPNode;
};
EventOP::EventOP(osg::MatrixTransform* node)
{
        OPNode=node;
}
bool EventOP::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
        osg::Matrix M0,M1;
        if (ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN)
        {
                if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up)
                        M1.makeTranslate(osg::Vec3(0,0.3,0));//前
                if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down)
                        M1.makeTranslate(osg::Vec3(0,-0.3,0));//后
                if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Left)
                        M1.makeRotate(0.03,osg::Vec3(0,0,1));//左
                if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Right)
                        M1.makeRotate(-0.03,osg::Vec3(0,0,1));//右
                if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Shift_L)
                        M1.makeRotate(0.03,osg::Vec3(1,0,0));//上
                if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Control_L)
                        M1.makeRotate(-0.03,osg::Vec3(1,0,0));//下
        }
        else return false;
        M0=OPNode->getMatrix();
        OPNode->setMatrix(M1*M0);
        return true;
}
//////////////////////////////
void main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer();
        osg::ref_ptr<osg::Group> root=new osg::Group();
        osg::ref_ptr<osg::Node> lz=osgDB::readNodeFile("lz.osg");
        osg::ref_ptr<osg::Node> cessna=osgDB::readNodeFile("cessna.osg");

        osg::ref_ptr<osg::MatrixTransform> maintran=new osg::MatrixTransform();
        osg::ref_ptr<osg::MatrixTransform> justtran=new osg::MatrixTransform();

        osg::Matrix mt;
        mt.makeRotate(3.14159,osg::Vec3(0,0,1));
        justtran->setMatrix(mt);
        mt.makeTranslate(osg::Vec3(0,0,150));
        maintran->setMatrix(mt);

        justtran->addChild(cessna.get());
        maintran->addChild(justtran.get());
        root->addChild(lz.get());
        root->addChild(maintran.get());

        viewer->setSceneData(root.get());
        viewer->addEventHandler(new EventOP(maintran.get()));
        viewer->run();
}
碰巧上几天刚做的

该用户从未签到

 楼主| 发表于 2010-5-16 20:19:36 | 显示全部楼层
非常感谢!非常感谢! 7# wxt_1985

该用户从未签到

 楼主| 发表于 2010-5-16 20:20:36 | 显示全部楼层
非常感谢,研究研究! 6# FlySky
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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