模型运动控制
刚刚接触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 编辑 ] 嗯,编译运行了一下,要是加碰撞检测就好了 Good~~~~强烈支持!!:) 写的挺好,呵呵 呵呵 写的不错!我想以我的水平最简单的也就是这么写! 可是这样坦克会钻入地下 碰撞检测一下就好了~~~~ 支持一下,我也想上传我的代码
容我再学习学习
哈哈哈~~~
:lol :lol :lol 支持一下 加油:victory: 这个例子碰撞检测怎么实现呀 检测的方式比较多,,流行的可以看看小车爬坡~~~~~ 我提个过分要求,想看代码。。。。不知道可不可以啊 论坛以前的帖子上有相关代码,,你找找看~~~~~~~~ 错误:在主函数部分,tank和terrain两个osg::ref_ptr<>对象首先指向new操作符返回的堆对象;然后又使用osgDB::ReadFile进行初始化。
估计你的想法是首先申请存储空间,供ReadFile存放加载的对象。
这是不正确的,因为两处使用的都是“=”操作符、即使重载,由于右操作对象没有区别,不可能实现两种语义。 另外,就事件处理对象而言,作为一个过程,其获得数据层(也就是附加的场景树中的信息)的方法只能是显示地传参么?!(你的示例是传递场景树中的位置变换节点) 十分感谢,祝楼主新年快乐,事业进步 JoeDirt/JoeDirt.flt
T72-tank/t72-tank_des.flt
这资源文件你有吗?有的话请上传下看看,3Q JoeDirt/JoeDirt.flt T72-tank/t72-tank_des.flt 这资源文件你有吗?有的话请上传下看看,3Q JoeDirt/JoeDirt.flt T72-tank/t72-tank_des.flt 这资源文件你有吗?有的话请上传下看看,3Q JoeDirt/JoeDirt.fltT72-tank/t72-tank_des.flt这资源文件你有吗?有的话请上传下看看,3Q JoeDirt/JoeDirt.fltT72-tank/t72-tank_des.flt这资源文件你有吗?有的话请上传下看看,3Q 实验成功了好样的 实验成功了好样的 学习,谢谢 受教了,谢谢 编译了一下,会出现这个错误:fatal error LNK1104: 无法打开文件“osgIntrospectiond.lib”
但是我在属性-链接器-输入-附加依赖项中没有看到osgIntrospectiond.lib这一项,我的安装目录“lib”下也没有osgIntrospectiond.lib这个文件
求教!
还显示一个对话框:无法启动程序 .../Response/Debug/Response.exe系统找不到指定的文件
请问一下楼主这是什么原因啊?初学者,请多关照!! osgIntrospection已经不是新版本OSG的核心库了,因此也不需要链接它,从依赖项中去除即可。此外请您以后另开新贴提问,不要在于此无关的帖子里回复,否则不会作回答 xiaozhuzi5200 发表于 2012-3-14 11:45 static/image/common/back.gif
编译了一下,会出现这个错误:fatal error LNK1104: 无法打开文件“osgIntrospectiond.lib”
但是我在属性 ...
有osgIntrospectiond.lib,不过是在附加命令行的最后一行最后一个
另求模型文件 求JoeDirt.flt文件,谢谢楼主
页:
[1]
2