##1.通过cmake构建库,用vs2010进行编译,以及安装osg库
cmake构建库参考下面的博客
(129条消息) OSG仿真案例(3)——cmake创建工程_rexinx的博客-优快云博客
osg的库文件可以去官网上下载
osg(osg中文社区)-osgEarth-osgViewer-基于OpenGL-开源三维渲染引擎-图形引擎-虚拟仿真工具-osg教程-osg仿真 (osgchina.org)
##2.掌握坐标系统概念,osg的坐标系统包括世界坐标,局部坐标,相机坐标
坐标系是一个精准定位对象位置的框架,所有的图像变换都是基于一定的坐标西进行的。
###世界坐标
世界坐标是一种特别的坐标系,他建立了描述其他坐标所需要的参考框架。可以用世界坐标系来描述其他坐标系的所在位置,但是没有更大的坐标系来描述世界坐标系,即绝对坐标系。
世界坐标系通常用来描述一些对象的初始位置及场景中对象的变换过程,对象包括摄像机和绘制的物体等。
###局部坐标系
局部坐标系是针对某一特定的物体而建立的独立的坐标系,每一个物体都有自己的坐标系,当物体发生变换时,实际上是他本身坐标系相对于世界坐标系发生变换的过程。对于世界坐标系来说局部坐标系对于描述特定的物体时非常方便。
###相机坐标系
相机坐标系是和观察者相关的坐标系,相机坐标系和屏幕坐标系相似,差别在于相机坐标系处于3D空间中,二屏幕坐标系在2D平面中,相机坐标系可以被看作是一种特别的局部坐标系,该坐标系被定义在相机的屏幕可视区域。
###世界坐标系-局部坐标系变换
osg::PositionAttitudeTransform //位置变换类
osg::MatrixTransform //矩阵变换类
###局部坐标系-世界坐标系变换
通过创建继承(public)osg::NodeVisitor的类来实现。
1.确定遍历的对象群体
2.重写apply方法。
3.添加自己所需功能
具体实现见后续笔记。
###世界坐标-屏幕坐标系变换
三步骤:模型变换->投影变换->视口变换
#数学知识
##向量
在数学上,将只有大小的量称为标量,将即有方向又有大小的量称为向量。
向量作为2D,3D数学研究的标准工具,是一种很常用的数据工具,大部分的3D图形引擎都把向量作为基本的数据工具,可见向量在表达数据是有明显的优势。
行向量:
列向量:
V = [a1
a2
a3
.
.
.
an]
osg::Vec2 //二维向量 一般用来存储纹理坐标
osg::Vec3//三维向量 一般用来存储顶点坐标
osg::Vec4//四维向量 一般用来存储颜色
###向量的运算
1.求模
float length() const //计算向量的模
float length2() cosnt //计算向量模的平方值
2.向量间的加减法
const Vec3 operator+(const Vec3&) const //加法
const Vec3 operator-(const Vec3&) const //减法
Vec3& operator+=(const Vec3&)
Vec3& operator-=(const Vec3&)
const Vec3 operator-() const //取负号
3.向量与一个系数之间的数乘
const Vec3 operator*(float) const
const Vec3 operator/(float) const
Vec3& operator*=(float)
Vec3& operator/=(float)
4.向量之间的点积(数量积/内积),即二个向量个个分量乘积之和,结果为一个标量。
float operator*(const Vec3&) const
5.向量之间的叉积(向量积),结果为一个垂直于原向量的新向量
const Vec3 operator^(const Vec3&) const
##矩阵
可以用于表达三维世界中对象的平移,缩放,旋转
行向量(1 * n 矩阵)可以从 n * r 矩阵的左侧与之相乘,称之为“左乘”,其结果仍是同维度的行向量。
列向量(n * 1矩阵)可以从 m * n矩阵的右侧与之相乘,称之为“右乘”,其结果仍为同维度的列向量。
矩阵左乘一个行向量,常用于向量的空间变换,也可以直接乘法操作符来表示矩阵M与向量V的左乘
Vec3 preMult(const Vec3&) const
Vec3 operator*(const Vec3&,const Matrix&)
矩阵右乘一个行向量,常用于向量与转置矩阵的运算,也可以直接用乘法操作符来表示矩阵M与向量V的右乘,即M*V
Vec3 postMult(const Vec3&) const
Vec3 operator(const Vec3&) const
矩阵左乘一个平移量,即叠加一个平移矩阵;或者获取当前矩阵的平移量
void preMultTranslate(const Vec3&)
Vec3 getTrans() const
矩阵左乘一个旋转四元数,即叠加一个旋转矩阵,或者获取当前矩阵的旋转值,如果矩阵还经历过缩放变换,那么这里获得的旋转值将会是不正确的。
void preMultRoate(const Quat&)
Vec3 getRoate() const
矩阵左乘一个缩放量,即叠加一个缩放矩阵;或者获取当前矩阵的旋转值
void preMultScale(const Vec3&)
Vec3 getScale() const
##四元数
由三个复数和1个实数组成的复杂数字系统
可以表示物体绕任意向量轴的旋转。
欧拉角转四元数
Quat(float angle1,const Vec3& axisl1,
float angle2,const Vec3& axis2,
float angle3,const Vec3& axis3)
四元数转矩阵
Quat(float angle,const Vec3& axis1)