一种基于位置的实时刚体仿真方法及其系统与流程

文档序号:30171506发布日期:2022-05-26 10:36阅读:142来源:国知局
一种基于位置的实时刚体仿真方法及其系统与流程

1.本发明利用compute shader技术,提高刚体仿真的计算效率,具有实时模拟刚体运动的能力,特别是一种基于位置的实时刚体仿真方法及其系统。


背景技术:

2.主流的刚体模拟方案使用若干粒子模拟刚体并计算每个粒子的受力情况,根据受到的力更新粒子的速度和位置,需要精确计算受到的各种外力才能实现逼真的模拟效果。每种外力都有对应的系数,针对不同的刚体或者不同的环境都需要手动调整各项系数,不够便捷,而受力计算复杂且难以精确计算,表现效果欠佳,存在进一步的提升空间。


技术实现要素:

3.为克服上述问题,本发明的目的是提供一种基于位置的实时刚体仿真方法,能借助gpu的强大并行计算能力,更加精确地模拟刚体运动。
4.本发明采用以下方案实现:一种基于位置的实时刚体仿真方法,所述方法包括如下步骤:
5.步骤s1、设置刚体粒子的数据结构;
6.步骤s2、对刚体粒子施加外力,得到各刚体粒子受到外力后的预测位置;
7.步骤s3、将刚体粒子与场景中其它物体之间进行碰撞处理,获得碰撞后的刚体粒子的位置偏移量;
8.步骤s4、利用形状匹配算法将碰撞后的刚体粒子恢复到静态形状,来获得最终的刚体
9.粒子的预测位置;
10.步骤s5、根据预测位置和位置偏移量来更新当前帧的刚体位置信息及速度。
11.进一步的,所述步骤s1进一步具体为:所述刚体粒子的数据结构为:computebuffer positions,computebuffer predictedpos,computebuffer velocities;其中,positions保存粒子的实际位置,predictedpos及velocities用以在仿真中计算各刚体粒子的预测位置和速度数据,并最终将预测位置的值赋给positions。
12.进一步的,所述步骤s2进一步具体为:在刚体粒子仿真流程开始时,刚体粒子会受到重力作用,则开启刚体粒子总数的线程数计算各刚体粒子受到外力后的预测位置predictedpos:
13.predictedpos[id]=positions[id]+deltatime(velocities[id]+gravity
·
deltatime);其中id为当前粒子的索引值,positions为保存粒子的实际位置,velocities为粒子的速度,deltatime为每一帧的时间步长,gravity为重力值。
[0014]
进一步的,所述步骤s3进一步具体为:将刚体粒子与场景中其它物体之间进行碰撞处理;开启刚体粒子总数的线程数,对于每个刚体粒子,获取周围邻域的粒子信息,得到两个粒子之间的距离d,当粒子间距离小于粒子的直径时则利用碰撞检测公式计算粒子的
位置偏移量;碰撞检测公式如下:
[0015][0016][0017][0018]
其中,δxi为当前粒子的位置偏移量,δxj为与粒子i发生碰撞的粒子j的位置偏移量,ω为质量的倒数,d为粒子之间的距离;
[0019]
经过这一步,粒子的碰撞预测位置为:
[0020]
collidepredictedpos[id]=predictedpos[id]+δxi[0021]
其中,id为当前粒子的索引值,δxi为当前粒子经过碰撞检测产生的位置偏移量。
[0022]
进一步的,所述步骤s4进一步具体为:利用形状匹配算法将碰撞后的刚体粒子恢复到静态形状,形状匹配本质上就是求两个点集和xi之间的最优变换,即:存在一个旋转矩阵r和平移向量t和t0;
[0023][0024][0025][0026]
x
cm
=t
[0027]
其中,mi为粒子的质量,为粒子初始时的位置,xi为粒子当前的位置,表示对每个粒子的质量与初始位置的乘积进行求和,表示对每个粒子的质量进行求和,表示对每个粒子的质量与当前位置的乘积进行求和;即最优变换向量分别为初始形状的质心和实际形状的质心x
cm

