一. 坐标系统
OpenSceneGraph (OSG) 使用 右手坐标系 (Right-Handed Coordinate System),这是大多数 3D 图形引擎和 OpenGL 的常用坐标系统。
1.1 右手坐标系
- X 轴:水平方向,正方向指向右。
- Y 轴:垂直方向,正方向指向上。
- Z 轴:深度方向,正方向指向屏幕外(即远离观察者)。
使用右手规则时,如果你伸出右手,大拇指指向 X 轴正方向,食指指向 Y 轴正方向,中指指向 Z 轴正方向。这意味着:
- 物体绕 X 轴正方向旋转时,物体会在 Y-Z 平面内做旋转运动。
- 物体绕 Y 轴正方向旋转时,物体会在 X-Z 平面内做旋转运动。
- 物体绕 Z 轴正方向旋转时,物体会在 X-Y 平面内做旋转运动。
1.2 摄像机默认朝向
在 OSG 中,默认情况下摄像机位于场景的原点 (0, 0, 0),且朝向 -Z 轴。这意味着:
- 摄像机在原点,观察的方向是负 Z 轴方向(即正 Z 轴方向为远离摄像机的方向)。
- 场景中的物体默认在正 Z 轴方向远离观察者。
1.3 坐标系统层次
OSG 的场景图结构意味着每个节点都可以有自己的局部坐标系。在渲染时,这些局部坐标系会通过矩阵变换,依次映射到世界坐标系。
1.4 矩阵变换
OSG 使用 osg::MatrixTransform 类来对对象的平移、旋转和缩放进行变换。每个节点的局部坐标系通过这些变换矩阵,最终转换到世界坐标系。
二. OSG 变换
2.1 变换
在 OpenSceneGraph (OSG) 中,变换(Transformation)是用于对场景中的物体进行平移(Translation)、旋转(Rotation)和缩放(Scaling)的常见操作。OSG 使用矩阵来描述这些变换。以下是 OSG 变换的主要类型及其操作原理:
1. 平移 (Translation)
- 定义:平移是将物体从一个位置移动到另一个位置。这不会改变物体的方向或大小,只改变它在空间中的位置。
- 实现方式:使用平移矩阵,将物体沿 x、y、z 轴移动指定的距离。
- 平移矩阵:
其中,x、y、z 分别是沿三个轴移动的距离。
- OSG 中的使用:你可以使用
osg::Matrix::translate(x, y, z)来应用平移变换。
2. 旋转 (Rotation)
- 定义:旋转是围绕某个轴(x、y 或 z 轴)将物体旋转一定角度。这通常通过旋转矩阵来实现,旋转矩阵根据旋转的轴和角度进行计算。
- 旋转矩阵:不同轴的旋转矩阵形式不同。比如:
- 围绕 X 轴 旋转:
- 围绕 Y 轴 旋转:
- 围绕 Z 轴 旋转:
其中,θ 是旋转角度(以弧度表示)。
- OSG 中的使用:你可以使用
osg::Matrix::rotate(angle, x, y, z)来围绕指定轴旋转物体,x, y, z表示旋转轴的方向,angle是旋转角度。
3. 缩放 (Scaling)
-
定义:缩放是改变物体的大小,可以分别沿 x、y、z 轴进行不同的缩放。缩放不会改变物体的位置或方向。
-
缩放矩阵:
其中,
x、y、z是分别沿三个轴的缩放因子。 -
OSG 中的使用:你可以使用
osg::Matrix::scale(x, y, z)来对物体进行缩放,分别调整物体沿三个轴的大小。
2.2 OSG 中的矩阵变换 (osg::MatrixTransform)
在 OSG 中,osg::MatrixTransform 类用于执行上述变换。它允许将平移、旋转和缩放矩阵组合在一起,以便对场景中的节点进行复杂的变换。常见操作包括:
- 设置矩阵:
osg::MatrixTransform::setMatrix(osg::Matrix& matrix)可以直接应用一个矩阵变换。 - 组合变换:可以将多个变换操作组合,例如平移、旋转和缩放一起进行。通过矩阵的乘法来实现组合变换时,执行顺序至关重要,一般是:缩放 -> 旋转 -> 平移。
2.3 变换的顺序问题
- 顺序:在组合变换时,顺序很重要。通常,我们先缩放物体,然后旋转,最后平移。
- 例如,如果你先平移再旋转,物体将绕原点旋转,这可能不是预期的行为。如果先旋转再平移,物体将绕自身的中心旋转。
三、 矩阵运算
在 OpenSceneGraph (OSG) 中,矩阵运算是图形变换(如平移、旋转、缩放等)的核心。通过矩阵运算,开发者可以控制 3D 场景中物体的空间变换。以下是两个关键的概念:矩阵乘法和逆矩阵。
3.1. 矩阵乘法
在 3D 图形中,变换通常用 4x4 矩阵表示。多个变换可以通过矩阵乘法组合。
1. 矩阵乘法的性质
- 非交换性:矩阵乘法 不具备交换性,即 。这意味着变换的顺序会影响结果。
- 结合性:矩阵乘法 具备结合性,即 ,可按任意顺序组合变换矩阵。
2. 矩阵乘法的操作
假设有两个 4x4 矩阵 和 ,它们的乘法计算如下:
矩阵中的元素 是 的第 行与 的第 列的点积:
3. OSG 中的矩阵乘法
- OSG 使用
osg::Matrix::mult(A, B)执行矩阵乘法。 - 例如,通过组合平移和旋转矩阵,可以应用多个变换:
3.2 逆矩阵
在 3D 图形中,有时需要撤销一个变换,或者在世界坐标系和局部坐标系之间进行转换。逆矩阵就是解决这个问题的关键。
1. 逆矩阵的性质
- 对于任意可逆的矩阵 ,其逆矩阵记为 ,满足 ,其中 是单位矩阵。
- 逆矩阵的存在条件是原矩阵 可逆,即行列式不为 0。
2. 逆矩阵的作用:
- 撤销变换:逆矩阵可以用于撤销一个变换。例如,如果一个物体被平移、旋转或缩放,可以通过应用对应变换矩阵的逆矩阵来恢复其原始状态。
- 坐标转换:在 3D 图形中,逆矩阵通常用于从一个坐标系(如世界坐标系)转换到另一个坐标系(如局部坐标系)。例如,当你想将世界坐标系中的点转换为某个物体的局部坐标系时,你可以使用该物体的变换矩阵的逆矩阵。
3. 逆矩阵的计算:
计算 4x4 矩阵的逆矩阵通常比较复杂,需要用到矩阵的行列式和伴随矩阵。如果变换矩阵只包含简单的平移、旋转和缩放,逆矩阵的计算会相对容易。OSG 提供了便捷的函数来帮助开发者执行逆矩阵计算。
4. OSG 中的逆矩阵
- 使用
osg::Matrix::inverse(matrix)方法来计算矩阵的逆。它自动处理 4x4 矩阵的逆矩阵运算。 - 通常在场景中,逆矩阵用于视图变换、阴影投射等场景。
5. 示例:组合变换和逆矩阵
假设你要将物体 先平移 位置再 旋转,可以这样组合变换:
osg::Matrix translate = osg::Matrix::translate(x, y, z);
osg::Matrix rotate = osg::Matrix::rotate(angle, axisX, axisY, axisZ);
osg::Matrix transform = translate * rotate;
如果你想要撤销这个变换,可以计算复合变换的逆矩阵:
osg::Matrix inverseTransform = osg::Matrix::inverse(transform);
四、 3D图形基本概念
- 模型(Model):物体的几何表示,可以用顶点、边和面描述。
- 光照(Lighting):了解光源类型(点光源、方向光源、聚光灯)和光照模型(如Phong模型)。
- 纹理(Texture):如何将图像应用到3D模型表面,了解纹理坐标的概念。
五、渲染管线
- 顶点处理:顶点着色器的作用和基本流程。
- 光栅化:将图形转换为像素的过程。
- 片段处理:片段着色器的作用,包括颜色和深度的计算。
六、 视图和投影
- 视图变换:相机的位置和朝向,如何从世界坐标系转换到视图坐标系。
- 投影变换:平行投影和透视投影的区别,如何将3D场景投影到2D平面。
学习资源
- 书籍:
- 《Computer Graphics: Principles and Practice》
- 《Real-Time Rendering》