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节点。
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(); }
相关文章推荐
- CodeIgniter3视频教程
- LightOJ 1422 Halloween Costumes (区间dp)
- CodeForces 552D-Vanya and Triangles【计算整数三点能否组成三角形】
- Codeforces 527B. Error Correct System【字符串】
- 学习进度表
- PerformanceCounter 基本介绍以及示例方法
- 第八周、第九周学习总结
- 第八周、第九周学习总结
- 第八周----补
- java怎么循环遍历ArrayList
- csv转Libsvm格式
- 实验二 作业调度模拟程序
- [翻译]现代java开发指南 第一部分
- com.google.android.xts.devicepolicy.DeviceOwnerTest#testFactoryResetProtection fail
- Android Studio、Java安装及环境变量配置
- Android按照拼音排序获取联系人并根据拼音首字母获取联系人
- Encoding
- Qt设计用户界面的三种方法
- 【BZOJ2152】聪明的可可 树的点分治
- HDU 4920 Matrix multiplication(矩阵相乘)