[0028]
r=a
pq
s-1
[0029][0030][0031]
pi=x
i-x
cm
[0032]
[0033]
其中,pi为粒子当前位置xi与实际形状的质心x
cm
的差,qi为粒子初始位置与初始形状的质心的差,表示对每个粒子的质量mi与pi以及的乘积进行求和,表示qi的转置,(a
pq
)
t
表示a
pq
的转置,s-1
表示s的逆,r为所求的旋转矩阵;
[0034]
则位置偏移为:
[0035]
经过这一步,粒子的最终预测位置为:
[0036]
finalpredictedpos[id]=collidepredictedpos[id]+δxi[0037]
其中,id为当前粒子的索引值,δxi为当前粒子经过形状匹配产生的位置偏移量,collidepredictedpos[id]为碰撞预测位置。
[0038]
进一步的,所述步骤s5进一步具体为:开启粒子总数的线程数,根据粒子的最终预测位置和初始位置计算粒子的速度,然后将计算完成的粒子最终预测位置数据赋值给粒子的实际位置数据,
[0039]
velocity[id]=(finalpredictedpos[id]-positions[id])/deltatime
[0040]
positions[id]=finalpredictedpos[id]
[0041]
其中,id为当前粒子的索引值,deltatime为每一帧的时间步长;
[0042]
最终得出所有刚体粒子的位置信息,并利用图形绘制接口将位置信息绘制到屏幕上,实现刚体粒子实时模拟。
[0043]
本发明还提供了一种基于位置的实时刚体仿真系统,所述系统包括数据结构设置模块、外力施加模块、碰撞处理模块、形状匹配模块、以及更新模块;
[0044]
所述数据结构设置模块,用于设置刚体粒子的数据结构;
[0045]
所述外力施加模块,用于对刚体粒子施加外力,得到各刚体粒子受到外力后的预测位置;所述碰撞处理模块,用于将刚体粒子与场景中其它物体之间进行碰撞处理,获得碰撞后的刚体粒子的位置偏移量;
[0046]
所述形状匹配模块,利用形状匹配算法将碰撞后的刚体粒子恢复到静态形状,来获得最终的刚体粒子的预测位置;
[0047]
所述更新模块,根据预测位置和位置偏移量来更新当前帧的刚体位置信息及速度。
[0048]
进一步的,所述数据结构设置模块的实现方式进一步具体为:所述刚体粒子的数据结构为:computebuffer positions,computebuffer predictedpos,computebuffer velocities;其中,positions保存粒子的实际位置,predictedpos及velocities用以在仿真中计算各刚体粒子的预测位置和速度数据,并最终将预测位置的值赋给positions。
[0049]
进一步的,所述外力施加模块的实现方式进一步具体为:在刚体粒子仿真流程开始时,刚体粒子会受到重力作用,则开启刚体粒子总数的线程数计算各刚体粒子受到外力后的预测位置predictedpos:
[0050]
predictedpos[id]=positions[id]+deltatime(velocities[id]+gravity
·
deltatime);其中id为当前粒子的索引值,positions为保存粒子的实际位置,velocities为粒子的速度,deltatime为每一帧的时间步长,gravity为重力值。
[0051]
进一步的,所述碰撞处理模块的实现方式进一步具体为:将刚体粒子与场景中其
它物体之间进行碰撞处理;开启刚体粒子总数的线程数,对于每个刚体粒子,获取周围邻域的粒子信息,得到两个粒子之间的距离d,当粒子间距离小于粒子的直径时则利用碰撞检测公式计算粒子的位置偏移量;碰撞检测公式如下:
[0052][0053][0054][0055]
其中,δxi为当前粒子的位置偏移量,δxj为与粒子i发生碰撞的粒子j的位置偏移量,ω为质量的倒数,d为粒子之间的距离;
[0056]
经过这一步,粒子的碰撞预测位置为:
[0057]
collidepredictedpos[id]=predictedpos[id]+δxi[0058]
其中,id为当前粒子的索引值,δxi为当前粒子经过碰撞检测产生的位置偏移量。
[0059]
进一步的,所述形状匹配模块的实现方式进一步具体为:利用形状匹配算法将碰撞后的刚体粒子恢复到静态形状,形状匹配本质上就是求两个点集和xi之间的最优变换,即:存在一个旋转矩阵r和平移向量t和t0;
[0060][0061][0062][0063]
x
cm
=t
[0064]
其中,mi为粒子的质量,为粒子初始时的位置,xi为粒子当前的位置,表示对每个粒子的质量与初始位置的乘积进行求和,表示对每个粒子的质量进行求和,表示对每个粒子的质量与当前位置的乘积进行求和;即最优变换向量分别为初始形状的质心和实际形状的质心x
cm

