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

三、OSG学习笔记-应用基础

前一章节:二、OSG学习笔记-入门开发-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145513874

一、

OsgGA: 界面事件处理空间,处理操作各种操作器的最大名字空间;

GUIEventHandler: ui 事件操作类

注意:在启用事件类自定义时,我的Win10专业版出现一个键盘输入系统兼容的问题;

OSG Viewer输入按键无响应

1 问题描述

操作系统:Windows 10 专业版

输入法:微软拼音输入法

现象:在PowerShell执行osgviewer.exe glider.osg后,能正常显示图像,但输入s(显示帧率)或f(切换全屏或窗口)等按键后无响应。

2 解决方案

右键点击任务栏右下角输入法图标,点击设置-常规,在兼容性一栏中启用使用以前版本的微软拼音输入法。

二、

代码:CuiQingCheng/OsgStudy - Gitee.com

1、计时器的用法

osg::Timer

2、自定义ui事件

3、帮助事件

4、路径记录事件器

#include<windows.h>
#include<osg/Node>
#include<osgViewer/Viewer>
#include<osgViewer/ViewerEventHandlers>
#include<osgDB/ReadFile>
#include <osgGA/TrackballManipulator>

// 事件响应类
class MyPrint :public osgGA::GUIEventHandler
{
public:
    void getUsage(osg::ApplicationUsage& usage) const override {
        usage.addKeyboardMouseBinding("cc", "11111111");
    }
    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override {
        
        if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN)
        {
            int itc = static_cast<int>('c');
            int iK = ea.getKey();
            if (ea.getKey() == 'c') {
                // 这里添加你想要执行的操作,例如打印信息
                std::cout << "Key c is pressed" << std::endl;
                return true; // 表示事件已处理
            }
        }
        return false; // 表示未处理该事件,将继续传递给其他处理器
    }
};

int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    viewer->setUpViewInWindow(100, 100, 1500, 1200);
    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("glider.osg");

    // 获取控制器
    osgGA::CameraManipulator* manipulator = viewer->getCameraManipulator();
    if (!manipulator) {
        std::cout << "No manipulator set!" << std::endl;
        // 设置默认操作器
        viewer->setCameraManipulator(new osgGA::TrackballManipulator);
    }
    else {
        std::cout << "Manipulator: " << manipulator->className() << std::endl;
    }

    osg::Timer_t start_time = 0;
    osg::Timer_t end_time = 0;
    osg::Timer* timer = new osg::Timer;
    //得到一个tick值多少second;
    std::cout << timer->getSecondsPerTick() << std::endl;
    start_time = timer->tick();
    std::cout << "func1: read node file time:" << timer->time_s() << std::endl;
    end_time = timer->tick();
    std::cout << "func2: read node file time:" << timer->delta_s(start_time, end_time) << std::endl;

    // 获取场景中事件数量;
    const osgViewer::View::EventHandlers& handlers = viewer->getEventHandlers();
    std::cout << "Number of default event handlers: " << handlers.size() << std::endl;
    int i = 1;
    for (osg::ref_ptr<osgGA::EventHandler> pE:handlers)
    {
        std::cout << "Handler " << i << ": " << pE.get()->className()<< std::endl;
        ++i;
    }

    // 添加事件
    viewer->addEventHandler(new MyPrint);
    viewer->addEventHandler(new osgViewer::HelpHandler);

    // 路径记录功能,会在软件开发路径下默认存放一个文件 “saved_animation.path”
    viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);
    viewer->setSceneData(node.get());

    viewer->run();

    return 1;
}

运行起来程序,按下键盘小写‘z’,开启记录位置,然后开始拖动图元,再按下键盘大写‘Z’生成如下保存路径的文件

下次启动viewer,软件加载模型文件,并导入路径文件,模型中图元会按照事先保存的路径运动。

后一章节:四、OSG学习笔记-基础图元-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145514148


http://www.kler.cn/a/540208.html

相关文章:

  • BS架构(笔记整理)
  • 从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓
  • 继承(python)
  • PHP 运算符
  • Redis的数据过期策略和数据淘汰策略
  • Ai无限免费生成高质量ppt教程(deepseek+kimi)
  • 26~31.ppt
  • Linux性能优化实战,网络丢包问题分析
  • JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_log_stderr 函数
  • SOME/IP--协议英文原文讲解5
  • 对“云原生”的初印象
  • 一文了解服务端渲染及前端在服务端渲染上的应用
  • 快速提取Excel工作簿中所有工作表的名称?
  • docker启动报错code=exited, status=1/FAILURE——问题排查
  • 政安晨的AI大模型训练实践四:准备一个合适的模型微调,先试一下,比如:DeepSeek-R1-14B-Distill
  • JS逆向实战二:建筑平台js逆向Error: Malformed UTF-8 data报错处理
  • 深入学习日志及MVCC
  • BUUCTF_XSS-Lab
  • Sealos的k8s高可用集群搭建
  • Java面试题--设计模式
  • 2025嵌入式高频面试题解析
  • 示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)
  • Linux之Http协议分析以及cookie和session
  • 数据结构与算法之排序算法-插入排序
  • 【合集】Java进阶——Java深入学习的笔记汇总 amp; 再论面向对象、数据结构和算法、JVM底层、多线程