查看: 9764|回复: 35

模型运动控制

[复制链接]

该用户从未签到

发表于 2009-3-18 22:24:24 | 显示全部楼层 |阅读模式
刚刚接触osg,第一个想法就是要实现载入模型的控制。相信也有很多和我一样的新手也有这个冲动。下面是我这三个星期从知道到认识这个过程里做出来的一个控制tank模型的例子。实现方式地道不地道我也说不准,希望高手指点一下是否还有别的实现方法。由于这个程序是学习的过程中不断增加改进得到的,所以变量命名上有些乱。刚刚实现,拿出来show一下。
代码:
  1. #include <stdafx.h>
  2. #include <osgDB/ReadFile>
  3. #include <osgViewer/Viewer>
  4. #include <osg/Node>
  5. #include <osg/MatrixTransform>
  6. #include <osgGA/MatrixManipulator>

  7. class UseEventHandler : public osgGA::GUIEventHandler
  8. {
  9. public:
  10.         UseEventHandler(osg::MatrixTransform* tankPosistion)
  11.         {
  12.                 trans=tankPosistion;
  13.                 trans->setMatrix(osg::Matrix::translate(0,0,7));
  14.                 m_tankPosistion=osg::Vec3(0,0,7);
  15.                 tankSpeed=0.2;
  16.                 m_fAngle=0;

  17.                 btnUP=false;
  18.                 btnDOWN=false;
  19.                 btnLEFT=false;
  20.                 btnRIGHT=false;
  21.         }
  22.         virtual bool handle(const osgGA::GUIEventAdapter & ea,osgGA::GUIActionAdapter & aa)
  23.         {
  24.                 switch (ea.getEventType())
  25.                 {
  26.                 case osgGA::GUIEventAdapter::KEYDOWN:
  27.                         {
  28.                                 if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
  29.                                 {
  30.                                         btnUP=true;
  31.                                         return true;
  32.                                 }
  33.                                 if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
  34.                                 {
  35.                                         btnDOWN=true;
  36.                                         return true;
  37.                                 }
  38.                                 if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
  39.                                 {
  40.                                         btnLEFT=true;
  41.                                         return true;
  42.                                 }

  43.                                 if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
  44.                                 {
  45.                                         btnRIGHT=true;
  46.                                         return true;
  47.                                 }
  48.                                 return false;
  49.                 case osgGA::GUIEventAdapter::KEYUP:
  50.                                 if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
  51.                                 {
  52.                                         btnUP=false;
  53.                                         return true;
  54.                                 }
  55.                                 if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
  56.                                 {

  57.                                         btnDOWN=false;
  58.                                         return true;
  59.                                 }
  60.                                 if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
  61.                                 {
  62.                                         btnLEFT=false;
  63.                                         return true;
  64.                                 }

  65.                                 if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
  66.                                 {
  67.                                         btnRIGHT=false;
  68.                                         return true;
  69.                                 }               
  70.                         }
  71.                         break;
  72.                 default:
  73.                         break;
  74.                 }
  75.                 if (btnUP)
  76.                 {
  77.                         m_tankPosistion+=osg::Vec3(tankSpeed*cosf(osg::DegreesToRadians(m_fAngle+90)),tankSpeed*sinf(osg::DegreesToRadians(m_fAngle+90)),0);

  78.                         trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));
  79.                 }

  80.                 if (btnDOWN)
  81.                 {
  82.                         m_tankPosistion-=osg::Vec3(tankSpeed*cosf(osg::DegreesToRadians(m_fAngle+90)),tankSpeed*sinf(osg::DegreesToRadians(m_fAngle+90)),0);

  83.                         trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));
  84.                 }

  85.                 if (btnLEFT) //A
  86.                 {
  87.                         m_fAngle += 1 ;

  88.                         trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));

  89.                         return true;
  90.                 }

  91.                 if (btnRIGHT)//D
  92.                 {

  93.                         m_fAngle -= 1 ;

  94.                         trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));

  95.                         return true;
  96.                 }
  97.                 return false;
  98.         }
  99. private:
  100.         float tankSpeed;
  101.         osg::MatrixTransform* trans;
  102.         osg::Vec3 m_tankPosistion;
  103.         float m_fAngle;
  104. private:
  105.         bool btnUP;
  106.         bool btnDOWN;
  107.         bool btnLEFT;
  108.         bool btnRIGHT;
  109. };

  110. void main()
  111. {
  112.         osgViewer::Viewer viewer;

  113.         osg::ref_ptr<osg::Group> root = new osg::Group;

  114.         osg::ref_ptr<osg::Node> tank = new osg::Node;

  115.         osg::ref_ptr<osg::Node> terrain = new osg::Node;

  116.         osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform;

  117.         terrain = osgDB::readNodeFile("JoeDirt/JoeDirt.flt");

  118.         tank = osgDB::readNodeFile("T72-tank/t72-tank_des.flt");

  119.         trans->addChild(tank);
  120.         root->addChild(trans);
  121.         root->addChild(terrain);

  122.         viewer.setSceneData(root.get());
  123.         viewer.addEventHandler(new UseEventHandler(trans));
  124.         viewer.realize();
  125.         viewer.run();
  126. }
复制代码

[ 本帖最后由 array 于 2009-3-18 22:30 编辑 ]

Response.rar

967.6 KB, 下载次数: 17925, 下载积分: 威望 1

该用户从未签到

发表于 2011-3-8 22:28:45 | 显示全部楼层
嗯,编译运行了一下,要是加碰撞检测就好了

