利用主成分分析来对有缺陷的仿真结果及其他几何序列随时间进行抖动。该装置利用PCA降维功能的特性,在尊重一般几何形状的同时去除微小的移动。
![图片[1]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/af22a419feacdd82b38366037703295d.png)
![图片[2]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/4f0cab018572e10cefa9ac091bc37798.png)
![图片[3]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/6f4c063b452124913dc049837c7fa3d1.png)
![图片[4]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/be73b17d477c382ad9c953c63ee7bb10.png)
一个关于如何利用主成分分析(Principal Component Analysis)来随着时间推移去抖动错误的动画或仿真数据的教程。PCA是一种用于数据科学和机器学习应用中的统计方法,用于降低数据集的维度。
有时,我们会因为模拟错误或外部采集过程而出现抖动几何,没有时间或选项去重新模拟/重捕获/正确作。然后我们可以使用主成分分析来去除抖动几何。
![图片[5]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/01-1024x922.gif)
解决方案
内容库文件看起来挺复杂的,但真正重要的部分在中间的三个网络盒子里(紫色、绿色,还是其他紫色?)。这些配置也完全一样。唯一变化的是我们对它提供什么。
![图片[6]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-28.png)
PCA设置
![图片[7]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-29.png)
该配置的核心仅由少数节点组成,PCA节点用于不同步骤的3次。去抖动和滤波通常通过比较过去和未来的帧,找出我们想保留的信号和想要去除的噪声部分来实现。
合并框架
首先我们需要合并所有想看的帧。理想情况下,帧数应该不均数(比如7到>3个过去的帧,当前帧和3个未来帧)。这样我们就能得到过去和未来的帧数量相等。for循环的输出是叠加在一起的不同几何形状。我们通过一个时间移位来访问它们,时间移位会根据当前帧和迭代次数而变化。
伪代码:$F- ( NumIterations / 2 ) + Iteration
![图片[8]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-30.png)
计算组件
接下来,我们让主理主理计算分量。在大多数简单的主主成分分析解释中,每个样本是二维空间中的一个点。对我们来说,样本是单个帧(顶行)的整个几何体。所以在这种情况下,我们有7个采样(7帧)。我们给PCA一个包含所有点位置矢量的巨大列表(下排),让它判断所有样本中最重要的信息。
![图片[9]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/af22a419feacdd82b38366037703295d.png)
由于PCA节点只读取串联属性数据,没有处理id或piece属性的选项,我们需要告诉PCA节点每个样本大小:npoints(0) / NumIterations
PCA随后“发明”一个或多个可以被视为混合形状的组件。创建一个组件会生成一个最适合所有输入样本的混合形状。创建更多组件则能给出多个混合形状,之后我们可以混合搭配,重建特定的姿势。
投影与重建
现在我们有了分量,可以通过将原始姿态投影到新子空间来计算每个分量的权重。听起来复杂,但我们只需要把几何体导入第一个输入,分量接到第二个输入。将模式设置为投影,并将每个样品的点设置为几何点计数(npoints(0))。确保禁用包含平均权重,它是第0个分量(其他分量的平均值)。
我们现在有了对应组件的权重列表。在这种情况下,这可以看作是混合形状权重。应用这些权重并将组件相加,应该会返回几乎相同的输入结果。然后我们将这些权重乘以衰减,使高阶分量的影响较小甚至没有。
![图片[10]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-31.png)
![图片[11]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-32.png)
float range = 1-(float)@ptnum/@numpt;
float weightdecay = chramp(“decay”, range);
@weight *= weightdecay;
然后我们可以利用这些新的修改权重,并用它们重建输入点的位置。要做到这一点,只需设置重建模式,并将每个样本的点数重新设置成点计数。另外务必关闭“包含平均权重”。再来一次!
这样返回了点云,如果我们把点的位置复制到输入几何体上,就会得到去抖动的动画。
v@P = point(1, “P”, @ptnum);
该方法之所以有效,是因为PCA生成的组件按重要性排序。换句话说,就是通过它们对最终结果的影响来判断。我们可以利用这一点来过滤掉次要信息,比如丢弃高阶成分。输入数据中的噪声/抖动每帧变化很大,对整体形状影响不大。假设这些不那么重要的信息会存储在高阶分量中。没有这些,重建几何体可以去除细粒度的运动、噪声和抖动。
结果
如下图所示,我们消除了大部分抖动。根据我们调得有多激进,可以去除更多的移动。
![图片[12]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/08-1024x922.gif)
不过有一个问题。通过去除所有细微动作和快速方向转换,我们还消除了动画本身的抖动,尤其是在角色拍手和手似乎悬空时能明显感受到。
我们可以实现一些变通方法来解决这个问题,但需要完整的设备。这些是外部数据,我们只有角色和布料的冲泡盒。然而,这足以拯救我们。
最简单的方法是给几何体添加一个没有抖动、但又跟随动画的导引网格。所以我们只需添加最初驱动模拟的角色网格。然后我们会同时去抖动两个网格。之后,我们可以通过原始角色网格和去抖动网格的差来对布料进行点变形。
![图片[13]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/09-1-1024x453.gif)
对于布料模拟抖动量相同,动画保持不变。
De-Jittering in Rest 空间
解决这个问题的理想方法是在休息空间中去抖动。为此,我们需要为每个点创建一个局部坐标系,然后对这些点也进行变形(当属性参数设为*时,骨变形默认会这样做)。
code of point wrangle “apply_local_coords”:
v@axis_x = set(1, 0, 0);
v@axis_y = set(0, 1, 0);
v@axis_z = set(0, 0, 1);
setattribtypeinfo(geoself(), ‘point’, ‘axis_x’, ‘vector’);
setattribtypeinfo(geoself(), ‘point’, ‘axis_y’, ‘vector’);
setattribtypeinfo(geoself(), ‘point’, ‘axis_z’, ‘vector’);
![图片[14]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/11-1024x427.gif)
然后我们可以引入某种超越线性混合蒙皮的变形。这次我用的是皱纹变形器,但其实可以是任何东西(比如Vellum Sim等等)。这部分可能会出现抖动。
然后我们可以将这种位移应用到静止几何上。最终的几何体包含了所有变形数据,但没有输入动画。我们现在可以轻松地过滤或处理这些内容,然后用默认的骨骼变形将其移回正确的姿势。
code of point wrangle “extract_local_disp”
matrix3 local_from_global = invert( set( v@axis_x, v@axis_y, v@axis_z ) );
vector global_delta = point(1,”P”,@ptnum) – v@P;
vector local_delta = global_delta * local_from_global;
v@P = local_delta;
code of point wrangle “apply_disp”
v@P += point(1, “P”, @ptnum);
![图片[15]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-33.png)
虽然这实际上只适用于基于角色/绑定的变形,也就是骨骼+加权皮肤存在于Houdini内部的情况下,但效果最准确。不过我们之前提到的点变形方法在大多数情况下相当准确且足够。
在下面的图片中,我们可以看到两种方法(红色和绿色)如何很好地对应,并且比天真方法(蓝色)更好地保持了原始动画。
![图片[16]-PCA除抖动器-houdiniUE](https://www.houdiue.cn/wp-content/uploads/2026/02/image-34-1024x433.png)














暂无评论内容