应读者需求,今天终于抽出时间把这篇文章整理一下,不过只把其中的一些公式进行了推导,如果需要细看,仍需阅读论文

Position Based Dynamics文章来源

首先对比一下PDF与FEM之间的关系

PBD是预估点的下一位置,然后通过constrain把它project到最终位置,并用这个位置去更新速度

FEM是算出每一帧中每个点的内力和外力,然后用合力去更新点的速度,进而再根据速度去更新位置,然后循环

3.3 Constraint Projection

4.4 Cloth Balloons

Appendix A

其中
最后上张撕裂效果图:
h=1/30;
%gravity=[0,-10,0];X0=read_obj('cloth.obj'); % seahorse_extended.obj');
v0=X0.xyz';  %坐标
originalv0=v0;
pre_v0=v0;
tri=X0.tri'; %三角形顺序索引
velocity=v0;
gravity=zeros(X0.node_num,3);
gravity(:,2)=-10;
velocity(:,1)=0;velocity(:,2)=0;velocity(:,3)=0;  %速度初始化
%controlpoint = [1,3,7,9];
%controlpoint = [1,11,111,121];
controlpoint = [1,217];  %固定点的索引号.
%velocity(controlpoint(1,:),:)=-1000;win_min = [999 999 999];
win_max = [-999 -999 -999];timestep=200;  %total step
xAxis=[1:timestep];
for index=1:timestepvelocity=velocity+gravity*h;v0=pre_v0+h*velocity;    %PBD中的位置预测for xx=1:3  %迭代次数v0=distanceconstraint(v0,X0,controlpoint);  %距离约束end%如果撞到地面的话(-10),按照上一时刻的位置,然后速度反向,弹回去,布料这个例子中并未用到与地面的碰撞%for i=1:X0.node_numif v0(i,2)<-20v0(i,2)=pre_v0(i,2)-velocity(i,2)*h;end%if v0(i,2)<-10%    v0(i,2)=-10;% endend%----------------------------------------------------------------%v0(controlpoint(1,:),:)= pre_v0(controlpoint(1,:),:);  %更新速度与位置velocity=(v0-pre_v0)/h;pre_v0=v0;center=mean(v0,1);trimesh(tri,v0(:,1),v0(:,2),v0(:,3),'EdgeColor','b'); axis equalaxis manualcur_V = v0(:,1:3);% scale window to fitwin_min = min([win_min; cur_V]);win_max = max([win_max; cur_V]);axis(reshape([win_min;win_max],1,2*size(cur_V,2)))pause(0.01);
end
grid on;
%figure, trimesh(tri,v0(:,1),v0(:,2),v0(:,3),'EdgeColor','b'); axis equal
%hold on, plot3(v0(controlpoint(1,:),1),v0(controlpoint(1,:),2),v0(controlpoint(1,:),3),'*r');
function P=distanceconstraint(P,X0,controlpoint)
for i=1:X0.face_numidx1=X0.tri(1,i);  %三角形的三个索引idx2=X0.tri(2,i);idx3=X0.tri(3,i);d1=norm(X0.xyz(:,idx1)-X0.xyz(:,idx2));  %原始两点间的距离c_d1=norm(P(idx1,:)-P(idx2,:));%现在两点间的距离d2=norm(X0.xyz(:,idx2)-X0.xyz(:,idx3));c_d2=norm(P(idx2,:)-P(idx3,:));d3=norm(X0.xyz(:,idx1)-X0.xyz(:,idx3));c_d3=norm(P(idx1,:)-P(idx3,:));if c_d1~=d1  %考察三角形第一条边, 如果现在的距离与原始的距离不相等,那么更新位置,就像弹簧一样test=1;%用来测试这个点是不是control point, 如果是control point 那么不更新位置test2=1;%同上for count=1:length(controlpoint)if idx1==controlpoint(count)test=0;  %这个点不是control pointendif idx2==controlpoint(count)test2=0;endendif test==0deltap1=[0,0,0];deltap2=(c_d1-d1)*(P(idx1,:)-P(idx2,:))/(norm(P(idx1,:)-P(idx2,:)));elsedeltap1=-0.5*(c_d1-d1)*(P(idx1,:)-P(idx2,:))/(norm(P(idx1,:)-P(idx2,:))); %文章中的stifness是乘在这里的,我没乘,我按质点质量相等来算的,所以是0.5endif test2==0deltap2=[0,0,0];deltap1=-(c_d1-d1)*(P(idx1,:)-P(idx2,:))/(norm(P(idx1,:)-P(idx2,:)));elsedeltap2=0.5*(c_d1-d1)*(P(idx1,:)-P(idx2,:))/(norm(P(idx1,:)-P(idx2,:)));endP(idx1,:)=P(idx1,:)+deltap1;P(idx2,:)=P(idx2,:)+deltap2;endif c_d2~=d2  %考察第二条边test=1;test2=1;for count=1:length(controlpoint)if idx2==controlpoint(count)test=0;endif idx3==controlpoint(count)test2=0;endendif test==0deltap23=[0,0,0];deltap32=(c_d2-d2)*(P(idx2,:)-P(idx3,:))/(norm(P(idx2,:)-P(idx3,:)));elsedeltap23=-0.5*(c_d2-d2)*(P(idx2,:)-P(idx3,:))/(norm(P(idx2,:)-P(idx3,:)));endif test2==0deltap32=[0,0,0];deltap23=-(c_d2-d2)*(P(idx2,:)-P(idx3,:))/(norm(P(idx2,:)-P(idx3,:)));elsedeltap32=0.5*(c_d2-d2)*(P(idx2,:)-P(idx3,:))/(norm(P(idx2,:)-P(idx3,:)));endP(idx2,:)=P(idx2,:)+deltap23;P(idx3,:)=P(idx3,:)+deltap32;endif c_d3~=d3 %考察第三条边test=1;test2=1;for count=1:length(controlpoint)if idx1==controlpoint(count)test=0;endif idx3==controlpoint(count)test2=0;endendif test==0deltap13=[0,0,0];deltap31=(c_d3-d3)*(P(idx1,:)-P(idx3,:))/(norm(P(idx1,:)-P(idx3,:)));elsedeltap13=-0.5*(c_d3-d3)*(P(idx1,:)-P(idx3,:))/(norm(P(idx1,:)-P(idx3,:)));endif test2==0deltap31=[0,0,0];deltap13=-(c_d3-d3)*(P(idx1,:)-P(idx3,:))/(norm(P(idx1,:)-P(idx3,:)));elsedeltap31=0.5*(c_d3-d3)*(P(idx1,:)-P(idx3,:))/(norm(P(idx1,:)-P(idx3,:)));endP(idx1,:)=P(idx1,:)+deltap13;P(idx3,:)=P(idx3,:)+deltap31;end
end
end
MATLAB源代码
如果有什么疑问,欢迎留言交流

