|
刚刚接触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 编辑 ] |
|