Catlike Coding网站文章解析 -- 2.Procedural Grid
本章內容
- 創建一個閉合的cube mesh
- 給cube添加帶弧度平滑的邊緣
- 定義法線
- 使用sub-meshes(子mesh)
- 創建一個常規shader
- 合并碰撞體
1.合成一個cube
上一章https://mp.csdn.net/postedit/89474068我們已經實現了一個平面mesh。一個cube由6個平面組成,我們可以由6個上一章實現的平面修改位置和方向后組成一個cube,這種方法看起來挺好,但是其實并不實用,雖然我們也可以過?Mesh.CombineMeshes這個函數合并這6個mesh,但是我們最好還是一次性創建這個cube。
2.創建cube的頂點
一個cube中的頂點可以分為三類。角上的頂點(下圖3),邊上的頂點(下圖2)以及面上的頂點(下圖1)
具體每個種類多少其實就是算數學題,具體如何算的可以參考原文,最后計算定點數量代碼如下?
?之后再計算每個頂點的位置,最后結果如下
?
?3.添加三角形
?具體實現方法類似之前的文章,但是涉及更多的數學知識,這里不細講了,大體思路是先計算cube四周的四個面,之后計算上面(top)和下面(bottom)。最后效果如下
4.使邊緣圓滑
基于之前的代碼,重新創建一個類命名為RoundedCube,并添加一個Roundness變量用于控制圓滑程度
這回我們要自己計算法線。先定義法線數組
創建一個函數,用于計算法線以及使得頂點沿著法線位置變化形成弧度
?計算法線的原理是依據roundness參數形成一個更小的cube,大cube和小cube之間頂點的向量差就是大cube上該點的法線。如下圖所示:
?通過roundness參數,來確定大cube上每個頂點對應的小cube位置
最終結果
5.拆分Mesh
如何計算UV使得其可以渲染紋理?我們可以將總的三角形列表拆分成多個子mesh(三角形列表),其之間共用一些相同的頂點,這也使得我們可以使用不同材質去渲染每一組子三角形列表。
創建三個子列表
計算每個三角形列表
不再是設置mesh.triangles? 而是設置子mesh
如果只設置一個材質,那么會發現只有兩個面會渲染(一組)
?在mesh render中material array設置三個材質,會得到正確結果
?6.渲染Gird
我們可以使用shader,在shader中指定如何計算使用一個紋理而代替在mesh中存儲uv信息。
Unity中默認shader的代碼如下:
因為我們mesh中沒有uv信息,我們需要在shader中計算,所以我們在頂點著色器中計算uv信息,并將其傳入到surface shader中
通過使用shader中的keyword,我們可以控制shader的渲染
根據所設置的keyword提供支持?
根據所選keyword設置來進行uv計算
可以看出同一個shader通過設置keyword來提供三個material對應的效果
?但是能看出來grid line沒有和四邊形完全對應上,更糟的是因為我們使用的是世界坐標系,當我們旋轉和移動這個cube的時候效果會更奇怪。
我們需要使用的是在圓滑之前原始的cube中的頂點位置,因此我們通過將其存儲在mesh中傳入shader。因為我們這個例子中vertex color channel沒有用,所以我們就用它來存儲這個信息。
在shader中使用color channel存儲的信息進行計算
7.添加碰撞體
添加一個碰撞體時候的樣子
為平坦的部分添加box collider(共三個)?
為圓滑邊緣添加capsule collider(12個)
最后的效果
https://thumbs.gfycat.com/RingedCornyBlesbok-mobile.mp4
?
總結
以上是生活随笔為你收集整理的Catlike Coding网站文章解析 -- 2.Procedural Grid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RBF network
- 下一篇: Cortex-Mx简介及CPU主流架构