在實現《亂紀元大冒險》(見:http://www.cnblogs.com/wantnon/p/4857072.html)中由於質子展開失敗形成的變形幾何體和眼睛。幾何體經過一系列形變最后變成眼睛。這個顯然是應該用morph(blendshape)來做了,恰好unity5是支持blendshape的。
例如上圖中 正四面體 通過progressive morph依次變形為立方體、球體、眼球。
我的建模過程,首先創建那個 4段x4段x4段 的立方體,然后復制成三份,依次修改為 正四面體、球體 和 眼球。
將立方體修改為球體最容易,直接使用spherify(球化)修改器 即可,但要注意還需要修改一下平滑組,使球體法線變成完全圓滑的。
將球體修改為眼球的方法是先將眼球壓細,然后再對各截面進行單獨壓縮。
將立方體修改為正四面體是最麻煩的,需要建兩個正三角形面片,架設成如下樣子:
其中一個水平放置,另一個與它成arccos(1/3)=70.5287793度角放置。
用上面這個支架比着,在線框模式下對立方體各截面進行縮放。最后得到重心正好與世界原點對其的正四面體。
另外注意當立方體一條邊縮成正四面體一個頂點時,不要縮得太過火,真的把它縮成一個點就不好了,只要縮成一個遠看像個點,但近看又是一條邊就好了。
最后檢查:
1,正四面體的Move值是否是(0,0,0)。
2,正四面體、立方體、球體、眼球 的Scale值是否全為(100,100,100),Rotate值是否全為(0,0,0)。
假如一個物體不滿足scale值為(100,100,100),比如是(50,50,50),那一定要改成(100,100,100),但是改完之后發現物體變大了一倍,那怎么辦?辦法是進入頂點層級,選中所有頂點並進行scale,使縮小一倍。同理,Move和Rotate也都是這么搞。總之就是記住一點,永遠不要在模型級別使用旋轉、平移 和 縮放,而要在頂點級別去使用。為啥呢?因為morph只按頂點局部坐標進行混合,不會理采模型級別的整體變換。
為正四面體添加morpher修改器,可以看到許多變形通道,由於我現在只需要一個變形過程,即 正四面體->立方體->球體->眼球,所以只使用一個通道就夠了。我們在通道0中依次把 立方體、球體、眼球 添加進去,它們會出現在下面的Progressive Morph的Target List中。然后調整通道0的值,就可以觀察到變形過程:當值為0時是正四面體,當值為100/3時是立方體,當值為100/3*2時是球體,當值為100時為眼球。
由於我在unity里想用程序去控制morph進程,所以這里只是創建了morph,沒有K動畫。在unity里gameObject.GetComponent<SkinnedMeshRenderer> ().SetBlendShapeWeight (通道ID, blendShapeWeight)就可以對變形進度進行設置了,這里的通道ID和blendShapeWeight跟3dmax中的通道ID和通道值是完全對應的。
法線問題:
將帶morph的模型通過fbx導入到unity之后,在默認設置下,變形過程中法線是不更新的。這會導致形狀變對了但是光照效果不對。
解決辦法如下:
(引自:http://docs.unity3d.com/Manual/class-Mesh.html)
There are two ways to import BlendShapes with normals:
1 Set Normals import mode to Calculate, this way same logic will be used for calculating normals on a mesh and BlendShapes.
2 Export smoothing groups information to the source file. This way, Unity will calculate normals from smoothing groups for mesh and BlendShapes.
If you want tangents on your BlendShapes then set Tangents import mode to Calculate.
我只試了第一種方法,即在unity的Import Settings中將Normals改成Calculate,這樣可能性能會有所影響,而且未必能忠實地做到與3dmax中的法線效果一致,但對於我目前這個需求來說已經夠了,所以就沒再試第二種方法。