osg中使用MatrixTransform来实现模型的平移/旋转/缩放

osg中使用MatrixTransform来实现模型的平移/旋转/缩放

转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html#undefined

MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象。

通过设置其矩阵,来实现其下子节点的模型变换。

-- 用局部坐标系来理解(局部坐标系又称惯性坐标系,其与模型的相对位置在变换的过程中始终不变)

如下代码:

// 创建圆柱体
double r = 0.5;
double h = 3.0;
osg::Vec3 orginPt(0.0, 0.0, 0.0);
osg::ref_ptr<osg::Geode> cylinderGeode = new osg::Geode;
osg::ref_ptr<osg::Cylinder> geoCylinder = new osg::Cylinder(orginPt, r, h);
osg::ref_ptr<osg::ShapeDrawable> cylinderDrawable = new osg::ShapeDrawable(geoCylinder.get());
cylinderDrawable->setColor(osg::Vec4(1.0f,0.0f,0.0f,1.0f));
cylinderGeode->addDrawable(cylinderDrawable.get());

// -- 以下操作都是针对局部坐标系而言 --
// 先将圆柱体平移(20.0, -12.0, -35.0)
// 再将z轴方向旋转至向量n方向  此时局部坐标系的z轴和n向量一致
// 接着,将旋转后的模型的沿z方向平移0.5*h长度 (全局坐标系,相当于沿n方向平移0.5*h长度)
// 最后将模型放大2倍
osg::Vec3 n(1.0, 1.0, -1.0);
osg::Vec3 z(0.0, 0.0, 1.0);
n.normalize();
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
mt->setMatrix(osg::Matrix::scale(osg::Vec3(2.0, 2.0, 2.0))*
             osg::Matrix::translate(osg::Vec3(0, 0, 0.5*h))*
        osg::Matrix::rotate(z, n)*
        osg::Matrix::translate(osg::Vec3(20.0, -12.0, -35.0)));
mt->addChild(cylinderGeode);

根据上面的特点,可以计算变化后的模型的三维坐标。

对于下图的包含关系(MatrixTransform A中包含一个MatrixTransform B,MatrixTransform B中包含一个模型)

那么,模型的新坐标 (X, Y, Z) = (x,y,z)* B.matrix * A.matrix;

时间: 2024-11-15 03:11:26

osg中使用MatrixTransform来实现模型的平移/旋转/缩放的相关文章

osg矩阵变换节点-----平移旋转缩放

osg矩阵变换节点-----平移旋转缩放 转自:http://www.cnblogs.com/ylwn817/articles/1973396.html 平移旋转缩放这个三个是osg矩阵操作中,最常见的操作,下面给出示例以及说明 首先先了解下osg空间方向: osg方向如左图所示,x轴表示屏幕水平方向,y轴表示和屏幕垂直方向即屏幕里面方向,z轴表示屏幕垂直方向,每个箭头指向表示正方向 下面来学习矩阵变换操作 首先平移: #include<osgDB/ReadFile> #include<

osg项目经验1&lt;MFC+OSG中模型点选效果&gt;

点选主要是重载osg的GUIEventHandler, 1 class CPickHandler : public osgGA::GUIEventHandler{ //自定义回调函数名:CPickHandler 2 osgViewer::Viewer * mViewer; //在这里定义要在重载函数里使用的变量 3 osg::Group * mGroup; 4 osg::Node * lastSelect; 5 osg::Node * replacedNode; 6 int replaceNum

OSG中的示例程序简介

OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.MatrixTransform.PositionAttitudeTransform等四种类型的节点上.二)演示了osgSim::OverlayNode

OSG使用更新回调来更改模型

OSG使用更新回调来更改模型 转自:http://blog.sina.com.cn/s/blog_668aae7801017gl7.html 使用回调类实现对场景图形节点的更新.本节将讲解如何使用回调来实现在每帧的更新遍历(update traversal)中进行节点的更新. 回调概览用户可以使用回调来实现与场景图形的交互.回调可以被理解成是一种用户自定义的函数,根据遍历方式的不同(更新update,拣选cull,绘制draw),回调函数将自动地执行.回调可以与个别的节点或者选定类型(及子类型)

OSG中相机参数的更改

[cpp] view plain copy #pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma comment(lib, "osgViewer.lib") #include  "osgViewer/Viewer" #include  "osgDB/ReadFile" #include  "osg/Nod

WPF中的MatrixTransform

原文:WPF中的MatrixTransform WPF中的MatrixTransform                                                                              周银辉 虽然在WPF中可以使用TranslateTransform.RotateTransform.ScaleTransform等进行几何变换,但我们也可以使用更底层的MatrixTransform(矩阵变换)来进行更复杂的复合变换. 首先我们矩阵如何影响

OSG中找到特定节点的方法(转)

OSG中找到特定节点的方法 为了在OSG中找到需要的节点并对节点做出相应的操作,可以从NodeVisitor类中继承一个类,NPS的教程 [download id="14"] 阐述了这个问题.下面是我写的一个类,找到指定名字.指定类型的节点: class findGeoNamedNode: public osg::NodeVisitor { public: findGeoNamedNode(); findGeoNamedNode(const std::string name): osg

OSG 中 相交测试 模块 工作流程及原理

主要涉及三个类: 1. osgUtil::PolytopeIntersector // 具体不同算法实现类 2. osgUtil::IntersectionVisitor //用来遍历节点树的每个节点 3.osg::Node * mNode;  //  你要做相交测试的根节点 先看用法: osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector(osgUtil::Inter

怎样在osg中动态的设置drawable的最近最远裁剪面

// draw callback that will tweak the far clipping plane just    // before rendering a drawable.    struct OverrideNearFarValuesCallback : public osg::Drawable::DrawCallback    {        OverrideNearFarValuesCallback(double radius)            : _radius