您的位置:首页 > 其它

OSG学习笔记4—使用空间变换节点

2016-04-21 20:14 435 查看
世界坐标系是系统的绝对坐标系,在没有建立用户坐标系之前,所有的坐标都是以该坐标的原点来确定各自的位置的。

OSG中的坐标系是X正向向右,Y轴正向向里,Z轴正向向上

OpenGL的坐标系是X正向向右,Y轴正向向上,Z轴正向向外

// osgStudy4_21(1).cpp : 定义控制台应用程序的入口点。

//使用空间变换节点

//1、根据用户视点自动进行变换的AutoTransform节点

//2、直接使用变换矩阵进行变换的MatrixTransform节点

//3、使用位移、旋转和缩放值进行变换的PositionAttitudeTransform节点。

#include "stdafx.h"
#include<osg/AutoTransform>
#include<osg/MatrixTransform>
#include<osg/PositionAttitudeTransform>
#include<osgDB/ReadFile>
#include<osgViewer/Viewer>

//创建自动变换节点对象,使其始终面对屏幕,用户视点。
//第一个参数是沿X轴方向的平移距离,第二个参数是要变换的模型
//Transform公有继承Group类,AutoTransform公有继承Transform
osg::Transform* createAutoTransform(double posX, osg::Node* model){
<span style="white-space:pre">	</span>osg::ref_ptr<osg::AutoTransform> at = new osg::AutoTransform;//定义一个自动变换节点对象的智能指针
<span style="white-space:pre">	</span>at->setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN);//设置自动旋转模式为转向屏幕
<span style="white-space:pre">	</span>at->setPosition(osg::Vec3(posX,0.0,0.0));
<span style="white-space:pre">	</span>at->addChild(model);//使用的是Group类里的方法,添加子类,其实就是把这个定义的自动变换节点指针作用于model
<span style="white-space:pre">	</span>return at.release();//将对象的实例输出
}
//创建空间变换矩阵节点对象,并使其沿Z轴逆时针旋转45°
//第一个参数是沿X轴方向的平移距离,第二个是沿Z轴旋转的角度,第三个是要变换的模型
osg::Transform* creatMatrixTransform(double posX,double rotateZ,osg::Node* model){
<span style="white-space:pre">	</span>osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
<span style="white-space:pre">	</span>//遵循SRT原则,先旋转,再平移
<span style="white-space:pre">	</span>mt->setMatrix(osg::Matrix::rotate(rotateZ, osg::Z_AXIS)*osg::Matrix::translate(posX, 0.0, 0.0));
<span style="white-space:pre">	</span>mt->addChild(model);
<span style="white-space:pre">	</span>return mt.release();
}
//创建位置姿态节点对象,并使其沿Z轴顺时针旋转45°
osg::Transform* creatPositionAttitudeTransform(double posX, double rotateZ, osg::Node* model){
<span style="white-space:pre">	</span>osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;
<span style="white-space:pre">	</span>pat->setPosition(osg::Vec3(posX,0.0,0.0));//设置平移距离
<span style="white-space:pre">	</span>pat->setAttitude(osg::Quat(rotateZ,osg::Z_AXIS));//设置旋转角度的四元数
<span style="white-space:pre">	</span>pat->addChild(model);
<span style="white-space:pre">	</span>return  pat.release();
}

int _tmain(int argc, char** argv)
{
<span style="white-space:pre">	</span>osg::ArgumentParser arguments(&argc, argv);
<span style="white-space:pre">	</span>osg::Node* model = osgDB::readNodeFiles(arguments);
<span style="white-space:pre">	</span>if (!model) model = osgDB::readNodeFile("axes.osgt");

<span style="white-space:pre">	</span>//将三个节点加入到场景根节点中,同时它们的子节点均为一个预设的模型节点model,实现场景中叶子节点共享。
<span style="white-space:pre">	</span>osg::ref_ptr<osg::Group> root = new osg::Group;//建立组节点
<span style="white-space:pre">	</span>root->addChild(createAutoTransform(0.0, model));
<span style="white-space:pre">	</span>root->addChild(creatMatrixTransform(-5.0, osg::PI_4, model));//添加子节点,旋转角度正为逆时针,负为顺时针。
//<span style="white-space:pre">	</span>root->addChild(model);
<span style="white-space:pre">	</span>root->addChild(creatPositionAttitudeTransform(5.0, -osg::PI_4, model));

<span style="white-space:pre">	</span>osgViewer::Viewer viewer;
<span style="white-space:pre">	</span>viewer.setSceneData(root.get());
<span style="white-space:pre">	</span>return viewer.run();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: