#include "osgWidget.h"
//#include "MouseKeyEvent.h"
#include <QHBoxLayout>
#include <QMouseEvent>
#include <osg/LineWidth>
class UseEventHandler:public::osgGA::GUIEventHandler
{
public:
//handle函数,其中有两个极其重要的参数,
//一个是const osgGA::GUIEventAdapter,注意有不少人在写时少写了个const结果就不灵了,
//因为是虚函数,参数必须与父类中虚函数相应一致。该参数是用来识别各种事件类型的参数。
//第二个参数也很重要:osgGA::GUIActionAdapter,它是控制显示的参数,其实最重要的是它是Viewer的祖父类,由它可以得到viewer,在操作中有体现。
virtual bool handle(const osgGA::GUIEventAdapter &ea,osgGA::GUIActionAdapter &aa)
{
//将aa强制转换为viewer对象
osgViewer::Viewer *viewer=dynamic_cast<osgViewer::Viewer*>(&aa);
if (!viewer)//如果转换失败则直接退出
{
return false;
}
switch(ea.getEventType())//获取事件的类型,是键盘上的事件,还是鼠标上的事件以及鼠标单击,右击,双击等等。
{
case osgGA::GUIEventAdapter::KEYDOWN://键盘响应事件
if (ea.getKey()==0xFF51)
{
//首先获得场景中的数据,然后在获得Group,然后在获得Group的子节点,最后设置显示模式
viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(1);//按向左的方向键
//viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(0);
}
if (ea.getKey()==0xFF53)
{
viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(0);//按下向右的方向键
//viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(1);
}
break;
case osgGA::GUIEventAdapter::PUSH:
if (ea.getButton()==4)//表示按鼠标右键
{
viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(0);
//viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(0);
}
else if(ea.getButton() == 1)//left button
{
viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(1);
//viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(1);
}
break;
case osgGA::GUIEventAdapter::DOUBLECLICK://表示双击类型
if (ea.getButton()==1)//表示按鼠标左键
{
viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(1);
//viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(1);
}
break;
case osgGA::GUIEventAdapter::MOVE: //mouse move
{
//viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(0);
break;
}
default:
break;
}
return false;
}
};
osgWidget::osgWidget(osgViewer::ViewerBase::ThreadingModel threadingModel)
:QWidget()
{
setThreadingModel(threadingModel); //qt5 must single thread.else be crash
setKeyEventSetsDone(0);
m_viewer = new osgViewer::Viewer;
QHBoxLayout *mainLayout = new QHBoxLayout(this);
QWidget *mainWidget = getWidgetFromGraphicWinQt(createGraphicWindow(20, 20 ,640, 480), makeCoordinate());
mainLayout->addWidget(mainWidget);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(update()));
m_timer.start(10); //刷新(重绘)频率
}
osgWidget::~osgWidget()
{
}
osg::Geode *osgWidget::makeCoordinate()
{
//创建保存几何信息的对象
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
//创建四个顶点
osg::ref_ptr<osg::Vec3Array> vPoint = new osg::Vec3Array();
vPoint->push_back(osg::Vec3(300, 280, 200));
vPoint->push_back(osg::Vec3(200, 360, 0)); //1
vPoint->push_back(osg::Vec3(300, 280, 200));
vPoint->push_back(osg::Vec3(300, 200, 0)); //2
vPoint->push_back(osg::Vec3(300, 280, 200));
vPoint->push_back(osg::Vec3(400, 360, 0)); //3
vPoint->push_back(osg::Vec3(200, 360, 0));
vPoint->push_back(osg::Vec3(300, 200, 0)); //t-l
vPoint->push_back(osg::Vec3(200, 360, 0));
vPoint->push_back(osg::Vec3(400, 360, 0)); //t-r
vPoint->push_back(osg::Vec3(300, 200, 0));
vPoint->push_back(osg::Vec3(400, 360, 0)); //l-r
geom->setVertexArray(vPoint.get());
//为每个顶点指定一种颜色
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array();
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //坐标原点为蓝色
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //z blue
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //坐标原点为蓝色
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //z blue
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //坐标原点为蓝色
c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); //z blue
//如果没指定颜色则会变为黑色
geom->setColorArray(c.get());
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
//三个轴
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 2)); //Y
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 2, 2)); //Y
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 4, 2)); //Z
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 6, 2)); //Y
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 8, 2)); //Y
geom->addPrimitiveSet( new osg::DrawArrays(osg::PrimitiveSet::LINES, 10, 2)); //Z
osg::ref_ptr<osgText::Text> pTextOAuxis = new osgText::Text;
pTextOAuxis->setText(QString("O(300,280,200)").toStdWString().c_str());
pTextOAuxis->setFont("Fonts/simhei.ttf");
pTextOAuxis->setAxisAlignment(osgText::Text::SCREEN);
pTextOAuxis->setCharacterSize(10);
pTextOAuxis->setPosition(osg::Vec3(250, 280, 200));
osg::ref_ptr<osgText::Text> pTextAAuxis = new osgText::Text;
pTextAAuxis->setText(QString("A(200,360,0)").toStdWString().c_str());
pTextAAuxis->setFont("Fonts/simhei.ttf");
pTextAAuxis->setAxisAlignment(osgText::Text::SCREEN);
pTextAAuxis->setCharacterSize(10);
pTextAAuxis->setPosition(osg::Vec3(150, 360, 0));
osg::ref_ptr<osgText::Text> pTextBAuxis = new osgText::Text;
pTextBAuxis->setText(QString("B(300,200,0)").toStdWString().c_str());
pTextBAuxis->setFont("Fonts/simhei.ttf");
pTextBAuxis->setAxisAlignment(osgText::Text::SCREEN);
pTextBAuxis->setCharacterSize(10);
pTextBAuxis->setPosition(osg::Vec3(250, 200, 0));
osg::ref_ptr<osgText::Text> pTextCAuxis = new osgText::Text;
pTextCAuxis->setText(QString("C(400,360,0)").toStdWString().c_str());
pTextCAuxis->setFont("Fonts/simhei.ttf");
pTextCAuxis->setAxisAlignment(osgText::Text::SCREEN);
pTextCAuxis->setCharacterSize(10);
pTextCAuxis->setPosition(osg::Vec3(350, 360, 0));
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
geode->getOrCreateStateSet()->setAttribute(new osg::LineWidth(3.0), osg::StateAttribute::ON);
//geode->addDrawable(pShapeDrawable.get());
geode->addDrawable(geom.get());
geode->addDrawable(pTextOAuxis.get());
geode->addDrawable(pTextAAuxis.get());
geode->addDrawable(pTextBAuxis.get());
geode->addDrawable(pTextCAuxis
osgWidget2.rar_osg Qt_qt osg_qt+OSG_qt结合osg_qt键盘事件
版权申诉
5星 · 超过95%的资源 3 浏览量
2022-07-15
00:05:34
上传
评论
收藏 9KB RAR 举报
小波思基
- 粉丝: 70
- 资源: 1万+
最新资源
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
- multiled.zip
- 基于php实现的哈希算法的人脸检索
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论1