当前位置: 首页 > wzjs >正文

做什麽网站有前景视频优化软件

做什麽网站有前景,视频优化软件,东莞寮步网,ih5做的网站怎么上传在OpenSceneGraph (OSG) 中,事件处理是实现用户交互功能的重要部分。 通过自定义按键事件(如 WASD 键控制模型移动),可以让用户与场景进行互动。 osgGA::GUIEventHandler osgGA::GUIEventHandler 是 OpenSceneGraph (OSG) 中用…

在这里插入图片描述

OpenSceneGraph (OSG) 中,事件处理是实现用户交互功能的重要部分。

通过自定义按键事件(如 WASD 键控制模型移动),可以让用户与场景进行互动。

osgGA::GUIEventHandler

osgGA::GUIEventHandlerOpenSceneGraph (OSG) 中用于处理用户输入事件(如键盘、鼠标等)的一个基类。

通过继承 osgGA::GUIEventHandler 并重写其方法,可以实现自定义的事件处理逻辑,以便对用户的交互做出响应。

创建自定义事件处理器

OSG 提供了一个基类 osgGA::GUIEventHandler,可以用来自定义事件处理逻辑。

我们需要继承这个类,并重写其 handle() 方法。

#include <osgViewer/Viewer>
#include <osg/MatrixTransform>
#include <osgGA/GUIEventHandler>
#include <osg/PositionAttitudeTransform>// 自定义事件处理器
class CustomKeyboardHandler : public osgGA::GUIEventHandler {
public:CustomKeyboardHandler(osg::ref_ptr<osg::PositionAttitudeTransform> transform): _transform(transform), _moveSpeed(1.0f) {}// 重写 handle() 方法bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&) override {switch (ea.getEventType()) {case osgGA::GUIEventAdapter::KEYDOWN: {float delta = _moveSpeed; // 移动速度osg::Vec3d pos = _transform->getPosition(); // 获取当前模型位置switch (ea.getKey()) {case 'w': case 'W': // 向前移动pos.z() += delta;break;case 's': case 'S': // 向后移动pos.z() -= delta;break;case 'a': case 'A': // 向左移动pos.x() -= delta;break;case 'd': case 'D': // 向右移动pos.x() += delta;break;default:return false; // 未处理的按键}_transform->setPosition(pos); // 更新模型位置return true; // 表示事件已处理}default:return false; // 其他事件未处理}}private:osg::ref_ptr<osg::PositionAttitudeTransform> _transform; // 模型变换节点float _moveSpeed; // 移动速度
};

设置场景中的可移动模型

为了演示 WASD 控制,我们需要一个模型,并将其附加到 osg::PositionAttitudeTransform 节点上。

这个节点允许我们轻松地调整模型的位置和姿态。

osg::ref_ptr<osg::Node> createModel() {// 创建一个简单的几何体作为模型(例如立方体)osg::ref_ptr<osg::Geode> geode = new osg::Geode;geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0, 0, 0), 1.0f)));return geode.release();
}

整合事件处理器

将自定义事件处理器添加到 OSG 的视图器中,并运行程序。

int main() {// 创建视图器osgViewer::Viewer viewer;// 创建一个 PositionAttitudeTransform 节点用于控制模型位置osg::ref_ptr<osg::PositionAttitudeTransform> transform = new osg::PositionAttitudeTransform;transform->addChild(createModel()); // 将模型添加到变换节点// 将变换节点添加到场景根节点osg::ref_ptr<osg::Group> root = new osg::Group;root->addChild(transform);// 添加自定义事件处理器viewer.addEventHandler(new CustomKeyboardHandler(transform));// 设置场景数据viewer.setSceneData(root);// 运行视图器return viewer.run();
}

实战

我们来实现让我们的钢铁侠动起来的效果。

代码如下:

#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/MatrixTransform>
#include <osgViewer/Viewer>
#include <osgGA/GUIEventHandler>
#include <osgDB/ReadFile>
#include <iostream>
#include <cstdlib>// 自定义事件处理类
class KeyHandler : public osgGA::GUIEventHandler
{
public:KeyHandler(osg::MatrixTransform* transform) : _transform(transform) {}virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa){switch (ea.getEventType()){case osgGA::GUIEventAdapter::KEYDOWN:switch (ea.getKey()){case 'w':case 'W':// 向前移动translateNode(osg::Vec3(0.0f, 10.0f, 0.0f));return true;case 'a':case 'A':// 向左移动translateNode(osg::Vec3(-10.0f, 0.0f, 0.0f));return true;case 's':case 'S':// 向后移动translateNode(osg::Vec3(0.0f, -10.0f, 0.0f));return true;case 'd':case 'D':// 向右移动translateNode(osg::Vec3(10.0f, 0.0f, 0.0f));return true;default:break;}default:break;}return false;}private:void translateNode(const osg::Vec3& translation){// 获取当前矩阵osg::Matrix matrix = _transform->getMatrix();// 对矩阵进行平移操作matrix.preMultTranslate(translation);// 设置新的矩阵_transform->setMatrix(matrix);}osg::ref_ptr<osg::MatrixTransform> _transform;
};int main()
{// 创建Viewer对象osgViewer::Viewer viewer;// 创建一个MatrixTransform节点osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform;// 加载模型(支持.osg/.obj格式)osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../IronMan.osg");  // 替换为你的模型路径// 检查模型是否加载成功if (!model) {std::cerr << "模型加载失败!请检查路径和格式。" << std::endl;return 1;}// 将几何体添加到MatrixTransform节点transform->addChild(model);// 创建场景图的根节点osg::ref_ptr<osg::Group> root = new osg::Group;root->addChild(transform);// 设置场景数据viewer.setSceneData(root);// 创建自定义事件处理程序并添加到Viewerviewer.addEventHandler(new KeyHandler(transform));// 运行Viewerreturn viewer.run();
}

运行效果

在这里插入图片描述
距离做游戏又进了一步。_

在这里插入图片描述

http://www.dtcms.com/wzjs/425020.html

相关文章:

  • 公司销售网站怎么做朝阳区seo
  • 黑河最新消息今天网站seo入门基础教程书籍
  • 百度网站推广优化工具商业软文代写
  • 云南网站建设定做上海百度竞价托管
  • 珠海建站联系方式kol营销
  • 济南网站建设服务企业网站设计素材
  • 什么网站可以兼职做效果图百度网盘搜索神器
  • 太仓做网站自动seo优化
  • 高端网站建设要友情链接怎么弄
  • 想在网站上放百度广告怎么做指定关键词seo报价
  • wordpress日期网络推广seo公司
  • 做网站潜江公司网络推广该怎么做
  • 有没有兼职做设计的网站智推教育seo课程
  • 电商网站统计怎么做线上营销活动方案
  • 乐达网站建设公司免费个人网站申请
  • c2c网站的功能代发新闻稿最大平台
  • 广告网站怎么做深圳招聘网络推广
  • 哪里有网站制作平台免费注册网站有哪些
  • 商丘做微信网站sqwyy南阳seo优化
  • 河南网站建站系统平台旅游网络营销的渠道有哪些
  • 网站建设石家庄网络推广培训班
  • 网站备案的域名加不加www外链吧官网
  • 使用wordpress做网站知识付费小程序搭建
  • 芜湖酒店网站建设怎么做网络营销推广啊
  • 白家乐网站怎么建站站长之家官网入口
  • 网站地图页面模板查关键词排名软件
  • 迪奥官网网站做的好吗怎样注册自己的网站
  • 广州黄埔网站制作西安百度推广公司
  • 响水做网站2021百度新算法优化
  • 徐州做网站的av手机在线精品