position based dynamics相关推荐

  1. PBD(Position Based Dynamics)学习笔记

    符号说明 仿真物体包括 NNN 个节点和 MMM 个约束. 每个节点 i∈[1,...,N]i\in [1,...,N]i∈[1,...,N] 包含的参数有质量 mim_imi​ .位置 xi\bol ...

  2. SPH(光滑粒子流体动力学)流体模拟实现六:Position Based Fluid(PBF)

    SPH(光滑粒子流体动力学)流体模拟实现六:Position Based Fluid(PBF) PBF方法和前篇提到的PCISPH方法类似,都属于迭代矫正法.PCISPH是通过迭代预测压力,通过压力变 ...

  3. 惊涛怪浪(double dam-break) -- position based fluids

    切入正题之前,先胡说八道几句.     据说爱因斯坦讲过:关于这个世界最难以理解的就是它是可以被理解的.人类在很长的时间里,都无法认知周围变幻莫测的世界,只能编造出无数的神祗来掌控世上万物的运行.到了 ...

  4. 机器学习如何彻底改变游戏中的物理模拟

    来源:AI科技评论本文约2600字,建议阅读10分钟 神经网络模拟物理比物理解算器快5000倍. 量子力学奠基者之一.英国理论物理学家保罗·狄拉克(Paul Dirac)在1929年说过:" ...

  5. 基于CUDA的粒子系统的实现

    基于CUDA的粒子系统的实现 用途: 这篇文章作为代码实现的先导手册,以全局的方式概览一下粒子系统的实现大纲. 科普: 对粒子进行模拟有两种基本方法: Eulerian(grid-based) met ...

  6. Games104 Lecture 11 物理系统:高级应用

    物理系统:高级应用 1 角色控制器 1.1 构建一个控制器 1.2 角色控制器的特点和小细节: 2 布娃娃系统 Ragdoll 3 衣料模拟 3.1 基于mesh的衣料模拟 4 破坏模拟 5 载具模拟 ...

  7. 移动端布料的模拟 -基于DynamicBone的实现

    布料的现状: 衣服的长裙可以说是现代布料模拟的难点表现,一般的衣服会好一些(市场上有做的不太好的做法,就是为了衣服居然添加不少约束来限制人的运动)看了一下现在的基本上都是飘飘然的感觉是有,但是要能容忍 ...

  8. 【物理模拟】PBD算法详解

    参考: Matthia Muller的十分钟物理(他就是PBD算法的发明者) https://matthias-research.github.io/pages/tenMinutePhysics/ 原 ...

  9. 动画or漫画相关工具

    用boujou做跟踪,maya做动画和模型,houdini做特效,arnold渲染 NUKE 是由The Foundry公司研发的一数码节点式合成软件 CG公司流程解决方案软件,shotgun May ...

最新文章

  1. asp.net mvc 简易上传功能
  2. BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]
  3. 处理android11以上无法删除相册图片的问题
  4. Asp.net中使用WEB编辑控件FCKEditor
  5. ROS笔记(19) 摄像头仿真
  6. 汇编在嵌入式编程中的作用_如何在嵌入式Power BI报表中以编程方式传递凭据
  7. 错误:invalid_client没有应用程序名称
  8. Graduation Speech 毕业典礼致辞__转载
  9. 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
  10. 首次适应算法的模拟C++实现(没有)
  11. bootstrap3 侧边导航栏
  12. 北邮邮箱配置客户端教程(如Windows自带邮件)
  13. 前台js中图片picture设置
  14. python csv文件转json
  15. 懂得拥有也要学会放弃
  16. bitnamigitlab_bitnami gitlab 安装
  17. 【基于MatlabSDOF弹性反应谱批量生成程序】下载和使用说明
  18. 大数据可视化之气象数据可视化(雷达、云图、落区、等值面)
  19. 电视卡众说纷纭(三):软压卡硬压卡区别
  20. 【账号篇】华硕电脑-华硕账号注销教程

热门文章

  1. HALCON 21.11:深度学习笔记---Data(数据)(3)
  2. 全自动光电整纬机安装和功能分析
  3. linux查看程序的快捷键,linux操作系统的快捷键及命令讲解
  4. prisma graphql 工具基本使用
  5. AMD授权GPU给Intel?苏姿丰:没有的事
  6. HyperLedger Fabric 1.0的Transaction处理流程
  7. samba add new smbpasswd recycle
  8. React.js入门基础一
  9. 三点拓宽自己的工作思路
  10. Silverlight Tools只支持英文版VS2008