Unity3D Adam Demo的學習與研究

?

?

1.簡述

這篇文章是對Adam各種相關資料了解后進行一些精簡的內容。如果你想仔細研究某個技術請跳轉至unity相關頁面。

Adam官方頁面:?https://unity3d.com/cn/pages/adam

搬運視頻以及資源包網盤下載:?http://pan.baidu.com/s/1jH6NF86

?

Adam這個demo由8個人的團隊耗時6個月(part1四個月,part2兩個月)打造完成。

其中使用到的軟件如下:

Model:?3DSMax, Marvelous Designer, ZBrush

Texture:?Substance Painter

Tiled textures:?Quixel megascans

Animation:?MotionBuilder

?

關于megascans這個軟件單獨介紹下,算是quixel近年的新計劃,可以理解為實景掃描素材庫

提供模型和貼圖的下載,內容主要以戶外自然為主,但目前收費較貴。

?

技術方面主要集中在2種燈光和新加入的PostProcessing上,其次就是物理插件CaronteFX

?

?

2.技術深入

?

2.1 - 環境與表現

?

2.1.1 - Adam的布料撕裂效果

這個一開始看demo時的確以為是物理模擬插件CaronteFX的功勞

但看了視頻才知道是max里做好,然后導出abc格式到unity中來完成的

?

我后來在看demo的目錄文件時也發現了位于SteamingAssets的abc文件

?

播放效果:

?

abc格式導入工具的github地址如下:

https://github.com/unity3d-jp/AlembicImporter

?

?

2.1.2 - Adam背上的線纜和面部破損

線纜確實是CaronteFX實現了

?

而面部破損因為不需要表現破碎動畫,先是在Max里用tp粒子制作的原型,然后再交由建模師制作實際模型

?

關于布料方面以及CaronteFX的使用,極力推薦篇文章:

https://blogs.unity3d.com/cn/2017/01/04/adam-vfx-in-the-real-time-short-film/

?

?

2.1.3 - 室內環境中的煙霧動畫

?

下圖直接摘自官網

?

3A游戲中常見的粒子序列,這里使用3dmax的插件PhoenixFD生成。?

