Prout 发表于 2009-3-18 22:24:24

模型运动控制

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

class UseEventHandler : public osgGA::GUIEventHandler
{
public:
        UseEventHandler(osg::MatrixTransform* tankPosistion)
        {
                trans=tankPosistion;
                trans->setMatrix(osg::Matrix::translate(0,0,7));
                m_tankPosistion=osg::Vec3(0,0,7);
                tankSpeed=0.2;
                m_fAngle=0;

                btnUP=false;
                btnDOWN=false;
                btnLEFT=false;
                btnRIGHT=false;
        }
        virtual bool handle(const osgGA::GUIEventAdapter & ea,osgGA::GUIActionAdapter & aa)
        {
                switch (ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        {
                                if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
                                {
                                        btnUP=true;
                                        return true;
                                }
                                if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
                                {
                                        btnDOWN=true;
                                        return true;
                                }
                                if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
                                {
                                        btnLEFT=true;
                                        return true;
                                }

                                if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
                                {
                                        btnRIGHT=true;
                                        return true;
                                }
                                return false;
                case osgGA::GUIEventAdapter::KEYUP:
                                if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
                                {
                                        btnUP=false;
                                        return true;
                                }
                                if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
                                {

                                        btnDOWN=false;
                                        return true;
                                }
                                if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
                                {
                                        btnLEFT=false;
                                        return true;
                                }

                                if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
                                {
                                        btnRIGHT=false;
                                        return true;
                                }               
                        }
                        break;
                default:
                        break;
                }
                if (btnUP)
                {
                        m_tankPosistion+=osg::Vec3(tankSpeed*cosf(osg::DegreesToRadians(m_fAngle+90)),tankSpeed*sinf(osg::DegreesToRadians(m_fAngle+90)),0);

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

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

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

                if (btnLEFT) //A
                {
                        m_fAngle += 1 ;

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

                        return true;
                }

                if (btnRIGHT)//D
                {

                        m_fAngle -= 1 ;

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

                        return true;
                }
                return false;
        }
private:
        float tankSpeed;
        osg::MatrixTransform* trans;
        osg::Vec3 m_tankPosistion;
        float m_fAngle;
private:
        bool btnUP;
        bool btnDOWN;
        bool btnLEFT;
        bool btnRIGHT;
};

void main()
{
        osgViewer::Viewer viewer;

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

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

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

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

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

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

        trans->addChild(tank);
        root->addChild(trans);
        root->addChild(terrain);

        viewer.setSceneData(root.get());
        viewer.addEventHandler(new UseEventHandler(trans));
        viewer.realize();
        viewer.run();
}

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

xb9 发表于 2011-3-8 22:28:45

嗯,编译运行了一下,要是加碰撞检测就好了

array 发表于 2009-3-18 22:30:45

Good~~~~强烈支持!!:)

mengxk 发表于 2009-3-19 15:10:56

写的挺好,呵呵

myqiang_0 发表于 2009-4-2 11:29:42

呵呵 写的不错!我想以我的水平最简单的也就是这么写!

swq0553 发表于 2009-4-14 10:15:05

可是这样坦克会钻入地下

FlySky 发表于 2009-4-14 10:59:47

碰撞检测一下就好了~~~~

philips123 发表于 2009-4-22 15:20:25

支持一下,我也想上传我的代码
容我再学习学习
哈哈哈~~~
:lol :lol :lol

back 发表于 2009-4-23 10:35:54

支持一下

ghczhaolei 发表于 2009-4-29 08:48:32

加油:victory:

fire 发表于 2009-5-8 21:13:21

这个例子碰撞检测怎么实现呀

FlySky 发表于 2009-5-9 10:54:08

检测的方式比较多,,流行的可以看看小车爬坡~~~~~

fire 发表于 2009-5-12 20:29:23

我提个过分要求,想看代码。。。。不知道可不可以啊

FlySky 发表于 2009-5-14 04:38:13

论坛以前的帖子上有相关代码,,你找找看~~~~~~~~

citihome 发表于 2009-7-30 10:10:59

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

citihome 发表于 2009-7-30 10:20:36

另外,就事件处理对象而言,作为一个过程,其获得数据层(也就是附加的场景树中的信息)的方法只能是显示地传参么?!(你的示例是传递场景树中的位置变换节点)

zlulu2006 发表于 2011-1-10 22:20:39

十分感谢,祝楼主新年快乐,事业进步

yxjau 发表于 2011-5-8 16:26:47

JoeDirt/JoeDirt.flt
T72-tank/t72-tank_des.flt
这资源文件你有吗?有的话请上传下看看,3Q

yxjau 发表于 2011-5-8 16:26:59

JoeDirt/JoeDirt.flt T72-tank/t72-tank_des.flt 这资源文件你有吗?有的话请上传下看看,3Q

yxjau 发表于 2011-5-8 16:27:20

JoeDirt/JoeDirt.flt T72-tank/t72-tank_des.flt 这资源文件你有吗?有的话请上传下看看,3Q

yxjau 发表于 2011-5-8 16:27:54

JoeDirt/JoeDirt.fltT72-tank/t72-tank_des.flt这资源文件你有吗?有的话请上传下看看,3Q

yxjau 发表于 2011-5-8 16:29:00

JoeDirt/JoeDirt.fltT72-tank/t72-tank_des.flt这资源文件你有吗?有的话请上传下看看,3Q

chinaiam 发表于 2011-5-12 13:59:44

实验成功了好样的

chinaiam 发表于 2011-5-12 13:59:55

实验成功了好样的

player111 发表于 2011-5-16 19:54:48

学习,谢谢

Hadse 发表于 2011-9-9 11:02:02

受教了,谢谢

xiaozhuzi5200 发表于 2012-3-14 11:45:47

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

array 发表于 2012-3-15 09:25:45

osgIntrospection已经不是新版本OSG的核心库了,因此也不需要链接它,从依赖项中去除即可。此外请您以后另开新贴提问,不要在于此无关的帖子里回复,否则不会作回答

hjqh 发表于 2012-11-5 17:24:00

xiaozhuzi5200 发表于 2012-3-14 11:45 static/image/common/back.gif
编译了一下,会出现这个错误:fatal error LNK1104: 无法打开文件“osgIntrospectiond.lib”
但是我在属性 ...

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

iceelvin 发表于 2013-1-29 10:37:41

求JoeDirt.flt文件,谢谢楼主
页: [1] 2
查看完整版本: 模型运动控制