https://haqr.eu/tinyrenderer/camera/

之前我们用的是正交投影,Z 坐标只用来处理遮挡关系。

Rotating the camera

这里实现一个简单的相机,也就是直接把世界沿着相机反方向变换。这个例子中我们把模型的所有顶点坐标,沿着 y 轴旋转 30°。

关于旋转矩阵:看 维基 或者看 GAMES 101 的 03 Transformation

// [  cos(a)   0   sin(a) ]    [ x ]
// [    0      1     0    ] x  [ y ]
// [ -sin(a)   0   cos(a) ]    [ z ]
rotate_y :: (using v: Vector3, angle: float) -> Vector3 {
    c := cos(angle);
    s := sin(angle);
    return Vector3.{
        c * x + s * z,
        y,
        -s * x + c * z,
    };
}

https://github.com/qiekn/tinyrenderer-jai/blob/main/050_rotating_camera.jai

050_depth.png

050_color.png

Perspective projection

我应该去找一个鸽子模型,做一个”道理我都懂,但是鸽子为什么那么大”。人类在干坏事的时候是不会觉得累的,这个图我一定要渲染出来。

persp :: (using v: Vector3) -> Vector3 {
    c := 3.0;
    factor := 1.0 / (1.0 - z / c);
    return v * factor;
}

这一部分我超级不喜欢,他的这个文章里面的投影矩阵写得有些糟糕。我不用他这个,等后面我直接 Model View Projection 一套搞完。

这两章其实就是说 MVP 矩阵做的事情,大家应该都看过 GAMS 101,所以这篇文章就太啰嗦了。

GAMES 101 04 Transformation Cont.

051_diablo_depth.png

051_diablo_color.png

051_face_depth.png

051_face_color.png