计算最优坍缩位置时,需要解方程 Kx = 0,其中 K 为正定矩阵,那么这个方程不是只有零解么?
这里是我之前回答的时候说错了,矩阵 K 是半正定而非正定的,非常抱歉。下面放一小段证明以便理解,感兴趣可以看一下。
我们首先回顾一下,面片的二次误差矩阵是 K_f=\mathbf{v}\mathbf{v}^T ,而向量 \mathbf{v}=(a, b, c, d)^T 对应着面片所在平面 ax+by+cz+d=0 的法向量(但比法向量多了一维)。计算点 \mathbf{u}=(x, y, z, 1) 二次误差的公式
\text{cost}=(\mathbf{v}^T\mathbf{u})^2
=\mathbf{u}^T\mathbf{v}\mathbf{v}^T\mathbf{u}
=\mathbf{u}^TK_f\mathbf{u}
中, \mathbf{v}^T\mathbf{u} 是一个内积,展开写就是 ax+by+cz+d ,不难发现该内积和点到平面的距离
\text{distance}=\frac{|ax+by+cz+d|}{\sqrt{a^2+b^2+c^2}}
之间只差了一个系数 1/\sqrt{a^2+b^2+c^2} ,所以 cost 的含义就是距离的平方。而当我们实际计算的时候,所用的向量 \mathbf{v} 直接来自面片的法向量(已经单位化过),所以 \sqrt{a^2+b^2+c^2}=1 ,cost 就直接等于 distance 了。根据几何直观,一点到平面距离的平方总是大于等于零的,因此矩阵 K_f 是对称半正定的。
由于顶点的二次误差矩阵 K_v 是若干半正定矩阵 K_f 之和,所以 K_v 是半正定的。同理可得,边的二次误差矩阵 K 也是半正定的。