OSG人机交互

显示渲染-OSG框架解析 OSG框架解析 阅读详情

OSG人机交互

标签(空格分隔): OSG 键盘 鼠标 事件


Windows与OSG事件传递流程

OSG在Windows平台上的消息传递仍然遵守Windows的规则,底层调用的也仍然是Windows的API。OSG中真正处理事件的函数是handelNativeWindowingEvent,打开handelNativeWindowingEvent的定义可以发现待处理事件都是压入事件序列osgGA::EventQueue中。然后依次取出进行响应。

创建一个osg窗口

首先要解决的是如何使用OSG语句创建窗口以及在什么位置创建窗口。OSG定义了osg::GraphicsContext::Traits类来决定窗口大小、高宽等参数。通过将该类的一个对象传入到Windows注册窗口的函数中,定义OSG窗口的特征。

代码

#include <osgViewer/api/Win32/graphicswindowwin32>
int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
    traits->x = 250;
    traits->y = 250;
    traits->width = 800;
    traits->height = 600;
    traits->windowDecoration = true;
    traits->doubleBuffer = true;
    traits->sharedContext = 0;
    //执行注册窗口的操作,内部调用了registerdWindowClasses
    osgViewer::GraphicsWindowWin32* gw = (osgViewer::GraphicsWindowWin32*)
        osg::GraphicsContext::createGraphicsContext(traits);
    gw->realizeImplementation();

    int a;
    std::cin >> a;
    return 0;
}

结果为一片白色的windows窗口

键盘和鼠标事件

事件被加入到osgGA::EventQueue中后,最终由osgGA::GUIEventHandler类处理,因此程序中我们只要继承osgGA::GUIEventHandler类,重载handle函数就可以实现对事件的处理。
osgGA::GUIEventHandler实际是一个回调函数,在每一帧渲染当中,OSG会遍历所有的回调函数。
osgGA::GUIEventHandler中的handle函数为
bool handle(const GUIEventAdapter&,GUIActionAdapter&)
第一个参数为GUIEventAdapter对象,它是一个事件适配器,里面定义了所有与事件相关的变量,包括键盘码,鼠标状态等。hangle函数通过这个对象来判断当前要处理事件的类别并获得相关参数。
第二个参数GUIActionAdapter为一个独立的类,里面包含asView方法,且视口类View是它的子类,因此可以在viewer当中进行事件处理。
总的来说就是通过继承osgGA::GUIEventHandler类,在重载handle函数的第一个回调参数中判断当前的待处理事件类别,在第二个回调参数中获得当前事件发生的视口,然后进行事件处理。
添加事件处理流程是这样的:从osgGA::GUIEventHandler公有派生类A并实现handle函数,然后使用viewer类的addEventHandler将其加入到事件处理序列中。

代码

实现的功能是按下键盘上左键时物体向左旋转,按下键盘上右键时物体向右旋转。

#include <osgViewer/viewer>
#include <osgViewer/api/Win32/graphicswindowwin32>
#include <osgViewer/viewerEventHandlers>
#include <osgGA/StateSetManipulator>
#include <osgGA/GUIEventHandler>
#include <osgDB/readfile>
#include <osg/matrixtransform>
class RotateGlider : public osgGA::GUIEventHandler
{
public:
    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        osgViewer::Viewer* vw = dynamic_cast<osgViewer::Viewer*>(&aa);
        if (vw)
        {
            osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(vw->getSceneData());
            if (mt)
            {
                static float i = 0.1f;
                switch (ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                {
                    if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Left)
                    {
                        mt->setMatrix(osg::Matrix::rotate(i, osg::Vec3(0.f, 0.f, 1.f)));
                        i += 0.0f;
                    }
                    else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Right)
                    {
                        mt->setMatrix(osg::Matrix::rotate(i, osg::Vec3(0.f, 0.f, 1.f)));
                        i -= 0.1f;
                    }
                }
                    break;
                default:
                    break;
                }





            }
        }

        return false;
    }
};

int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    viewer->setUpViewOnSingleScreen();

    osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
    osg::ref_ptr<osg::Node> glider = osgDB::readNodeFile("glider.osg");
    mt->addChild(glider);
    viewer->setSceneData(mt);
    viewer->addEventHandler(new RotateGlider);
    return viewer->run();
}

