学习(1)OSG计算机图形学基础

340 阅读6分钟

一. 坐标系统

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 轴移动指定的距离。
  • 平移矩阵
T(x,y,z)=[100x010y001z0001] T(x, y, z) = \begin{bmatrix} 1 & 0 & 0 & x \\ 0 & 1 & 0 & y \\ 0 & 0 & 1 & z \\ 0 & 0 & 0 & 1 \end{bmatrix}

其中,xyz 分别是沿三个轴移动的距离。

  • OSG 中的使用:你可以使用 osg::Matrix::translate(x, y, z) 来应用平移变换。

2. 旋转 (Rotation)

  • 定义:旋转是围绕某个轴(x、y 或 z 轴)将物体旋转一定角度。这通常通过旋转矩阵来实现,旋转矩阵根据旋转的轴和角度进行计算。
  • 旋转矩阵:不同轴的旋转矩阵形式不同。比如:
    • 围绕 X 轴 旋转:
Rx(θ)=[10000cos(θ)sin(θ)00sin(θ)cos(θ)00001]R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos(\theta) & -\sin(\theta) & 0 \\ 0 & \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
  • 围绕 Y 轴 旋转:
Ry(θ)=[cos(θ)0sin(θ)00100sin(θ)0cos(θ)00001] R_y(\theta) = \begin{bmatrix} \cos(\theta) & 0 & \sin(\theta) & 0 \\ 0 & 1 & 0 & 0 \\ -\sin(\theta) & 0 & \cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
  • 围绕 Z 轴 旋转:
Rz(θ)=[cos(θ)sin(θ)00sin(θ)cos(θ)0000100001] R_z(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \\ \sin(\theta) & \cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

其中,θ 是旋转角度(以弧度表示)。

  • OSG 中的使用:你可以使用 osg::Matrix::rotate(angle, x, y, z) 来围绕指定轴旋转物体,x, y, z 表示旋转轴的方向,angle 是旋转角度。

3. 缩放 (Scaling)

  • 定义:缩放是改变物体的大小,可以分别沿 x、y、z 轴进行不同的缩放。缩放不会改变物体的位置或方向。

  • 缩放矩阵

    S(x,y,z)=[x0000y0000z00001]S(x, y, z) = \begin{bmatrix} x & 0 & 0 & 0 \\ 0 & y & 0 & 0 \\ 0 & 0 & z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

    其中,xyz 是分别沿三个轴的缩放因子。

  • 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. 矩阵乘法的性质

  • 非交换性:矩阵乘法 不具备交换性,即 A×BB×AA \times B \neq B \times A。这意味着变换的顺序会影响结果。
  • 结合性:矩阵乘法 具备结合性,即 A×(B×C)=(A×B)×CA \times (B \times C) = (A \times B) \times C,可按任意顺序组合变换矩阵。

2. 矩阵乘法的操作

假设有两个 4x4 矩阵 AABB,它们的乘法计算如下:

C=A×B\begin{equation} C = A \times B \end{equation}

矩阵CC中的元素 cijc_{ij}AA 的第 ii 行与 BB 的第 jj 列的点积:

cij=ai1×b1j+ai2×b2j+ai3×b3j+ai4×b4jc_{ij} = a_{i1} \times b_{1j} + a_{i2} \times b_{2j} + a_{i3} \times b_{3j} + a_{i4} \times b_{4j}

3. OSG 中的矩阵乘法

  • OSG 使用 osg::Matrix::mult(A, B) 执行矩阵乘法。
  • 例如,通过组合平移和旋转矩阵,可以应用多个变换:

3.2 逆矩阵

在 3D 图形中,有时需要撤销一个变换,或者在世界坐标系和局部坐标系之间进行转换。逆矩阵就是解决这个问题的关键。

1. 逆矩阵的性质

  • 对于任意可逆的矩阵 AA,其逆矩阵记为 A1A^{-1},满足 A×A1=I A \times A^{-1} = I ,其中 II 是单位矩阵。
  • 逆矩阵的存在条件是原矩阵 可逆,即行列式不为 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》