先上一張效果圖:
(依舊是翰老弟)
(導演:我們需要一個刮風的效果,道具組,上大風扇)
(導演:咔?。?!行了,道具組你們明天不用來上班了)
(大風扇:怪我咯)
OK,效果雖然渣了點,但我們還是進入今天的正題吧,我記得在PS或者是某些圖片編輯工具里都有類似給目標添加一個大風的效果,雖然這樣做最終圖片也會被風刮得模糊不清了,但有時候就是需要這樣的效果,不是嗎?雖然我就是那樣的逗比,所以我再次秉承了暴力解決一切的終極技巧,將大風扇搬了過來。
我的做法是首先確定風向,然后根據風向與每個頂點的法線計算點積,最終用點積來確定每個頂點將會受到風力的影響程度。
這里用一個枚舉來統計風向,目前也就六種風向,分別是三個軸的正反向(不過注意,風向是以模型的本地坐標系計算的):
/// <summary> /// 風向 /// </summary> public enum WindDirection { /// <summary> /// x軸正向 /// </summary> xForward = 0, /// <summary> /// x軸反向 /// </summary> xReverse = 1, /// <summary> /// y軸正向 /// </summary> yForward = 2, /// <summary> /// y軸反向 /// </summary> yReverse = 3, /// <summary> /// z軸正向 /// </summary> zForward = 4, /// <summary> /// z軸反向 /// </summary> zReverse = 5 }//計算風向 switch (BlowsDirection) { case WindDirection.xForward: _blowsDirection = (Vector3.zero - new Vector3(1, 0, 0)).normalized; break; case WindDirection.xReverse: _blowsDirection = (Vector3.zero - new Vector3(-1, 0, 0)).normalized; break; case WindDirection.yForward: _blowsDirection = (Vector3.zero - new Vector3(0, 1, 0)).normalized; break; case WindDirection.yReverse: _blowsDirection = (Vector3.zero - new Vector3(0, -1, 0)).normalized; break; case WindDirection.zForward: _blowsDirection = (Vector3.zero - new Vector3(0, 0, 1)).normalized; break; case WindDirection.zReverse: _blowsDirection = (Vector3.zero - new Vector3(0, 0, -1)).normalized; break; default: _blowsDirection = Vector3.zero; break; }記錄每個頂點將會受到風力的影響程度(計算風向與頂點法線點積)://計算每個頂點將會受到的風力影響 _dots = new float[_vertices.Length]; for (int i = 0; i < _vertices.Length; i++) { _dots[i] = Vector3.Dot(_mesh.normals[i], _blowsDirection); }然后,直接開啟大風扇(也就是讓頂點開始根據風向偏移,主要是模型的邊緣頂點以及背離風向的頂點):for (int i = 0; i < vertices.Length; i++) { if (_dots[i] <= 0) { vertices[i] += _blowsDirection * BlowsPower * _dots[i] * Random.Range(BlowsPowerMinRate, BlowsPowerMaxRate); } }好了,代碼簡直簡單暴力得無話可說。二、屬性面板如下:
Blows Direction:風向
Blows Power:風力
Blows Power Min Rate:風力變化最小速率(當為0時,風力為0)
Blows Power Max Rate:風力變化最大速率(當為1時,風力最大,再大則翻倍)
Update Blows:是否持續刮風?不的話就刮一次,模型保持被吹一次時的情景
Update Rate:持續刮風的速率,越小刮得越快(也就是刷新的越快,越小看著越不卡,只不過性能遭不住不怪我)
三、運行:
在任意靜態模型上添加腳本MeshBlows,勾選UpdateBlows,然后直接運行場景就可以看到效果:
再上幾張效果圖:
(橫向瞬移)
(垂直瞬移)
-----by MeshEditor
新聞熱點
疑難解答