【燃脂+護膚,5倍塑瘦閃電褲】 【生髪神器】限時搶購!! 【一抹擺脫癢痛!】 【7天1週期,去灰更快速】 【根治灰甲不復發】 【日本新技術離子殺菌去灰甲】 【古方祛濕茶】
查看: 166|回復: 0

虛幻4渲染編程(物理模擬篇)【第四卷:基于粒子的物理水面】 ...

[複製鏈接]
神の无2019-9-7

1

主題

1

帖子

22

積分

新手上路

Rank: 1

積分
22
發表於 2019-9-7 12:03:35 | 顯示全部樓層 |閱讀模式
<p><b>MY BLOG DIRECTORY:</b></p><span class="LinkCard-backdrop" style="background-image:url(http://pic2.zhimg.com/v2-85232016fea4bc8cb72b55b8b3f53e6d_180x120.jpg)"></span><span class="LinkCard-content"><span class="LinkCard-text"><span class="LinkCard-title" data-text="true">YivanLee:專題概述及目錄</span><span class="LinkCard-meta"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--InsertLink" fill="currentColor" viewBox="0 0 24 24" width="17" height="17"><path d="M6.77 17.23c-.905-.904-.94-2.333-.08-3.193l3.059-3.06-1.192-1.19-3.059 3.058c-1.489 1.489-1.427 3.954.138 5.519s4.03 1.627 5.519.138l3.059-3.059-1.192-1.192-3.059 3.06c-.86.86-2.289.824-3.193-.08zm3.016-8.673l1.192 1.192 3.059-3.06c.86-.86 2.289-.824 3.193.08.905.905.94 2.334.08 3.194l-3.059 3.06 1.192 1.19 3.059-3.058c1.489-1.489 1.427-3.954-.138-5.519s-4.03-1.627-5.519-.138L9.786 8.557zm-1.023 6.68c.33.33.863.343 1.177.029l5.34-5.34c.314-.314.3-.846-.03-1.176-.33-.33-.862-.344-1.176-.03l-5.34 5.34c-.314.314-.3.846.03 1.177z" fill-rule="evenodd"></path></svg></span>zhuanlan.zhihu.com</span></span><span class="LinkCard-imageCell"> r67K0t0PC0PuMc2X.jpg </span></span><p><b>INTRODUCTION:</b></p><p>最近在晚上我的PhyGX物理引擎,目前我的PhyGX已經有了剛體,軟體,流體等初級功能,下面就來爲PhyGX添加物理水面的模擬功能。</p><p>我把水面抽象爲一層粒子組成的表面,水面粒子因爲張力約束,所以它會在一個定點周圍運動。</p><figure data-size="normal"><noscript> WV96YZwn9ew0yw6e.jpg </noscript> LRLRrYPe3xElEwR7.jpg </figure><p>整個約束結構由四部分組成,T爲水面粒子的固定位置,P爲水面自由運動的粒子,S爲水面粒子和水面粒子固定位置的浮力約束器,L爲兩個水面粒子之間的張力約束器。最後可得如下效果:</p><figure data-size="normal"><noscript> tAnKRKewKmQWeQEk.jpg </noscript> X0g0zqR5i24v2GnN.jpg </figure><hr/><p>MAIN CONTENT:</p><p>水面約束結構的構造過程分幾步:</p><p>第一步:先構造出自由粒子的位置。</p><figure data-size="normal"><noscript> ZzUc7839ccNWuKCn.jpg </noscript> yk4JItqNKP57P471.jpg </figure><p>第二步:構造出固定粒子的位置。</p><figure data-size="normal"><noscript> Cx2L972Jag47G575.jpg </noscript> BeuJlQkQj4KblyA4.jpg </figure><p>第三步:構造橫向張力約束。</p><figure data-size="normal"><noscript> VTpogX782Ttt8KP2.jpg </noscript> LemZ8I68dqy2D86N.jpg </figure><p>第四步:構造縱向張力約束。</p><figure data-size="normal"><noscript> Whl4Ch9LtHa7zHVV.jpg </noscript> qV3ZzNJnN7OnnNNV.jpg </figure><p>第五步:構造浮力約束</p><figure data-size="normal"><noscript> bY2u1Phf8ueeD9FB.jpg </noscript> P30hZe90nRF2EHC8.jpg </figure><p>完整代碼代碼如下:</p><div class="highlight"><pre><code class="language-text">void FPhyGXProduceParticleNet::BuildParticleNet_Buoyancy(const FTransform&amp; ActorRootTrans){        BeginBuildNet();                int32 NX = 50;        int32 NY = 50;        //-------        //-------        //-------        int32 NCXH = (NX - 1);        int32 NCXV = NY;        //|||||||        //|||||||        //|||||||        int32 NCYH = NX;        INT32 NCYV = (NY - 1);        float CellLength = 20.0f;        Particles.AddUninitialized(NX * NY * 2);        DistanceConstraints.AddUninitialized(NCXH * NCXV + NCYH * NCYV + NX * NY);        for (int32 y = 0; y &lt; NY; y++)        {                for (int32 x = 0; x &lt; NX; x++)                {                        Particles[x + NX * y].InitVerletParticle(FVector(x * CellLength, y * CellLength, 0), true, false, false, false, 1, 10);                }        }        for (int32 y = 0; y &lt; NY; y++)        {                for (int32 x = 0; x &lt; NX; x++)                {                        Particles[x + NX * y + NX * NY].InitVerletParticle(FVector(x * CellLength, y * CellLength, 0), false, false, false, false, 1, 10);                        Particles[x + NX * y + NX * NY].bDrawDebug = false;                }        }                //        for (int32 y = 0; y &lt; NCXV; y++)        {                for (int32 x = 0; x &lt; NCXH; x++)                {                        DistanceConstraints[x + NCXH * y].InitDistanceConstraint(Particles[y * NX + x], Particles[y * NX + x + 1], CellLength, FVector(1, 1, 1));                }        }        for (int32 y = 0; y &lt; NCYV; y++)        {                for (int32 x = 0; x &lt; NCYH; x++)                {                        DistanceConstraints[x + NCYH * y + NCXH * NCXV].InitDistanceConstraint(Particles[y * NCYH + x], Particles[(y + 1) * NCYH + x], CellLength, FVector(1, 1, 1));                }        }        for (int32 y = 0; y &lt; NY; y++)        {                for (int32 x = 0; x &lt; NX; x++)                {                        DistanceConstraints[NCXH * NCXV + NCYH * NCYV + x + y * NX].InitDistanceConstraint(Particles[x + y * NX], Particles[x + y * NX + NX * NY], 1, FVector(0.01, 0.01, 0.01));                }        }        FinishBuildNet(ActorRootTrans);}</code></pre></div><p>最後</p><figure data-size="normal"><noscript> Rbfp5ZpF55yzEnj1.jpg </noscript> o7auIGQ4ZJ7OQ0AZ.jpg </figure><hr/><p><b>SUMMARY AND OUTLOOK:</b></p><p>其實我的做法還是比較簡單粗暴的,後續還有很多優化空間,比如對固定粒子還可以加入渦流解算來驅動水面粒子進行渦流運動。以上是我的個人思考所得的模擬物理水面的方式,如果有大佬還有更好方法請留言指教。</p><p>Enjoy it。</p><hr/><p><b>NEXT:</b></p><p>我打算暫停物理篇系列,感覺自己有點走偏了,我畢竟是個美術,還是應該集中更多精力在美術設計深耕上,先這樣吧。</p>
回復

使用道具 舉報