【OSG学习笔记】Day 5: 坐标系与变换节点(Transform)
在前面的学习中,我们对 OpenSceneGraph(OSG)有了基础的认识。
今天,我们将深入探讨 OSG 中的坐标系和变换节点(Transform),并通过平移、旋转、缩放模型以及父子节点层级变换的实战操作,加深对这些概念的理解。
坐标系
1. 基础坐标系
在 OSG 里,使用的是右手坐标系。
右手坐标系遵循右手定则:伸出右手,让大拇指指向 X 轴正方向,食指指向 Y 轴正方向,那么中指所指的方向就是 Z 轴正方向。
了解这个坐标系对于理解模型的变换非常关键,因为所有的平移、旋转和缩放操作都是基于这个坐标系进行的。
2. 局部坐标系(Local Coordinate System)
又称模型坐标系(Model Coordinate System),是每个物体 / 模型自身固有的坐标系,其原点和轴向由建模时的定义决定。
原点:通常位于模型的几何中心、顶点或其他自定义位置(如机械零件的装配基准点)。
轴向:建模软件中默认的轴向(如 Blender 的 Z 轴向上,3ds Max 的 Y 轴向上),需根据引擎要求调整(如 OSG 默认使用右手坐标系,X 轴向右,Y 轴向上,Z 轴向屏幕外)。
3. 世界坐标系(World Coordinate System)
又称全局坐标系(Global Coordinate System),是场景中唯一的统一坐标系,用于确定所有物体的全局位置和方向。
原点:通常定义为场景的中心(如虚拟城市的原点设在广场中心),或根据需求自定义(如游戏场景的原点设在玩家出生点)。
轴向:遵循右手坐标系规则(如 OSG 中 X 轴向右,Y 轴向上,Z 轴向屏幕外),与局部坐标系保持一致以避免变换混乱。
基础变换实战
变换节点(osg::Transform)
变换节点是 OSG 中用于对模型进行平移、旋转和缩放等操作的重要节点类型。
最常用的变换节点是 osg::MatrixTransform
和osg::PositionAttitudeTransform
:
osg::PositionAttitudeTransform // 通过位置/姿态直接控制
osg::MatrixTransform // 通过矩阵直接控制
平移变换
平移是指在坐标系中沿着某个方向移动模型。
以下是一个简单的示例代码:
// PositionAttitudeTransform方式
// 创建可变换节点
osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform();
pat->setPosition(osg::Vec3(5.0f, 0.0f, 0.0f)); // X方向平移5个单位
`
// MatrixTransform方式
osg::ref_ptr<osg::MatrixTransform> transMT = new osg::MatrixTransform();
transMT->setMatrix(osg::Matrix::translate(5.0, 0.0, 0.0)); // 直接设置变换矩阵
旋转变换
旋转是指围绕某个轴旋转模型。
以下是一个简单的示例代码:
// PositionAttitudeTransform方式
// 创建可变换节点
osg::ref_ptr<osg::PositionAttitudeTransform> rotatePAT = new osg::PositionAttitudeTransform();
rotatePAT->setAttitude(osg::Quat(osg::DegreesToRadians(45.0), osg::Vec3d(0,0,1)));// MatrixTransform方式
sg::ref_ptr<osg::MatrixTransform> rotateMT = new osg::MatrixTransform();
rotateMT->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(45.0), osg::Vec3d(0,0,1))
);
缩放变换
缩放是指改变模型的大小。
以下是一个简单的示例代码:
// PositionAttitudeTransform方式
osg::ref_ptr<osg::PositionAttitudeTransform> scalePAT = new osg::PositionAttitudeTransform();
scalePAT->setPosition(osg::Vec3d(0.0, 0.0, 2.0));
scalePAT->setScale(osg::Vec3d(1.0, 2.0,