当前位置: 首页 > news >正文

【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::MatrixTransformosg::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, 

相关文章:

  • Spark-SQL(四)
  • C++之unordered封装
  • MyBatis框架—xml映射
  • 可穿戴设备待机功耗需降至μA级但需保持实时响应(2万字长文深度解析)
  • Android Studio打开xml布局文件内存会快速增加如何设置
  • C语言复习笔记--字符函数和字符串函数(下)
  • Unity接入安卓SDK(3)厘清Gradle的版本
  • 第六章.java集合与泛型
  • UML 状态图:解锁电子图书馆管理系统的高效设计
  • android的 framework 有哪些知识点和应用场景
  • 一键部署k8s之EFK日志收集系统
  • 在 Android 中实现通话录音
  • Flask API 项目 Swagger 版本打架不兼容
  • 02_Flask是什么?
  • Hadoop+Spark 笔记 2025/4/21
  • 【python实用小脚本系列】用Python让鼠标“动起来”:光标自动移动、自动点击、自动图象识别的小技巧
  • CSS 中实现 div 居中有以下几种常用方法
  • ADB -> pull指令推送电脑文件到手机上
  • 大数据学习(109)-Impala 和 Hive 之间的 SQL 差异
  • 机器学习 Day13 Boosting集成学习方法: Adaboosting和GBDT
  • 纪念沈渭滨︱“要把近代史搞得会通”——读《士与大变动时代》随札
  • 商务部:服务业扩大开放试点任务多数来源于经营主体实际需要
  • 什么样的赛事能推进建设全球著名体育城市,上海半马就是答案
  • 陈杨梅:刷到“棉花糖爸爸”寻女视频,隐约觉得自己就是爸爸要找的孩子
  • 大国重器飞天背后,有一位上海航天的“老法师”
  • 日本乒乓名将丹羽孝希因赌博被禁赛6个月,曾获奥运男团银牌