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.mzph.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…