關于陣列圖轉換,這里順帶提一下unity正在開發的工具VFXToolbox(https://forum.unity3d.com/threads/release-thread-vfx-toolbox-image-sequencer.438465)

這在unity adam的相關文章中有提到,我后來試用了一下,不僅僅是陣列圖和序列圖互轉這么簡單,可能以后要集成一套圖形處理的功能進去。

?

?

2.1.4 - Puddles水坑漣漪效果

?

同樣使用PhoenixFD制作的漣漪序列,并將這個NormalMap賦予unity粒子序列。

?

下圖直接摘自官網

?

順帶一提,以上兩個效果的作者是Zdravko Pavlov,已經有11年的相關工作經驗

?

?

2.1.5 - SceneManagement多場景并行編輯

得益于unity5.3加入的SceneManagement,可以多人并行編輯一個大場景了

?

在觀察demo執行文件時,會發現有非常多的場景文件

使用HHD Hex Editor打開后確實可以看見,整個大的場景中不同內容被放在多個小的場景文件內

就像視頻中說的那樣,多人協作時分成多個小場景編輯,這樣非常方便

?

?

?

2.1.6 - 編輯器狀態啟用IK

(Unite Europe 2016視頻中確實有一個InEditorIK的腳本)

?

有時候要在編輯器內調節IK,視頻中提到了這個問題。

解決方法在這里:https://forum.unity3d.com/threads/set-up-ik-in-editor.332035/

?

?

?

2.2 - 角色處理

在視頻中Lu和Guard的布料都是用CaronteFX來做的,但實際上資源包中,是通過Unity自定義關節實現的

只有Sebastian的資源包使用了CaronteFX布料

?

2.2.1 - 自定義關節

來看一下這兩個角色的自定義關節。

?

角色Lu

?

角色Guard

?

Lu只有一小塊地方用了unity布料。因為這一塊在demo中會隨風飄揚

?

對于布料模擬這是個好方法,但是它并不能解決動態穿插問題

?

?

2.2.2 -?CaronteFX的布料效果

Sebastian是一個單獨拆出來的包,原因是它的布料和之前的那些角色不同。它用的是CaronteFX的烘培布料

在這個資源包里會發現居然帶了一個純運行版的CaronteFX,你不能編輯它,你只能用。。

?

單是看GC沒發現什么問題,不過得注意下內存中數據量的問題,烘焙數據大約占了150mb左右,還有烘培速度

?

?

carontefx的烘培速度確實非常慢,Adam團隊自身也對此做了一些代理對象處理。

?

另外carontefx其實并不簡單,其來頭就是RealFlow的開發公司NextLimit

https://www.nextlimit.com/products/name/carontefx/

?

?

?

2.3 - 光照部分

在github上,unity專門把Adam光照部分提取了出來(TubeLight,AreaLight,Volumetric fog)

https://github.com/Unity-Technologies/VolumetricLighting

?

在Unite Europe 2016 - The making of Adam demo這部視頻里,有對這些內容進行細致的講解

?

2.3.1 -?TubeLight柱形光照

?

沒有陰影,相比AreaLight更低品質,但是便宜

?

如果直接丟到空項目里用是這樣的,因為它必須相機掛上PostProcessing才行

?

?

此時就可以看見效果了

?

?

還可以設置ShadowPlane,控制光照的擴散

比如這里就約束了底部擴散,你可以直接改生成出來的Shadow Plane坐標和旋轉,來控制它。

?

2.3.2 -?Area Light區域光照

看視頻中的講解,似乎是通過CommandBuffer在AfterLighting處理后,拿到G-Buffer的數據進行采樣,并通過DrawMesh來繪制光照。

?

?

?

和TubeLight一樣,相機需要掛載PostProcessing。

如果需要和Adam里一樣有霧光效果,需要掛載兩個腳本

LightManagerFogLights,LightManagerFogEllipsoids

?

此時可以看見霧的效果(gif)

?

?

2.3.3 -?Volumetric fog 體積霧

因為在Adam demo中霧效是和燈光整合的,所以也就沒法測試了。

FogEllipsoid是具體代碼。

另外相關文章中提及到的LightShafts,github地址如下:

https://github.com/robertcupisz/LightShafts

?

?

2.4 - 一些其他工具

大氣散射和平面反射在Blacksmith的demo中就已經講過,這里不做介紹

Blacksmith demo學習:http://www.cnblogs.com/hont/p/5658491.html

?

2.4.1 -?RigMeister2000

這是一個角色骨架調試工具,它位于Adam相關的角色資源包里

這個包里有兩個腳本RigMeister2000和VisibleSkeleton。

前者可以校對骨骼朝向和作為一個約束工具使用,并且調試朝向。后者可以繪制出骨骼gizmos

?

掛上VisibleSkeleton之后,效果如下

?

?

RigMeister2000這個工具比較謎,因為除了Adam外的人形角色都沒有綁定這個腳本

它在LateUpdate里會去做約束處理。但實際上你開不開這個腳本變化不大,或者說基本上沒變化。

?

?

2.4.2 -?Wind

一個小工具,一個繪制箭頭Gizmos的腳本

?

?

?

3.結語

?

在Unite 2016的兩部視頻中,unity自己挖了不少坑,比如Delay了1年的Sequence工具。。

unite2016中提及的新特性大致如下:

1.CrowdSystem集群系統,這個說會100%在unity中集成,但目前來看應該還要等。

2.CustomCape feathers simulation?in Unity5.4一個羽毛模擬組件,說是在unity5.4中加入,但目前應該是Delay。

3.Motion Vectors for temporal Anti-Aliasing in Unity5.4使用運動向量的隨機采樣抗鋸齒?這個未知

4.Texture Array 這個Demo的地形中有用到,并且5.4確實加入了,在adam室外部分的Shader中可以找到這個類型。

?

另外室外環境的包中有一個地形工具TETerrain,但是這個工具似乎是缺少編輯器套件,我沒辦法用大的地表重新切片

所以這部分內容只好跳過。

?

關于Adam這個demo的研究這里就結束了,因為一直有各種事,delay到現在才開始寫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541946.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java File類boolean isFile()方法(帶示例)

File類boolean isFile() (File Class boolean isFile()) This method is available in package java.io.File.isFile(). 軟件包java.io.File.isFile()中提供了此方法。 This method is used to check whether the file is specified by filepath is a file or not. 此方法用于檢…

要加油!

現實中我容易佩服一個人。 一個頑強的女人,一個艱苦奮斗的男人..... 但是在網絡的世界里,我沒有佩服過幾個,但是不得不說的就是冰河。同樣的年齡人家做的事情和我們做的事情差距是多么的大,真的想想心里都是天壤之別。 比一比才知…

Java DataOutputStream writeInt()方法及示例

DataOutputStream類writeInt()方法 (DataOutputStream Class writeInt() method) writeInt() method is available in java.io package. writeInt()方法在java.io包中可用。 writeInt() method is used to write the given integer value to the basic DataOutputStream as 4 b…

python安卓自動化實現方法_uiautomator +python 實現安卓UI自動化

簡單實例注:安卓6.0以上的手機不會自動安裝app-uiautomator.apk和app-uiautomator-test.apk,需要手動安裝,否則報錯ioerror RPC server not starteduiautomator pythonHTMLTestRunner 安卓UI自動化實現#coding:utf-8from uiautomator importD…

ES6特性之:Spread操作符

Spread操作符(...),也稱作展開操作符,作用是將可迭代的(Iterable)對象進行展開。 比如有2個數組,我們要將其中一個數組中所有元素插入到另一個數組中,通過Spread操作符,就可以這樣進行: var fruits ["…

Java類class isMemberClass()方法及示例

類的類isMemberClass()方法 (Class class isMemberClass() method) isMemberClass() method is available in java.lang package. isMemberClass()方法在java.lang包中可用。 isMemberClass() method is used to check whether the underlying class is a member class or not.…

velocity自定義函數_velocity基本語法和總結

一:基本語法:1、#set(#a "a")$a ##輸出語句時直接寫變量的名稱即可2、判斷語句:#if($a "a") ##判斷語句沒有括號,也是直接輸出$a3、數組:#set($arry [0..10])$foreach($i in $arry)$i ##換行#e…

docker-machine指定cpu個數

序 給本機的一個服務壓測,結果半天qps上不了萬,而且經常跑滿cpu,搞半天發現,docker里頭才1核1G內存。原來boot2docker默認給docker-machine分配1個cpu和1G內存。 修改配置 docker-machine create \--driver virtualbox \--virtual…

Java ClassLoader findResources()方法與示例

ClassLoader類findResources()方法 (ClassLoader Class findResources() method) findResources() method is available in java.lang package. findResources()方法在java.lang包中可用。 findResources() method is used to find all the resources with the given resource …

Java ByteArrayInputStream mark()方法與示例

ByteArrayInputStream類mark()方法 (ByteArrayInputStream Class mark() method) mark() method is available in java.util package. mark()方法在java.util包中可用。 mark() method is used to set the current mark position in the stream from where read or write can b…

java mediainfo.dll_MediaInfo庫的簡單使用

想到一個問題, 如何獲得一個圖像文件(比如jpg, bmp, png)的信息. 自己查查文件的格式, 寫一個解析, 應該不困難; 但是找了下現成的, 發現MediaInfo庫已經可以非常好的實現需要的功能了.MediaInfo可以在sourceforge上找到, 是一個解析視頻,音頻, 圖片等媒體文件的庫. 可以得到文…

Redis配置和常用命令

1 redis.conf配置文件:2 引用3 #是否作為守護進程運行4 daemonize yes5 #配置pid的存放路徑及文件名,默認為當前路徑下6 pidfile redis.pid7 #Redis默認監聽端口8 port 63799 #客戶端閑置多少秒后,斷開連接 10 timeout 300 11 #日志顯示級別 …

oracle中dbms_DBMS中的功能依賴性和屬性關閉

oracle中dbms功能依賴 (Functional Dependency) A relational Database management System (RDBMS) represents the database o a collection of relations/tables. A functional dependency is a constraint between two sets of attributes in a relation. It is the propert…

java invoke 泛型_利用Java反射機制和泛型,全自動解析json

有啦這個簡直,太爽啦,利用Java 反射機制,利用Class 就可以得到 類的 變量 Field[] fieldscls.getDeclaredFields();還可以通過類中 的方法名字 去執行這個方法m1 cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class)…

2_C語言中的數據類型 (四)整數與無符號數

1.1 sizeof關鍵字 sizeof是c語言關鍵字,功能是求指定數據類型在內存中的大小,單位:字節 sizeof與size_t類型 1.1 int類型 1.1.1 int常量,變量 int就是32位的一個二進制整數,在內存當中占據4個字節…

python 示例_Python TextCalendar類別| pryear()方法與示例

python 示例Python TextCalendar.pryear()方法 (Python TextCalendar.pryear() Method) pryear() method is an inbuilt method of the TextCalendar class of calendar module in Python. It works on text calendars. It uses an instance of TextCalendar class and prints …

Spring實戰——通過Java代碼裝配bean

上篇說的是無需半行xml配置完成bean的自動化注入。這篇仍然不要任何xml配置,通過Java代碼也能達到同樣的效果。 這么說,是要把上篇的料拿出來再煮一遍? 當然不是,上篇我們幾乎都在用注解的方式如ComponentScan Component等就完成了…

java 謂詞_java8-謂詞(predicate)

傳遞代碼我們首先看一個例子,假設你有一個 Apple 類,它有一個getColor方法,還有一個變量inventory保存著一個Apples的列表。你可能想要選出所有的綠蘋果,并返回一個列表。通常我們用篩選(filter)一詞來表達這個概念。在 Java 8之前…

getlong_Java LocalDateTime類| 帶示例的getLong()方法

getlongLocalDateTime類的getLong()方法 (LocalDateTime Class getLong() method) getLong() method is available in java.time package. getLong()方法在java.time包中可用。 getLong() method is used to get the value as long for the given temporal field from this dat…