第7讲 矩阵(上)

Matrix-Trans
osgManipulator::AntiSquish
osg::MatrixTransform
osgManipulator::Selection
osgWidget::Window
osg::Transform
osg::AutoTransform
osg::Camera
osg::CameraView
osg::PostitionAttitudeTransform

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;
}

以上代码图解

计算矩阵
Node-流程
Matrix::translate
glider
MatrixTransform
Group
类名说明
Matrix几何类
MatrixTransform节点类

Run函数 - 动画

  1. 动画 = 每一帧都是不同的

  2. 现有Viewer::Run()函数
    Frame = 1.更新 2.绘制 如下

    Callback过程
    Viewer::Run
    Callback
    Updata
    Frame
    Draw
  3. 回调函数

osg::Node
osg::NodeCallBack
osg::AnimationPathCallBack
osgGA::GUIEventHandler
ScreeCaptureHandler
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() – 是会刷掉本层矩阵的,但是对于下层矩阵没影响

NODE
param-矩阵
param-动画
setUpdateCallback
setMatrix
addChild
Geode
MatrixTransform1
MatrixTransform0
Matrix::translate 10.f ,0.f,0.f
AnimationPathCallback 10.f ,0.f,0.f,Z_AXIS
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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值