Matrix 就是普通的计算类, 不支持ref_ptr
二 使用MatrixTransform
#define PAI 3.1415926
osg::ref_ptr<osg::Node> CreateNode()
{
osg::Group* gr = new osg::Group;
osg::ref_ptr<osg::MatrixTransform> mat = new osg::MatrixTransform;
osg::ref_ptr<osg::Node> glide = osgDB::readNodeFile("glider.osg");
mat->addChild(glide.get());
mat->setMatrix(osg::Matrix::translate(5.,0.,0.));
gr->addChild(mat);
gr->addChild(glide);
return gr;
}
以上代码图解
类名 | 说明 |
---|---|
Matrix | 几何类 |
MatrixTransform | 节点类 |
Run函数 - 动画
-
动画 = 每一帧都是不同的
-
现有Viewer::Run()函数
Frame = 1.更新 2.绘制 如下 -
回调函数
osg::ref_ptr<osg::MatrixTransform> mat = new osg::MatrixTransform;
mat->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3(50,0,0),osg::Z_AXIS, osg::DegreesToRadians(20.f)));
解释:
1.一个初始位置在原点的物品,绕着x=50点转(Z轴)
2.如果需要一个物体先放在x=50点, 再绕着x=50点转,必须使用两个MatrixTransform
3.重点理解: setUpdateCallBack() – 是会刷掉本层矩阵的,但是对于下层矩阵没影响
osg::ref_ptr<osg::Node> CreateGlider()
{
osg::Group* gr = new osg::Group;
osg::ref_ptr<osg::MatrixTransform> mat0 = new osg::MatrixTransform;
osg::ref_ptr<osg::MatrixTransform> mat1 = new osg::MatrixTransform;
osg::ref_ptr<osg::Node> glide = osgDB::readNodeFile("glider.osg");
gr->addChild(glide);
gr->addChild(mat0);
mat0->addChild(mat1);
mat0->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3(10,0,0),osg::Z_AXIS, osg::DegreesToRadians(20.f)));
mat1->setMatrix(osg::Matrix::translate(10.f,0,0));
mat1->addChild(glide);
return gr;
}
int _tmain(int argc, _TCHAR* argv[])
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osg::ref_ptr<osg::Node> node = CreateGlider();//CreateColumn();
viewer->setSceneData(node.get());
osg::ref_ptr<osgViewer::WindowSizeHandler> handler = new osgViewer::WindowSizeHandler;
handler->setKeyEventToggleFullscreen (osgGA::GUIEventAdapter::KEY_E );
viewer->addEventHandler(handler);
return viewer->run();
}