基于Position-Based Dynamics的布料模拟技术详解
创作时间:
作者:
@小白创作中心
基于Position-Based Dynamics的布料模拟技术详解
引用
CSDN
1.
https://m.blog.csdn.net/weixin_41464663/article/details/146096425
基于Position-Based Dynamics的布料模拟
Position-Based Dynamics (PBD) 是一种用于物理模拟的方法,特别适用于实时的软体、布料、流体等模拟。与传统的基于力的方法不同,PBD直接操作物体的位置来满足一组约束条件,而不是通过求解复杂的微分方程来计算加速度和速度。
约束
PBD通过定义一系列约束(例如距离保持、不可穿透性等)来描述系统的物理行为。在每一步模拟中,算法尝试调整粒子或物体的位置,以尽可能满足这些约束条件。
对于弹簧/边 来说,两点间的距离应该保持不变,约束条件为:
投影
投影函数的核心思想是找到距离原始点最近的满足给定约束的点。对于一个不满足某些约束条件的初始值,通过投影函数可以将其转换为最接近且满足这些约束条件的新值。
对弹簧来说,当预测位置违反了距离约束时,我们就需要通过投影来修正这些位置,使得它们再次满足约束条件。
弹簧 基于位置的投影函数:
用投影调整质点的位置以尽量满足约束
很多弹簧的情况
高斯赛德尔方法迭代所有边
- 在这个过程中 我们无法确保每个约束都能得到满足。但是,使用的迭代次数越多,这些约束就能得到越好的满足。
- 虽然这个方法的名字与高斯-赛德尔(Gauss-Seidel)有关,但它实际上与高斯-赛德尔方法不同,它与随机梯度下降(stochastic gradient descent)的关系更为密切。
- 迭代的顺序可能会导致偏差并影响收敛行为。
Jacobi方法
Jacobi方法并不立即更新顶点,而是计算所有边对该顶点的位置变换取平均值。相比高斯-赛德尔方法, Jacobi方法缺点是收敛速度降低,优点是没有bias,容易并行。
Position-Based Dynamics模拟的特点
- PBD和真实的物理无关,迭代次数越多,网格分辨率越大,布料约束越强,弹性越差
- 投影后的速度更新对于动态效果非常重要。
- 这种方法同样适用于其他类型的约束,包括三角形约束、体积约束和碰撞约束。要实现这些约束,只需定义它们的投影函数。
- 优点:容易并行;容易实现;通用性强,适用布料流体等模拟;低分辨率效率快
- 缺点:没有物理含义,没有精确解;高分辨率下效率低(层次化方法可能导致振荡和其他问题)
strain limiting
strain limiting是一种结合物理模拟和PBD的方法。在基于物理的模拟之上多了一点约束。
比如,我们可以设置弹簧的弹性限度。在真实世界,弹簧也并不是可以无限拉神的。strain limiting可以使系统更稳定。
PBD: σ≡1; No limit: σ^min ⟵0, σ^max⟵∞
面积约束
作业二 代码
我们固定第0个和第2个 顶点
void Update ()
{
Mesh mesh = GetComponent<MeshFilter> ().mesh;
Vector3[] X = mesh.vertices;
for(int i=0; i<X.Length; i++)
{
if(i==0 || i==20) continue;
//Initial Setup
//...
V[i] *= damping;
V[i] += mass * gravity;
X[i] += V[i] * t; //X_hat is an initial guess, not a real update
}
mesh.vertices = X;
for(int l=0; l<32; l++)
Strain_Limiting ();
Collision_Handling ();
mesh.RecalculateNormals ();
}
这里用的是基于Jocobi的纯PBD方法。
void Strain_Limiting()
{
Mesh mesh = GetComponent<MeshFilter> ().mesh;
Vector3[] X = mesh.vertices;
Vector3[] sum_X = new Vector3[X.Length];
int[] sum_n = new int[X.Length];
//Apply PBD here.
//...
for (int e = 0;e < L.Length; e++)
{
int i = E[2*e];
int j = E[2*e + 1];
sum_X[i] += 0.5f * (X[i] + X[j] + L[e]*(X[i] - X[j]).normalized);
sum_X[j] += 0.5f * (X[i] + X[j] - L[e]*(X[i] - X[j]).normalized);
sum_n[i] += 1;
sum_n[j] += 1;
}
Vector3 X_old;
for (int i = 0;i< X.Length;i++)
{
if (i==0 || i==20) continue;
X_old = X[i];
X[i] = (0.2f * X[i] + sum_X[i]) / (0.2f + sum_n[i]);
V[i] += (X[i]-X_old)/t;
}
mesh.vertices = X;
}
热门推荐
代购逃税被判十年:一例跨境电商违法案件的警示
牙周炎早中晚怎么区分?看这里清楚牙周炎早期、中期、晚期症状表现!
鼻塞怎么保持鼻子湿润
筑牢“安全堤”,严防个人信息“裸奔”
哪些日柱拥有九紫离火运,什么日柱最易得富贵
中小银行大额存单热度上升 利率优势吸引储户
好消息!C1驾照增驾D证只需满足1个条件,这15种车随便开!
怎样才能使汽车腻子刮得平整?刮平后如何保证其质量?
Jack是啥意思?解析“Jack”的常见含义
华尔街估值学院院长:通货膨胀与投资,虚惊一场还是公平预警?
中国女篮名将赵爽宣布复出,35岁再次挑战篮坛巅峰
异地失联应如何报警
神与人之间的使者——日本巫女文化探秘
河北博物院 | “暗藏黑科技”的中华第一灯,长信宫灯
如何准确描述洗衣液产品的种类?
莱纳斯·鲍林与维生素C在健康与甲流应对中的潜能探索
拔个罐就能预测健康状况?罐印发红发紫非吉兆,最佳颜色让人意想不到!
无菌鸡蛋:真相与误区
本来无一物,何处惹尘埃!读懂这19句感悟人生诗词,改变你的一生
金鱼要怎么养才能活的久一点
文化漫谈:浅析儒家经典,半部《论语》治天下
汽车电动机类型解析:驱动未来的核心动力
时隔五年,热情“重燃”,法语原版音乐剧《摇滚莫扎特》华丽回归
如何评估工作环境的质量?这些因素如何影响工作体验?
飞机在空中不用考虑地球的自转速度,难道惯性一直存在吗?
全国大学四六级考试官网入口及报名指南
跑步的隐形财富:一年能“赚”17万?
周朝取代商朝,进步还是倒退?考古发现改写认知
显示器选购攻略:从菜鸟到行家,一篇文章让你挑对心仪屏幕!
现调饮料强制分级,瑞幸生椰拿铁为“D级”