[0065]
r=a
pq
s-1
[0066][0067][0068]
pi=x
i-x
cm
[0069][0070]
其中,pi为粒子当前位置xi与实际形状的质心x
cm
的差,qi为粒子初始位置与初始形状的质心的差,表示对每个粒子的质量mi与pi以及的乘积进行求和,表示qi的转置,(a
pq
)
t
表示a
pq
的转置,s-1
表示s的逆,r为所求的旋转矩阵;
[0071]
则位置偏移为:
[0072]
经过这一步,粒子的最终预测位置为:
[0073]
finalpredictedpos[id]=collidepredictedpos[id]+δxi[0074]
其中,id为当前粒子的索引值,δxi为当前粒子经过形状匹配产生的位置偏移量,collidepredictedpos[id]为碰撞预测位置。
[0075]
进一步的,所述更新模块的实现方式进一步具体为:开启粒子总数的线程数,根据粒子的最终预测位置和初始位置计算粒子的速度,然后将计算完成的粒子最终预测位置数据赋值给粒子的实际位置数据,
[0076]
velocity[id]=(finalpredictedpos[id]-positions[id])/deltatime
[0077]
positions[id]=finalpredictedpos[id]
[0078]
其中,id为当前粒子的索引值,deltatime为每一帧的时间步长;
[0079]
最终得出所有刚体粒子的位置信息,并利用gpu图形绘制接口将位置信息绘制到屏幕上,实现刚体粒子实时模拟。
[0080]
本发明的有益效果在于:针对基于力的刚体模拟无法精确计算受到的外力且需根据不同情况手动调整各项外力系数的缺点,本专利提出了一种基于位置的实时刚体仿真方法,并借助gpu的强大并行计算能力,更加精确地模拟刚体运动。提高刚体仿真的计算效率,具有实时模拟刚体运动的能力。
附图说明
[0081]
图1是本发明的方法流程示意图。
[0082]
图2是本发明的系统原理框图。
具体实施方式
[0083]
下面结合附图对本发明做进一步说明。
[0084]
请参阅图1所示,本发明的一种基于位置的实时刚体仿真方法,所述方法包括如下步骤:
[0085]
步骤s1、设置刚体粒子的数据结构;
[0086]
步骤s2、对刚体粒子施加外力,得到各刚体粒子受到外力后的预测位置;
[0087]
步骤s3、将刚体粒子与场景中其它物体之间进行碰撞处理,获得碰撞后的刚体粒子的位置偏移量;
[0088]
步骤s4、利用形状匹配算法将碰撞后的刚体粒子恢复到静态形状,来获得最终的刚体
[0089]
粒子的预测位置;
[0090]
步骤s5、根据预测位置和位置偏移量来更新当前帧的刚体位置信息及速度。
[0091]
下面结合一具体实施例对本发明作进一步说明:
[0092]
刚体模拟分为以下5个步骤:
[0093]
1、刚体粒子数据结构
[0094]
刚体粒子的数据结构如下:
[0095]
computebuffer positions;
[0096]
computebuffer predictedpos;
[0097]
computebuffer velocities;
[0098]
其中,positions保存粒子的实际位置,predictedpos及velocities用以在仿真中计算各刚体粒子的预测位置和速度数据,并最终将预测位置的值赋给positions。
[0099]
2、对刚体粒子施加外力
[0100]
在仿真流程开始时,粒子会受到重力、引力等外部作用力,则开启刚体粒子总数的线程数计算各刚体粒子受到外力后的预测位置:
[0101]
predictedpos[id]=positions[id]+deltatime(velocities[id]+gravity
·
deltatime)
[0102]
其中id为当前粒子的索引值,deltatime为每一帧的时间步长,gravity为重力值。
[0103]
3、碰撞检测
[0104]
该步骤计算刚体粒子与场景中其它物体之间的碰撞,同一个刚体中的粒子不需要计算碰撞。开启刚体粒子总数的线程数,对于每个刚体粒子,获取周围邻域的粒子信息。首先计算两个粒子之间的距离d,当粒子间距离小于粒子的直径时则利用碰撞检测公式计算粒子的位置偏移量。碰撞检测公式如下:
[0105][0106][0107][0108]
其中,δxi为当前粒子的位置偏移量,δxj为与粒子i发生碰撞的粒子j的位置偏移量,ω为质量的倒数,d为粒子之间的距离。
[0109]
经过这一步,粒子的碰撞预测位置为:
[0110]
collidepredictedpos[id]=predictedpos[id]+δxi[0111]
其中,id为当前粒子的索引值,δxi为当前粒子经过碰撞检测产生的位置偏移量。
[0112]
4、形状匹配
[0113]
经过第3步的计算,刚体的形状发生了改变,这一步利用形状匹配算法将刚体恢复到静态形状,
[0114]
形状匹配本质上就是求两个点集和xi之间的最优变换,即:存在一个旋转矩阵r和平移向量t和t0;
[0115][0116][0117][0118]
x
cm
=t
[0119]
其中,mi为粒子的质量,为粒子初始时的位置,xi为粒子当前的位置,表示对每个粒子的质量与初始位置的乘积进行求和,表示对每个粒子的质量进行求和,表示对每个粒子的质量与当前位置的乘积进行求和。即最优变换向量分别为初始形状的质心和实际形状的质心x
cm

