1.三维渲染引擎
实现三维场景图形结构管理和绘制而提供一套API几何。
构建层+交互层
构建层:设计或完成所需模型工具集或加载复杂模型数据接口。交互层:装配、渲染、优化和控制。
2.OSG概述
OSG编译:第三方库插件库源码=>CMake配置设置目录并生成sln=>打开sln=>编译、生成、批生成。
开发环境设置:开发工具目录设置和环境变量设置
新建启动Hello工程:新建项目,新建源文件main.cpp,链接依赖项,然后编译运行。
OSG实用工具:osgViewer浏览工程模型,并输出统计信息,判断是否需要优化、osgVersion版本信息查看、osgArchive打包整个工程文件、osgConv 来转换数据,转换成.ive 格式可以加速场景渲染。
3.OSG数学基础
- 世界坐标系(相机和绘制物体)
- 物体坐标系(顶点、法向量、姿态)
- 3D相机坐标系(定义物体可视区域区域裁剪、渲染顺序和遮挡绘制)
- 2D屏幕坐标系
OSG:X 正方向向右,Y 正方向朝里,Z 正方向朝上。OpenGL:X 正方向向右,Y 正方向朝上,Z 正方向朝外。
OSG坐标系为OpenGL坐标系绕X轴顺时针90度。
坐标系变换:世界坐标系-物体坐标系变换、物体坐标系-世界坐标系变换、世界坐标系-屏幕坐标系变换 - 模型变换:将实体对象正确地放置在场景中。
- 投影变换:将场景中的实体对象投影到垂直于视线方向的二维成像平面上,得到归一化设备坐标[-1,1]。
- 视口变换:投影变换之后得到的顶点需要经过视区变换才能得到最后的窗口坐标。
OSG屏幕坐标原点在视口左下角???
向量:数学意义数据集合,几何意义大小方向有向线段。
矩阵:数学意义行列数据集合(二维数组),几何意义与坐标轴平行的向量。
四元数:一个四元数由一个标量和一个矢量组成[w,v]或[w,x,y,z]。轴角或平滑插值。
矩阵在坐标系转换向量,四元数不能。四元数需转换为矩阵才能进行坐标系转换。
4.C++语法
构造函数声明:
GetWorldCoordinateOfNodeVisitor():
osg::NodeVisitor(NodeVisitor::TRAVERSE_PARENTS), done(false) {
// 其他初始化代码
}
- 对象是类的实例。当您定义一个类并创建一个对象时,您实际上是在分配内存来存储该对象的所有成员变量和方法。
- 指针的定义 :指针是一个变量,它存储另一个变量的内存地址。在 C++ 中,您可以使用指针来引用对象。
MyClass* ptr = &obj; // ptr 是指向 obj 的指针 栈对象
ptr->value = 20; // 通过指针修改 obj 的 value
MyClass* dynamicObj = new MyClass(30); // 动态分配对象
delete dynamicObj; // 释放内存
- 栈对象:在栈上创建的对象(如上面的 obj )在超出作用域时会自动销毁。
- 堆对象:在堆上创建的对象(如 dynamicObj )需要手动释放内存。
- 指向对象的指针的使用场景
传递对象:通过指针传递对象可以避免复制整个对象,节省内存和提高性能。
多态性:使用指针可以实现多态性,允许通过基类指针调用派生类的重写方法。
宏可以在函数内定义
#define M(row,col) m[col*4+row]
#undef M // 取消M宏定义
本文部分内容摘自《OpenSceneGraph三维渲染引擎编程指南》