三、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