前腐后继 发表于 2006-12-8 19:21:00

[转帖]再谈实时演算布料的建模方式。

<strong>&nbsp;<br/><br/></strong>以前做布料实验的时候,总是只能按顺序创建好了一块四四方方的布,然后运算,实用性非常低,毕竟很多地方的使用都是直接通过读取模型来建模,比如说一块三角型的旗子,或者说面片组成的头发。那么如何通过顶点数据和顶点索引这两个东西来建立布料所需要的Mass-Spring模型呢? <p></p><p>首先,我们可以假设每个顶点就是一个弹簧的节点,那么每个三角形索引就是弹簧,这里会出现一个问题,即三角形索引会出现很多重复的情况,那么我们就需要对索引的重复情况进行处理。至于处理方法,则是把一组索引0&nbsp;1&nbsp;2拆成三条线:0-1,&nbsp;0-2,&nbsp;1-2,然后加入到一个队列里,然后之后每次插入新的线的时候,就检查已经插入进去的数据,看是否有重复。</p><p>经过上一步的处理,我们得到的线的队列实际上就是我们的弹簧列表,然后根据模型的顶点数据和弹簧列表来生成我们需要的布料模型,用以下结构来描叙一个弹簧节点:</p><p>struct&nbsp;CMySpring<br/>{<br/>&nbsp;D3DXVECTOR3&nbsp;vMypos;&nbsp;//&nbsp;弹簧节点的位置<br/>&nbsp;D3DXVECTOR3&nbsp;vNormal;&nbsp;//&nbsp;弹簧节点的法线(用来算风力)<br/>&nbsp;D3DXVECTOR3&nbsp;vPower;&nbsp;//&nbsp;当前该弹簧节点所受的合力(用来计算下一帧该节点的位置)<br/>&nbsp;D3DXVECTOR3&nbsp;vAcceleration;&nbsp;//&nbsp;当前该节点的加速度情况(配合&nbsp;合力来运算位置)<br/>&nbsp;D3DXVECTOR3&nbsp;vVelocity;&nbsp;//&nbsp;当前节点的速度<br/>&nbsp;DWORD&nbsp;&nbsp;dwNodeCount;&nbsp;//&nbsp;当前节点连接到其他节点的数目<br/>&nbsp;float&nbsp;len;&nbsp;//&nbsp;连接到每个其他节点的弹簧的长度<br/>&nbsp;DWORD&nbsp;nodeIndex;&nbsp;//&nbsp;连接到每个其他节点的索引<br/>};</p><p>之后的弹簧力的运算方式在我的另一篇文章中有详细叙说,以下是一组截图:</p><p>第一帧时原图:</p><p><img src="http://gd.91.com/bbs/Storage/PostAccessory/2005-06-02/bf98032f-2df3-49e4-8a3b-b70e37ea74ad.jpg" border="0" alt=""/></p><p>第二帧模型被一个来自人物中心向四周吹的点风吹散时的样子:</p><p><img src="http://gd.91.com/bbs/Storage/PostAccessory/2005-06-02/736a5bdc-054e-498b-ba74-e09ad8a3541d.jpg" border="0" alt=""/></p><p>风继续吹之后的模型:</p><p><img src="http://gd.91.com/bbs/Storage/PostAccessory/2005-06-02/85dd2ce9-7262-41da-b100-687da958fd42.jpg" border="0" alt=""/></p><p>由于模型的很多顶点并不是连在一起的,所以在算布料的时候会被算成是很多块小布。</p>
页: [1]
查看完整版本: [转帖]再谈实时演算布料的建模方式。 1 !