[0120]
r=a
pq
s-1
[0121][0122][0123]
pi=x
i-x
cm
[0124][0125]
其中,pi为粒子当前位置xi与实际形状的质心x
cm
的差,qi为粒子初始位置与初始形状的质心的差,表示对每个粒子的质量mi与pi以及的乘积进行求和,表示qi的转置,(a
pq
)
t
表示a
pq
的转置,s-1
表示s的逆,r为所求的旋转矩阵。
[0126]
则位置偏移为:
[0127]
经过这一步,粒子的最终预测位置为:
[0128]
finalpredictedpos[id]=collidepredictedpos[id]+δxi[0129]
其中,id为当前粒子的索引值,δxi为当前粒子经过形状匹配产生的位置偏移量,collidepredictedpos[id]为碰撞预测位置。
[0130]
5、更新当前帧的刚体位置信息及速度
[0131]
开启粒子总数的线程数,根据粒子的预测位置和初始位置计算粒子的速度,然后将计算完成的粒子预测位置数据赋值给粒子的实际位置数据。
[0132]
velocity[id]=(finalpredictedpos[id]-positions[id])/deltatime
[0133]
positions[id]=finalpredictedpos[id]
[0134]
其中,id为当前粒子的索引值,deltatime为每一帧的时间步长;。
[0135]
最终得出所有刚体粒子的位置信息,并利用图形绘制接口将位置信息绘制到屏幕
上,实现刚体实时模拟。
[0136]
如图2所示,本发明还提供了一种基于位置的实时刚体仿真系统,所述系统包括数据结构设置模块、外力施加模块、碰撞处理模块、形状匹配模块、以及更新模块;
[0137]
所述数据结构设置模块,用于设置刚体粒子的数据结构;
[0138]
所述外力施加模块,用于对刚体粒子施加外力,得到各刚体粒子受到外力后的预测位置;
[0139]
所述碰撞处理模块,用于将刚体粒子与场景中其它物体之间进行碰撞处理,获得碰撞后的刚体粒子的位置偏移量;
[0140]
所述形状匹配模块,利用形状匹配算法将碰撞后的刚体粒子恢复到静态形状,来获得最终的刚体粒子的预测位置;
[0141]
所述更新模块,根据预测位置和位置偏移量来更新当前帧的刚体位置信息及速度。
[0142]
其中,所述数据结构设置模块的实现方式进一步具体为:所述刚体粒子的数据结构为:computebuffer positions,computebuffer predictedpos,computebuffer velocities;其中,positions保存粒子的实际位置,predictedpos及velocities用以在仿真中计算各刚体粒子的预测位置和速度数据,并最终将预测位置的值赋给positions。
[0143]
所述外力施加模块的实现方式进一步具体为:在刚体粒子仿真流程开始时,刚体粒子会受到重力作用,则开启刚体粒子总数的线程数计算各刚体粒子受到外力后的预测位置predictedpos:
[0144]
predictedpos[id]=positions[id]+deltatime(velocities[id]+gravity
·
deltatime);其中id为当前粒子的索引值,positions为保存粒子的实际位置,velocities为粒子的速度,deltatime为每一帧的时间步长,gravity为重力值。
[0145]
所述碰撞处理模块的实现方式进一步具体为:将刚体粒子与场景中其它物体之间进行碰撞处理;开启刚体粒子总数的线程数,对于每个刚体粒子,获取周围邻域的粒子信息,得到两个粒子之间的距离d,当粒子间距离小于粒子的直径时则利用碰撞检测公式计算粒子的位置偏移量;碰撞检测公式如下:
[0146][0147][0148][0149]
其中,δxi为当前粒子的位置偏移量,δxj为与粒子i发生碰撞的粒子j的位置偏移量,ω为质量的倒数,d为粒子之间的距离;
[0150]
经过这一步,粒子的碰撞预测位置为:
[0151]
collidepredictedpos[id]=predictedpos[id]+δxi[0152]
其中,id为当前粒子的索引值,δxi为当前粒子经过碰撞检测产生的位置偏移量。
[0153]
另外,所述形状匹配模块的实现方式进一步具体为:利用形状匹配算法将碰撞后
的刚体粒子恢复到静态形状,形状匹配本质上就是求两个点集和xi之间的最优变换,即:存在一个旋转矩阵r和平移向量t和t0;
[0154][0155][0156][0157]
x
cm
=t
[0158]
其中,mi为粒子的质量,为粒子初始时的位置,xi为粒子当前的位置,表示对每个粒子的质量与初始位置的乘积进行求和,表示对每个粒子的质量进行求和,表示对每个粒子的质量与当前位置的乘积进行求和;即最优变换向量分别为初始形状的质心和实际形状的质心x
cm

