1.3 连续与离散:微积分在图形学里的角色


1.3 连续与离散:微积分在图形学里的角色

本节摘要:几何模型是连续的——曲线有无限多点、曲面有无限多法线;屏幕是离散的——有限像素、有限帧。这个矛盾是图形学一切采样问题(锯齿、闪烁、摩尔纹)的总根源。本节用参数曲线的导数、法向量的求法、弧长与变化率三个具体工具,说明微积分思想如何渗透进光栅化、光照与动画。它是第 3 章走样与第 7 章积分渲染的理论伏笔。

学习目标

阅读完本节,你应当能够:

  1. 用参数方程表示曲线,并对参数求导得到切向量
  2. 由切向量推出二维曲线的法线、三维曲面的法线
  3. 解释"采样不足导致走样"的机制,说出抗锯齿的两条思路
  4. 说明数值求导与解析求导在工程中的取舍

连续信号被离散采样的三种命运

连续信号被离散采样的三种命运

先看一个现象

用直线连接圆周上的 8 个点,画出来的是八边形;提高到 64 个点,看起来就是圆了。圆是连续的,采样点是离散的,点越密越接近真相。屏幕做的是同一件事,而且做得更粗暴:几何连续、像素有限,于是斜线边缘出现楼梯,细纹理出现水波纹。这些瑕疵的学名都叫"走样"(aliasing),意思是连续信号的高频细节"伪装"成了低频图案。

理解走样,只需要一个直观模型:用间隔为 T 的采样点去测一个周期小于 2T 的信号,采到的点会拼出一个根本不存在的慢波。奈奎斯特采样定理说,采样率至少要达到信号最高频率的两倍才能还原原信号;图形学的信号频率可以任意高(一条理想直线的边缘是阶跃,频率无穷大),所以严格的抗锯齿不可能,只能缓解。缓解的两条思路——先模糊再采样(预滤波)、每个像素多采几次(超采样)——将在第 3 章展开,这里先把数学工具备齐。

参数曲线与切向量

曲线最方便的表示是参数方程:点随着参数 t 流动。

直线段 P(t) = A + t·(B - A), t 从 0 到 1 圆 P(t) = (r·cos t, r·sin t) 贝塞尔 P(t) = Σ Bernstein 基 × 控制点, 见 3.4 节

对 t 求导得到切向量——导数在这里的几何意义是"参数走一小步,点往哪个方向挪、挪多快":

圆的导数:P'(t) = (-r·sin t, r·cos t) 在 t=0 处:P=(r,0),P'=(0,r),切向竖直向上,与半径垂直,符合直觉

有了切向量,法线一步可得。二维里把切向量旋转 90 度;三维曲面则用两个方向切向量的叉积:

import numpy as np def sphere_point(u, v, r=1.0): # 球面参数化:u 经度,v 纬度 return np.array([r*np.cos(v)*np.cos(u), r*np.cos(v)*np.sin(u), r*np.sin(v)]) def sphere_normal(u, v, r=1.0, h=1e-5): # 数值求导:两个方向的切向量做叉积得法线 du = (sphere_point(u+h, v, r) - sphere_point(u-h, v, r)) / (2*h) dv = (sphere_point(u, v+h, r) - sphere_point(u, v-h, r)) / (2*h) n = np.cross(du, dv) return n / np.linalg.norm(n) print(sphere_normal(0.3, 0.4)) # 输出约 [0.825 0.256 0.505],与该点坐标方向一致(球面法线过球心向外)

球面法线其实有解析解(就是点的单位化坐标),上面用数值导数是为了展示通用套路:模型文件通常只存三角形网格,没有解析曲面,法线要么顶点带一份插值,要么现场用边向量叉积算——本质都是求导思想的落地。

变化率:动画与缓动的心跳

导数即变化率,这句话在动画里字面成立。物体的位置对时间求导是速度,速度再求导是加速度。补间动画如果只用线性插值,物体会以恒定速度突兀地开始和停止;给参数做一个平滑的缓动函数,位置曲线在起止点的导数为 0,运动就有了"加速—巡航—减速"的自然感:

import numpy as np def ease_in_out(t): # 三次多项式缓动:起止点的导数为 0,速度平滑过渡 return 3*t*t - 2*t*t*t # 对比线性插值与缓动插值在 t=0.1 处的推进速度 ts = np.linspace(0, 1, 11) lin = ts # 线性:每步推进 0.1 eas = [round(ease_in_out(t), 3) for t in ts] print(list(zip(np.round(lin,2), eas))) # 输出前几对:(0.0,0.0)(0.1,0.028)(0.2,0.104)(0.3,0.216) # 缓动版起步慢、中段快、结尾慢,位移差分即速度

这个小小的缓动函数是第 7 章关键帧动画的基石。同样地,粒子系统、物理模拟的每一步积分(欧拉法、 Verlet 积分)都是"用离散时间步逼近连续时间演化",离散步长选太大,模拟会爆炸——又一个连续与离散矛盾的实例。

积分思想:从面积到渲染方程

积分在图形学里也有正业。曲线下面积对应弧长计算(路径动画让物体匀速沿曲线走,就必须按弧长重参数化);更重要的是,第 5 章会讲到,一个表面接收到的光照本质上是半球面上无穷多入射方向的积分——渲染方程。实时渲染用几个方向采样近似这个积分,离线渲染的路径追踪则随机采几千个样本求平均。数值积分的蒙特卡洛思路:"随机采样求平均逼近期望",将在 7.1 节光线追踪里正式登场。

import random, math def monte_carlo_pi(n=100000): # 蒙特卡洛积分的最小示例:随机撒点估算圆周率 hit = sum(1 for _ in range(n) if (random.random()-0.5)**2 + (random.random()-0.5)**2 <= 0.25) return 4 * hit / n # 正方形面积 1,圆面积 π/4,比例 ×4 即 π print(monte_carlo_pi()) # 输出约 3.14x,误差随样本数按 1/√n 收敛

本节要点回顾

  • 连续与离散的矛盾是锯齿、闪烁、摩尔纹的共同根源,严格消除不可能,只能缓解
  • 导数给方向:切向量、法线、速度与加速度,全是求导的不同马甲
  • 法线的工程来源:解析式、顶点插值、边向量叉积三条路
  • 缓动即导数控制:起止点导数为 0,动画才不像机械
  • 积分即累积:弧长、光照半球积分、蒙特卡洛估计,一条思想线通到第 7 章

第 1 站到站。数学语言备齐后,第 2 章先看像素未来的家——屏幕与颜色的物理世界。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U