新闻动态

非均匀缩放表面后法线为什么不能照搬位置变换:机制演算第09例

2026-11-11

表面法线要垂直于表面的两个切向方向。横纵深度缩放比例不同的时候,把法线直接按同样比例缩放,通常会破坏这个垂直关系。

给出两个不平行切向量a和b,它们的叉积为原法线。位置按三个正比例分别缩放时,切向量按相同比例变换;正确法线方向可把原法线的各分量分别除以相应比例,最后按需要再单位化。

本例的输入和输出

六组独立表面记录,u和v为切向量,scale为三个方向的缩放比例。

输入 | 原法线 | 直接缩放后的两点积 | 按倒数缩放法线 | 正确两点积 {'u': [-2, -1, 0], 'v': [-1, 1, 2], 'scale': [1, 3, 5]} | [-2, 4, -3] | [-32, -112] | ['-2', '4/3', '-3/5'] | ['0', '0'] {'u': [1, -2, -2], 'v': [1, 1, -2], 'scale': [3, 5, 3]} | [6, 0, 3] | [0, 0] | ['2', '0', '1'] | ['0', '0'] {'u': [2, 3, -1], 'v': [-3, 0, -3], 'scale': [3, 5, 4]} | [-9, 9, 9] | [369, -189] | ['-3', '9/5', '9/4'] | ['0', '0'] {'u': [-3, 0, -1], 'v': [0, -1, 3], 'scale': [5, 2, 5]} | [-1, 9, 3] | [0, 189] | ['-1/5', '9/2', '3/5'] | ['0', '0'] {'u': [-3, 0, 2], 'v': [1, -3, -2], 'scale': [1, 1, 5]} | [6, -4, 9] | [432, -432] | ['6', '-4', '9/5'] | ['0', '0'] {'u': [-3, 3, 2], 'v': [-2, 2, 3], 'scale': [4, 2, 4]} | [5, 5, 0] | [-180, -120] | ['5/4', '5/2', '0'] | ['0', '0']

表格中的编号只标识当前例子的元素,不应把对象身份、数组下标与计算数值混为一谈。阅读时先核对输入和边界,再沿记录检查每一步;空结果表示规则下没有可用项,并不是默认返回数值零。

复核与适用条件

检查新法线与两个新切向量的点积均为零。也可以把变换后的两个切向量重新叉乘,它应与这个法线平行;直接乘比例的错误候选则不一定保持点积为零。

本例只处理可逆的正对角缩放,不涉及平移、奇异变换或反射后的朝向约定。法线长度不是这里的重点,后续照明若要求单位向量,仍应执行归一化,而不能把任意长度直接代入。

练习时先独立复算一小段,再检查整体结果是否满足文中条件。遇到差异应保留中间记录并定位第一处不一致,而不是只调整最后答案。更换输入或操作规则后,需要重新计算,原记录只对这一例负责。