我曾在 Daz3d、poser、makehuman 等软件中看到,当穿上衣服的模型被修改(通常带有变形)时,衣服的 3d 模型会自动重塑。我有一种情况,我必须在 opengl es 中做类似的事情。有人可以告诉我这样做的基本逻辑吗?变形再次起作用还是有其他方法?是否有网格修改库
问问题
79 次
1 回答
1
我会这样处理它:
网
通常表示为某个拓扑网格中的嵌套点网络。为此,我会将衣服分成“圆柱体”。每个“圆柱体”将由点网格表示,如下所示:
struct _pnt { float x,y,z; bool stretch,done; }; _pnt pnt[na][nb][3];
在哪里
na
应取决于气缸直径,但通常na=36
在所有情况下都足够了nb
应该取决于“圆筒”高度和布料细节......
每个点都有它的 3D 坐标,这些坐标
x,y,z
最初设置为布料的形状,就像它充满了气球一样的空气。如果该stretch
点位于某些橡皮筋上,则标志会迫使其粘在皮肤上。这done
只是计算的临时标志。动力学
现在,如果您想计算实际的布料形状,那么您需要:
done=false
为所有点设置- 将所有
stretch
ed 点设置到人/虚拟皮肤(网格表面)上的相应位置并为其设置done=true
。这些点通常会覆盖整个切片(b=constant,a=0,1,2,...na-1)
对于每个拉伸点
(a0,b0)
计算链接点。它背后的数学/物理学是这样的:所以扫描点
(a0+1,b0),(a0+2,b0)...
,如果你碰到另一个stretch
点,使用悬链线曲线,如果不使用牛顿/达朗伯动力学模拟来获得位置(为此你需要增加速度。当计算位置时,vx,vy,vz
为所有计算点设置。_pnt
done=true
此外,如果一个点的计算位置在化身网格内,您必须将其位置设置为化身表面并将其速度设置为零。
处理网格自碰撞(动态影响)
搜索所有未计算的点
done==false
并从其计算的邻居中插入它们的位置。
如果你得到这个工作,你可以为每个点添加更多的特征,比如弹性、质量、...系数等等。
于 2016-03-19T11:55:55.693 回答