计算机图形学-01

计算机图形学-01

计算机图形学,computer-graphics,简称cg

看了GAMES101-现代计算机图形学入门,做下笔记

2D和3D点的表示 #

计算机图形学中有个有趣的表示,那就是用向量和他的冗余值来表示对象,举例子来说,[2,1,1]表示点(2,1)[2,1,0]表示向量(2,1),两者的不同在于后者的冗余表示为0.

冗余值对于线性代数中的计算非常有帮助。

比如下面就是一个先逆时针旋转45度,再移动(1,0)的例子。

由于冗余1的存在,在线代计算中,变换矩阵的最后一列就有了意义。

2D点旋转与移动 #

用了Eigen作为线性代数运算库,官方文档为http://eigen.tuxfamily.org。

下面我们要把一个点(2,1),先逆时针旋转45度,再平移(1,2),那么数学上的运算就是3个矩阵相乘。三维上会复杂点,但基本原理差不多。

constexpr double PI = 3.1415926535;

double angle = 45;
double radian = angle * PI / 180.0f;
Eigen::Vector3f p(2.0f, 1.0f, 1.0f);    // 点(2,1)

// 旋转
Eigen::Matrix3f r3;
r3 << std::cos(radian), -std::sin(radian), 0,
    std::sin(radian), std::cos(radian), 0,
    0, 0, 1;

// 位移
Eigen::Matrix3f m3;
m3 << 1, 0, 1,
    0, 1, 2,
    0, 0, 1;

p = r3 * p;     // 先逆时针旋转45度

p = m3 * p;     // 再位移(1,2)

3D旋转 #

下面绕z轴逆时针旋转45度的计算矩阵,这里注意,绕那个轴,哪个轴对应的计算矩阵的行列值为单位矩阵值。

[cos(45),-sin(45),0,0,
 sin(45),cos(45),0,0
    0,    0,    1,    0,
    0,    0,    0,    1]

未完待续:2021-05-02

REF #