效果

鼠标Pick点选物体

在OSG中,Pick并不是OSG的库函数,需要自己实现。在pick的时候有2个重要参数,即单击时屏幕坐标xy,及这个点发出的垂直于屏幕的射线与场景中物体的交点。判断射线与viewer中物体相交是通过构造鼠标单击的法线并计算法线和场景中物体的交点,通过osgView::View::computeIntersections解决交点计算问题。下面看具体代码

#pragma comment(lib,"osgFXd.lib")
#pragma comment(lib,"osgUtild.lib")

#include <osgFX\scribe>
#include <osgUtil\linesegmentintersector>

class PickHandle : public osgGA::GUIEventHandler
{
public:
    PickHandle(osgViewer::Viewer* viewer) :mviewer(viewer) {}
    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        switch (ea.getEventType())
        {
        case(osgGA::GUIEventAdapter::PUSH):
            if (ea.getButton() == 1)
            {
                Pick(ea.getX(), ea.getY());
            }
            return true;
        default:
            break;
        }
        return false;

    }

protected:
    void Pick(float x, float y)
    {
        std::multiset< osgUtil::LineSegmentIntersector::Intersection> inters;
        if (mviewer->computeIntersections(x,y, inters))
        {
            for (auto iter = inters.begin(); iter != inters.end(); ++iter)
            {
                if (!iter->nodePath.empty() && !iter->nodePath.back()->getName().empty())
                {
                    const osg::NodePath& np = iter->nodePath;
                    for (int i = np.size()-1; i >0;  --i)
                    {
                        osgFX::Scribe* sc = dynamic_cast<osgFX::Scribe*>(np[i]);
                        if (sc != nullptr)
                        {
                            if (sc->getNodeMask() != 0)
                            {
                                sc->setNodeMask(0);
                            }
                        }
                    }
                }
            }
        }
    }


private:
    osgViewer::Viewer* mviewer;
};

int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    viewer->setUpViewOnSingleScreen();

    osg::ref_ptr<osg::Group> root = new osg::Group;

    osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg");


    osg::ref_ptr<osgFX::Scribe> sc = new osgFX::Scribe();
    sc->addChild(cow);

    root->addChild(cow);
    root->addChild(osgDB::readNodeFile("cessna.osg"));
    root->addChild(sc);

    viewer->setSceneData(root);

    viewer->addEventHandler(new PickHandle(viewer));
    return viewer->run();
}

效果