该用户从未签到

发表于 2009-3-18 22:30:45 | 显示全部楼层
Good~~~~强烈支持!!

该用户从未签到

发表于 2009-3-19 15:10:56 | 显示全部楼层
写的挺好,呵呵

该用户从未签到

发表于 2009-4-2 11:29:42 | 显示全部楼层
呵呵 写的不错!我想以我的水平最简单的也就是这么写!

该用户从未签到

发表于 2009-4-14 10:15:05 | 显示全部楼层
可是这样坦克会钻入地下

该用户从未签到

发表于 2009-4-14 10:59:47 | 显示全部楼层
碰撞检测一下就好了~~~~

该用户从未签到

发表于 2009-4-22 15:20:25 | 显示全部楼层
支持一下,我也想上传我的代码
容我再学习学习
哈哈哈~~~
:lol :lol

该用户从未签到

发表于 2009-4-23 10:35:54 | 显示全部楼层
支持一下

该用户从未签到

发表于 2009-4-29 08:48:32 | 显示全部楼层
加油

该用户从未签到

发表于 2009-5-8 21:13:21 | 显示全部楼层
这个例子碰撞检测怎么实现呀

该用户从未签到

发表于 2009-5-9 10:54:08 | 显示全部楼层
检测的方式比较多,,流行的可以看看小车爬坡~~~~~

该用户从未签到

发表于 2009-5-12 20:29:23 | 显示全部楼层
我提个过分要求,想看代码。。。。不知道可不可以啊

该用户从未签到

发表于 2009-5-14 04:38:13 | 显示全部楼层
论坛以前的帖子上有相关代码,,你找找看~~~~~~~~

该用户从未签到

发表于 2009-7-30 10:10:59 | 显示全部楼层
错误:在主函数部分,tank和terrain两个osg::ref_ptr<>对象首先指向new操作符返回的堆对象;然后又使用osgDB::ReadFile进行初始化。
估计你的想法是首先申请存储空间,供ReadFile存放加载的对象。
这是不正确的,因为两处使用的都是“=”操作符、即使重载,由于右操作对象没有区别,不可能实现两种语义。

该用户从未签到

发表于 2009-7-30 10:20:36 | 显示全部楼层
另外,就事件处理对象而言,作为一个过程,其获得数据层(也就是附加的场景树中的信息)的方法只能是显示地传参么?!(你的示例是传递场景树中的位置变换节点)

该用户从未签到

发表于 2011-1-10 22:20:39 | 显示全部楼层
十分感谢,祝楼主新年快乐,事业进步

该用户从未签到

发表于 2011-5-8 16:26:47 | 显示全部楼层
JoeDirt/JoeDirt.flt
T72-tank/t72-tank_des.flt
这资源文件你有吗?有的话请上传下看看,3Q

该用户从未签到

发表于 2011-5-8 16:26:59 | 显示全部楼层
JoeDirt/JoeDirt.flt T72-tank/t72-tank_des.flt 这资源文件你有吗?有的话请上传下看看,3Q

该用户从未签到

发表于 2011-5-8 16:27:20 | 显示全部楼层
JoeDirt/JoeDirt.flt T72-tank/t72-tank_des.flt 这资源文件你有吗?有的话请上传下看看,3Q

该用户从未签到

发表于 2011-5-8 16:27:54 | 显示全部楼层
  1. JoeDirt/JoeDirt.flt  T72-tank/t72-tank_des.flt
复制代码
这资源文件你有吗?有的话请上传下看看,3Q

该用户从未签到

发表于 2011-5-8 16:29:00 | 显示全部楼层
JoeDirt/JoeDirt.flt  T72-tank/t72-tank_des.flt这资源文件你有吗?有的话请上传下看看,3Q

该用户从未签到

发表于 2011-5-12 13:59:44 | 显示全部楼层
实验成功了  好样的

该用户从未签到

发表于 2011-5-12 13:59:55 | 显示全部楼层
实验成功了  好样的

该用户从未签到

发表于 2011-5-16 19:54:48 | 显示全部楼层
学习,谢谢

该用户从未签到

发表于 2011-9-9 11:02:02 | 显示全部楼层
受教了,谢谢

该用户从未签到

发表于 2012-3-14 11:45:47 | 显示全部楼层
编译了一下,会出现这个错误:fatal error LNK1104: 无法打开文件“osgIntrospectiond.lib”
但是我在属性-链接器-输入-附加依赖项中没有看到osgIntrospectiond.lib这一项,我的安装目录“lib”下也没有osgIntrospectiond.lib这个文件
求教!
还显示一个对话框:无法启动程序 .../Response/Debug/Response.exe系统找不到指定的文件
请问一下楼主这是什么原因啊?初学者,请多关照!!

该用户从未签到

发表于 2012-3-15 09:25:45 | 显示全部楼层
osgIntrospection已经不是新版本OSG的核心库了,因此也不需要链接它,从依赖项中去除即可。此外请您以后另开新贴提问,不要在于此无关的帖子里回复,否则不会作回答

该用户从未签到

发表于 2012-11-5 17:24:00 | 显示全部楼层
xiaozhuzi5200 发表于 2012-3-14 11:45
编译了一下,会出现这个错误:fatal error LNK1104: 无法打开文件“osgIntrospectiond.lib”
但是我在属性 ...

有osgIntrospectiond.lib,不过是在附加命令行的最后一行最后一个
另求模型文件

该用户从未签到

发表于 2013-1-29 10:37:41 | 显示全部楼层
求JoeDirt.flt文件,谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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