position based dynamics
应读者需求,今天终于抽出时间把这篇文章整理一下,不过只把其中的一些公式进行了推导,如果需要细看,仍需阅读论文
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
position based dynamics相关推荐
- PBD(Position Based Dynamics)学习笔记
符号说明 仿真物体包括 NNN 个节点和 MMM 个约束. 每个节点 i∈[1,...,N]i\in [1,...,N]i∈[1,...,N] 包含的参数有质量 mim_imi .位置 xi\bol ...
- SPH(光滑粒子流体动力学)流体模拟实现六:Position Based Fluid(PBF)
SPH(光滑粒子流体动力学)流体模拟实现六:Position Based Fluid(PBF) PBF方法和前篇提到的PCISPH方法类似,都属于迭代矫正法.PCISPH是通过迭代预测压力,通过压力变 ...
- 惊涛怪浪(double dam-break) -- position based fluids
切入正题之前,先胡说八道几句. 据说爱因斯坦讲过:关于这个世界最难以理解的就是它是可以被理解的.人类在很长的时间里,都无法认知周围变幻莫测的世界,只能编造出无数的神祗来掌控世上万物的运行.到了 ...
- 机器学习如何彻底改变游戏中的物理模拟
来源:AI科技评论本文约2600字,建议阅读10分钟 神经网络模拟物理比物理解算器快5000倍. 量子力学奠基者之一.英国理论物理学家保罗·狄拉克(Paul Dirac)在1929年说过:" ...
- 基于CUDA的粒子系统的实现
基于CUDA的粒子系统的实现 用途: 这篇文章作为代码实现的先导手册,以全局的方式概览一下粒子系统的实现大纲. 科普: 对粒子进行模拟有两种基本方法: Eulerian(grid-based) met ...
- Games104 Lecture 11 物理系统:高级应用
物理系统:高级应用 1 角色控制器 1.1 构建一个控制器 1.2 角色控制器的特点和小细节: 2 布娃娃系统 Ragdoll 3 衣料模拟 3.1 基于mesh的衣料模拟 4 破坏模拟 5 载具模拟 ...
- 移动端布料的模拟 -基于DynamicBone的实现
布料的现状: 衣服的长裙可以说是现代布料模拟的难点表现,一般的衣服会好一些(市场上有做的不太好的做法,就是为了衣服居然添加不少约束来限制人的运动)看了一下现在的基本上都是飘飘然的感觉是有,但是要能容忍 ...
- 【物理模拟】PBD算法详解
参考: Matthia Muller的十分钟物理(他就是PBD算法的发明者) https://matthias-research.github.io/pages/tenMinutePhysics/ 原 ...
- 动画or漫画相关工具
用boujou做跟踪,maya做动画和模型,houdini做特效,arnold渲染 NUKE 是由The Foundry公司研发的一数码节点式合成软件 CG公司流程解决方案软件,shotgun May ...
最新文章
- asp.net mvc 简易上传功能
- BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]
- 处理android11以上无法删除相册图片的问题
- Asp.net中使用WEB编辑控件FCKEditor
- ROS笔记(19) 摄像头仿真
- 汇编在嵌入式编程中的作用_如何在嵌入式Power BI报表中以编程方式传递凭据
- 错误:invalid_client没有应用程序名称
- Graduation Speech 毕业典礼致辞__转载
- 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
- 首次适应算法的模拟C++实现(没有)
- bootstrap3 侧边导航栏
- 北邮邮箱配置客户端教程(如Windows自带邮件)
- 前台js中图片picture设置
- python csv文件转json
- 懂得拥有也要学会放弃
- bitnamigitlab_bitnami gitlab 安装
- 【基于MatlabSDOF弹性反应谱批量生成程序】下载和使用说明
- 大数据可视化之气象数据可视化(雷达、云图、落区、等值面)
- 电视卡众说纷纭(三):软压卡硬压卡区别
- 【账号篇】华硕电脑-华硕账号注销教程