[0159]
r=a
pq
s-1
[0160][0161][0162]
pi=x
i-x
cm
[0163][0164]
其中,pi为粒子当前位置xi与实际形状的质心x
cm
的差,qi为粒子初始位置与初始形状的质心的差,表示对每个粒子的质量mi与pi以及的乘积进行求和,表示qi的转置,(a
pq
)
t
表示a
pq
的转置,s-1
表示s的逆,r为所求的旋转矩阵;
[0165]
则位置偏移为:
[0166]
经过这一步,粒子的最终预测位置为:
[0167]
finalpredictedpos[id]=collidepredictedpos[id]+δxi[0168]
其中,id为当前粒子的索引值,δxi为当前粒子经过形状匹配产生的位置偏移量,collidepredictedpos[id]为碰撞预测位置。
[0169]
进一步的,所述更新模块的实现方式进一步具体为:开启粒子总数的线程数,根据粒子的最终预测位置和初始位置计算粒子的速度,然后将计算完成的粒子最终预测位置数据赋值给粒子的实际位置数据,
[0170]
velocity[id]=(finalpredictedpos[id]-positions[id])/deltatime
[0171]
positions[id]=finalpredictedpos[id]
[0172]
其中,id为当前粒子的索引值,deltatime为每一帧的时间步长;
[0173]
最终得出所有刚体粒子的位置信息,并利用gpu图形绘制接口将位置信息绘制到屏幕上,实现刚体粒子实时模拟。
[0174]
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1