OSG之位置变换节点

193 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天

1 概述

osg::Group类是OSG的组节点,它允许用户程序为其添加任意数量的子节点,子节点也可以继续分发子节点。osg::Group 作为一个基类,派生出了很多实用的节点类,如 osg::LOD、osg::Switch、osg::Transform、osg::PositionAttitudeTransform、osg::PagedLOD、osg::Impostor 和 osg::AutoTransform 等,后面的几节会对它们逐一进行介绍。

osg::Group 类是从 osg::Referenced 类派生出来的,在通常情况下,只有父节点引用了这个 Group 对象,所以当释放场景图的根节点时,会引发连锁的内存释放动作,这样就不会产生内存的泄露。

osg::Group类作为OSG的核心部分,可以使用户程序通过Group来有效地组织场景图中的数据。osg::Group类的强大之处在于管理子节点的接口,同时,osg::Group 类还从osg::Node类继承了用于管理父节点的接口,OSG允许节点有多个父节点。

2 位置变换节点

位置变换节点(osg::PositionAttitudeTransform)是一个位置变换节点,继承自 osg::Transform,主 要作用是提供模型的位置变换、大小缩放、原点位置的设置以及坐标系的变换。

osg::PositionAttitudeTransform 继承关系图如下图所示。 osg::PositionAttitudeTransform的常用主要成员函数如下:

2.png

void setPosition(const Vec3d&pos)//设置位置

const Vec3d&getPosition()const //得到位置

void setAttitude(const Quat&quat)//设置姿态,参数为四元数

const Quat&getAttitude()const //得到姿态

void setScale(const Vec3d&scale)//设置缩放

const Vec3d&getScale()const //得到缩放

void setPivotPoint(const Vec3d &pivot)//设置原点(自定义原点位置,一旦设置以后,所有变换均基于该原点)

const Vec3d& getPivotPoint () const//得到原点

3 位置变换节点示例

下面通过例子来讲解如何使用osg::PositionAttitudeTransform 节点,代码如程序清单所示。

#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/PositionAttitudeTransform>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>

#include "utility.h"

int main()
{
	// 创建Viewer对象,场景浏览器
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

	// 创建场景组根节点
	osg::ref_ptr<osg::Group> root = new osg::Group();

	// 创建一个节点,读取牛模型
	osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(GetCurrentPath() + "\\Data\\cow.osg");

	// 创建位置变换节点pat1
	osg::ref_ptr<osg::PositionAttitudeTransform> pat1 = new osg::PositionAttitudeTransform();
	pat1->setPosition(osg::Vec3(-10.0f, 0.0f, 0.0f));
	// 设置缩放,在X/Y/Z轴方向都缩小一倍
	pat1->setScale(osg::Vec3(0.5f, 0.5f, 0.5f));
	pat1->addChild(node);


	osg::ref_ptr<osg::PositionAttitudeTransform> pat2 = new osg::PositionAttitudeTransform();
	pat2->setPosition(osg::Vec3(10.0f, 0.0f, 0.0f));
	pat2->addChild(node);
	
	
	root->addChild(pat1.get());
	root->addChild(pat2.get());

	// 优化场景数据
	osgUtil::Optimizer optimizer;
	optimizer.optimize(root.get());

	// 设置窗口大小
	setWindowSize(viewer.get(), 600, 400, "PositionAttitudeTransform");

	// 设置场景数据
	viewer->setSceneData(root.get());
	// 初始化并创建窗口
	viewer->realize();
	// 开始渲染
	viewer->run();

	return 0;
}

效果图

3.PNG

动态图

1.gif

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天