(一)OSG初学者入门基础教程 Day01 1.打开VS,选择【新建】-【visual C++】-【win32】-【win32控制台应用程序】。 2.在解决资源方案管理器中, 右击【源文件】-【添加】-【新建项】 -【C++文件.cpp】 3右键项目,选择“属性”,选择“VC++目录”, 在包含目录添加:C:\OSG\include 在库目录添加:C:\OSG\lib. (以上两个目录... 阅读详情

相关推荐

OSG学习笔记3-使用回调实现旋转动画

这是有关节点的更新与事件回调,OSG中的节点主要是使用回调Callback来完成用户临时定义的,需要每帧执行的工作。 回调时一种用户编写的功能模块,它可以作为一个参数传递给其他功能模块,从而实现一些底层系统事件的响应和处理。C++使用函数指针将回调函数的地址作为其他系统或用户函数的传入参数。 OSG节点回调分类: 1、更新回调 Update Callback:每一帧系统遍历到当前节点时都会被

吃货敲代码 3608

osg开发配置与第一个osg程序

本文介绍开源图形库osg的开发环境配置和用VS2019编写第一个CMake osg程序的完整过程。这是一个教程,也是一个与各位图形从业者的交流平台.

Zhihui Tang的专栏 1万+

OSG学习笔记15-OSG中对事件的处理

看了王锐大大的书,我感觉OSG中对事件的处理主要是由以下几块组成的: 1、事件适配器 GUIEventAdapter 这个类是作为系统交互事件和OSG交互事件的适配接口。这一句话还不是很理解。 源码文档里对于这个类的定义是:事件类,存储键盘、鼠标和窗口事件。 公有类型包括: (这些类型都是枚举类型,每个类型中有若干整形常量) MouseButtonMask EventType :

吃货敲代码 3785

OSG入门教学

注意:因为设置了线宽,所以透明度并不明显,将线宽去掉,透明度更为明显,而且为了突出透明效果,加一个滑翔机模型辅助,注意渲染顺序,先加滑翔机,后加长方形。此时便会出现问题,运行后会发现,设置旋转的小飞机在“原点”围绕z轴旋转,旋转没有问题,但位置却不对,因为上一步已经将该飞机平移至(-1.5, 0.0, 1.5),此时平移效果没有了。此时运行项目,点击h后会出现文字信息,但却只有几行,这是因为osg在帮助事件的类中设置了相应显示文字的行数,可根据需要更改,这里。2.点击‘h’按键,显示文字,如下图。

qq_56913257的博客 3857

OSG开发笔记(一):OSG介绍、编译

需要用到三维立体变换、三维球体等三维开发,之前准备使用opengl,但是opengl较为底层,综合考量选型osg。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 8万+

SVM-支持向量机学习(1):线性可分SVM的基本型

1. foreword先看的是李航老师的书第7章,比较传统按照以下三节展开: 线性可分SVM 线性SVM 非线性SVM SMO算法 李航老师讲东西向来不拖泥带水,但本节也几乎用了40页的篇幅,足见涉及内容之多。7月底硬着头皮啃了下来,边看边在笔记上摘抄标注,花了2天时间对SVM有了基本认识。一个月过去了,如今重新整理为博客,再看轻松许多,并不断对比西瓜书的内容,启望达到融会贯通。西瓜书此节明显节奏轻

鸟恋旧林的博客 8681

OSG三维视景仿真技术开发详解(三)人机交互与动画控制

OSG三维视景仿真技术开发详解(三)人机交互与动画控制

YBAdiam的博客 1359

Mongodb操作与Java(四)MongoTemplate的使用

MongoTemplate的使用

A乐神的博客 3437

OSG学习笔记(二)人机交互

1.键盘事件响应 #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgViewer/api/Win32/GraphicsWindowWin32> #include <osgDB/ReadFile> #include <osgDB/...

LISA_SMITH的博客 579

【ros】ROS1的安装和相关使用方法

主要学习ros相关内容

Greary的博客 2379

RK3568 开发实战:手动构建 Linux 4.19 内核镜像与设备树优化

本文详细介绍了为RK3568开发板手动编译Linux 4.19内核的完整实战流程。从环境搭建、源码获取、内核配置,到设备树深度定制与优化,再到镜像打包与烧写,旨在帮助开发者脱离官方SDK依赖,实现对嵌入式Linux系统的完全掌控,提升硬件适配与性能优化能力。

weixin_29175469的博客 269

OSG学习:人机交互——普通键盘事件:着火的飞机

以下内容来自:  1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社  2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社 3、自己的总结 下载完整工程OSG_16_EventKey 创建C++项目后,首先需要配置OSG环境,具体步骤看OSG学习:WIN10系统下OSG+VS2017编译及运行第六步:新建...

韶光 1385

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(三)校园无线网络AC+AP配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 1361

OSG 之学习一:OSG 基础

文章目录说明1. 最简单的显示2. 添加人机交互状态3. 设置操作器4. osgViewer5. osgVersion6. osgArchive 数据归档器7. osgConv 格式转换与压缩 说明 ** OSG 入门看的,大佬绕道** 示例来源于《OSG程序设计教程》 没有此电子书的小伙伴们,我已上传至优快云 1. 最简单的显示 #include <osgDB/ReadFile&...

Neverland_LY‘s Domain 3424

AI使能的SVD算子:基于深度学习的矩阵分解方法

奇异值分解(Singular Value Decomposition, SVD)是线性代数中一种重要的矩阵分解方法,广泛应用于信号处理、数据降维、推荐系统等领域。传统SVD算法虽然精确,但在处理大规模矩阵时面临计算复杂度高、内存需求大等问题。本文提出了一种基于深度学习神经网络的SVD算子实现方法,完全摒弃传统数值算法,仅使用PyTorch框架构建的神经网络模型来完成大规模信道矩阵的SVD分解与还原。

huanghm88的专栏 1335

李宏毅2025《机器学习》第一讲-生成式AI:技术突破和未来发展

本文基于台湾大学李宏毅教授的“一堂课搞懂生成式人工智慧的技术突破与未来发展”课程内容,系统性地梳理了生成式AI的核心概念、技术原理、发展演进以及未来趋势。文章从AI的“行为”入手,通过生动的实例展示了其强大的生成与推理能力;进而深入剖析其底层运作机制,阐释了“万物皆为令牌(Token)”、自回归生成、Transformer架构等核心原理;接着,文章追溯了通用AI模型从“专才”到“通才”的演进历程;最后,探讨了如何通过微调(Fine-tuning)、模型编辑(Model Editing)等技术赋予AI新的能力

木鱼时刻的专栏 2295

OSG学习笔记9-处理键盘事件

//处理键盘事件 #include"stdafx.h" #include #include #include #include class KeyboardHandler :public osgGA::GUIEventHandler//人机交互事件处理器 { public: //重构父类GUIEventHandler.handle,事件处理函数,自定义交互操作, //参数1:当前传入此处

吃货敲代码 5465

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

osg多线程_osg小结

还有很多osg的功能没有涉及到。osg的人机交互osg动画osg读写机制osg的动态更新和裁剪osg的多线程渲染等等。。。由于这些功能不能简单到靠一个例子可以讲解明白,所以我打算把他们放到osg代码部分阐述。好,那做一下总结前几篇主要是介绍一些osg的基础功能,以及基础概念。对于很多大牛来说我都在'舞大刀'。有任何错误之处请大家指出。我们就进入下一阶段的osg学习记录。下一阶段:主要讲解osg是从...

weixin_36358383的博客 537

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

osg设置回调接口

osg的回调有两种回调方式:更新回调和人机交互事件回调。前者是在场景渲染每一帧的时候调用,后者是由用户交互事件触发。 osg更新回调继承类osg::NodeCallback,是通过回调可以控制每帧运行过程中的行为。通过函数 void addCullCallback (NodeCallback *nc) 设置回调对象。 通过回调实现一个动画效果: 定义回调函数: #pragma once #i...

wb175208的专栏 868

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OSG节点更新与事件回调

OSG节点更新与事件回调

danshiming的博客 2215

三维渲染引擎设计与实践(八)

8.2三维人机交互工具 osg实现了三维场景的漫游以及场景中三维对象的操纵。 8.2.1漫游器 osgGA::MatrixManipulator类 漫游器也是事件处理器GUIEventHandler的一种。 viewer使用setCameraManipulator()函数来设置一个针对此视景器的漫游器。 8.2.2拖拽器 为要操纵的物体设置一个MatrixTransform父...

weixin_30652271的博客 184

OSG 场景树

OSG(2):OSG 场景树一、概述二、场景树三、节点访问四、节点方法 以下内容转载自 https://blog.youkuaiyun.com/u013719339/article/details/80340849 一、概述 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OSG采用包围体层次(Bounding Volume Hierarchy, HVH)来实现场景图形

ayww的博客 1369

OpenSceneGraph三维渲染引擎设计与实践

OpenSceneGraph三维渲染引擎设计与实践 【下载地址】OpenSceneGraph三维渲染引擎设计与实践 《OpenSceneGraph三维渲染引擎设计与实践》是一本深入探讨开源高性能三维渲染引擎OSG的电子书。从基础知识到高级应用,本书系统地介绍了OSG的设计原理、使用方法和实践案例,涵盖场景组织、几何对象绘...

gitblog_06765的博客 796

osg键盘事件

OSG中键盘事件不响应的解决办法,按下键盘后鼠标事件也不响应了 1、换输入法为英文状态 2、(若1不行)换键盘为美式键盘

learner_pu的博客 795
上一篇: 汉字转拼音的c++实现
下一篇: OSG环境搭建与编译
洗洗睡去
博客等级 码龄19年 277粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值