背景 这是一道 Canva 的面试题,我日常的工作主要涉及生成式模型,缺少模型固有法线处理的经验,没答上来。 看来日常工作里涉及的技术面还是不够广呀。 证明 法线 n\mathbf{n}n 对任意切线 t\mathbf{t}t 有 n⋅t=0\mathbf{n} \cdot \mathbf{t} = 0n⋅t=0 设模型经过变化 M\mathbf{M}M 后: t′=Mt\begin{aligned} \mathbf{t}^{\prime} &= \mathbf{M} \mathbf{t} \end{aligned}t′=Mt 我们需要找到一个法线变换 N\mathbf{N}N 使得 (Nn)TMt=0nTNTMt=0\begin{aligned} (\mathbf{N} \mathbf{n})^{T}\mathbf{M} \mathbf{t} &= 0\\ \mathbf{n}^{T} \mathbf{N}^{T} \mathbf{M} \mathbf{t} &= 0 \end{aligned}(Nn)TMtnTNTMt=0=0 已知 nTt=0\mathbf{n}^{T} \mathbf{t} = 0nTt=0, 因此上式为恒等式的条件是 NTM=EN=(M−1)T\begin{aligned} \mathbf{N}^{T} \mathbf{M} &= \mathbf{E} \\ \mathbf{N} &= (\mathbf{M}^{-1})^T \end{aligned}NTMN=E=(M−1)T 也就是如果模型经过 M\mathbf{M}M 变化,对应的法线需要经过 (M−1)T(\mathbf{M^{-1}})^{T}(M−1)T。