前言
参考资料:
本笔记的仓库:
1
| https://github.com/yrzr21/cmu15-462-learing-notes.git
|
什么是计算机图形学?
- 希望使用视觉传递信息,图形化层次人机交互,而非一串数字
- 视觉信息的传递的带宽最大,大脑的30%
初步的定义:使用计算机合成视觉信息,进一步的扩展定义,使用计算机合成感官刺激
- 除了CG,也有其他领域,例如合成声音、触觉等等
- 计算机视觉,CG逆向的一个学科,将刺激物转化为数字信息
一些应用例如数字模型转换为物理实物,如3D打印…以及非常多的其他应用
本门课概述
建模与画出一个立方体
两个问题:
- 如何建模:如何用数字信息描述图形
- 如何渲染:数字信息转化为图形
建模
画:Perspective projection
如何把三维物体画到二维上?
- 丢掉一个坐标轴不能获得立体感
基本策略是将3D点映射到2D点上,然后把2D点用直线连起来。
我们可以参考相机的工作方式:
假设相机位于远点,从侧面来看:
- v = y/z,再从顶部来看即可得到 u = x/z
- 当z越来越大,2D图形将会越来越小
- 如果相机不位于远点,则需移动整个坐标系
画
一段简单的代码输出 3D 与 2D 点的映射关系:
- lec1.py
画图部分的代码用到了GPT
Pixels & Raster Display
离散的像素
如何在电脑上画线?非连续的像素 pixels(picture elements)
基于像素,我们可以把图形光栅化 raster 到一个网格 grid 中,每一个网格的值是该像素的 RGB 值
- 光栅化即离散化,我们的网格是不连续的,而实际图形是连续的
钻石规则
在光栅化一条线段时,我们可以:
- 把任何触及触及线段的网格绘出
- 钻石规则:只绘出通过菱形的方格
- 需要综合考虑各种条件给出一个好的标准,例如你需要考虑线的厚度。做事情的方法不止一种
增量光栅化
- 考虑每个像素,假设显示器的像素个数为nxn,则复杂度为 $O(n^2)$
- 然而预计中,一条线段最多覆盖 $O(n)$ 个元素