OSG学習ノート5—スイッチノードを使用
1782 ワード
//osg_4_23.cpp:コンソールアプリケーションのエントリポイントを定義します.
//スイッチノードの使用
//スイッチノードの使い方、およびスイッチノードの更新コールバックを使用して動的サブノード切替プロセスを完了しました.
//合わせて2回切り替え、1回120フレーム、1回240フレームの場合
//ノードの実装について:あるサブノードが対するスイッチ値を判断し、スイッチ値がfalseの場合、そのaccept()関数は実行されないので、そのサブノードとそのサブツリーもアクセサによって遍歴されない.
//そうでなければ正常なアクセサ推進操作を実行する
//スイッチノードの使用
//スイッチノードの使い方、およびスイッチノードの更新コールバックを使用して動的サブノード切替プロセスを完了しました.
//合わせて2回切り替え、1回120フレーム、1回240フレームの場合
//ノードの実装について:あるサブノードが対するスイッチ値を判断し、スイッチ値がfalseの場合、そのaccept()関数は実行されないので、そのサブノードとそのサブツリーもアクセサによって遍歴されない.
//そうでなければ正常なアクセサ推進操作を実行する
#include "stdafx.h"
#include<osg/Switch>
#include<osgDB/ReadFile>
#include<osgViewer/Viewer>
class CessnaCallback :public osg::NodeCallback// ,
{
public:
static const int _fireStartFrame = 120;// 120
static const int _fireStartFrame1 = 240;// 240
virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)//
{
osg::Switch* cessnaSwitch = dynamic_cast<osg::Switch*>(node);
if (cessnaSwitch && nv)
{
const osg::FrameStamp* frameStamp = nv->getFrameStamp();//
if (frameStamp)
{
if (_fireStartFrame < frameStamp->getFrameNumber())// 120 , setValue() 。
{
cessnaSwitch->setValue(0, false);
cessnaSwitch->setValue(1, true);
}
if (_fireStartFrame1 < frameStamp->getFrameNumber())// 240 , setValue() 。
{
cessnaSwitch->setValue(0, true);
cessnaSwitch->setValue(1,false);
}
}
}
traverse(node, nv);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
osg::ref_ptr<osg::Switch> root = new osg::Switch;
root->addChild(osgDB::readNodeFile("cessna.osg"), true);// , , true
root->addChild(osgDB::readNodeFile("cessnafire.osg"), false);
root->setUpdateCallback(new CessnaCallback);
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
return viewer.run();
}