osg的回调有两种回调方式:更新回调和人机交互事件回调。前者是在场景渲染每一帧的时候调用,后者是由用户交互事件触发。
osg更新回调继承类osg::NodeCallback,是通过回调可以控制每帧运行过程中的行为。通过函数
void addCullCallback (NodeCallback *nc)
设置回调对象。
通过回调实现一个动画效果:
定义回调函数:
#pragma once
#include "osgInc.h"
class MyUpdateCallBack :public osg::NodeCallback {
public:
MyUpdateCallBack();
~MyUpdateCallBack();
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)override;
private:
double _angle = 0.0;
};
#include "MyUpdateCallBack.h"
#include <stdio.h>
MyUpdateCallBack::MyUpdateCallBack() {
}
MyUpdateCallBack::~MyUpdateCallBack() {
}
void MyUpdateCallBack::operator()(osg::Node* node, osg::NodeVisitor* nv) {
osg::ref_ptr<osg::PositionAttitudeTransform> root = dynamic_cast<osg::PositionAttitudeTransform*>(node);
if (root != nullptr){
osg::Vec3 vec3;
double angle;
osg::Quat q(osg::DegreesToRadians(_angle), osg::Z_AXIS);
root->setAttitude(q);
_angle += 0.5;
}
traverse(node, nv);
}
调用:
void createCallback() {
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("cow.osg");
osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;
pat->addChild(cowNode);
root->addChild(pat);
pat->addUpdateCallback(new MyUpdateCallBack());
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->addEventHandler(new osgViewer::WindowSizeHandler());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
}
aaa