您需要 登录 才可以下载或查看,没有账号?注册
x
Introduction
My name is Aquib Hussain, I am 23 years old. I have pursued a Bachelor of Science degree in the field of Animation and VFX at AAFT school of animation. I am currently working as an FX Technical Director at DNEG (Double Negative) in one of its branches in India. DNEG being my first full-time job has led me to work on some of the coolest and most exciting projects, such as Stranger Things: Season 4, Devotion, and many others.
介绍
我的名字是阿基布·侯赛因,我今年23岁。我在AAFT动画学院攻读动画和视觉特效领域的理学学士学位。我目前在DNEG(双负)印度的一家分行担任外汇技术总监。DNEG是我的第一份全职工作,这使我参与了一些最酷,最令人兴奋的项目,例如《怪奇物语:第4季》,《奉献》等等。
Getting Acquainted With Houdini
I always had this set goal to be an FXTD. I used to work with some other DCC packages, which took a lot of time to do a certain task. While they were all not bad and had their own strengths, for me some things became a lot repetitive.
So, me being a very lazy person, I started researching ways to automate certain tasks that led me to discover this incredibly awesome program – Houdini, and a word affiliated with it was proceduralism. So something in my instinct told me that this is going to save a lot of effort down the process so I didn’t wait long and started going through pretty much all the resources I can find on how to get started with Houdini and found my way around it. Turns out there’s a lot more we can learn on the internet than we anticipate. So in a way, my own laziness motivated me to learn Houdini.
结识胡迪尼
我一直有一个设定的目标,成为一名FFTD。我曾经使用其他一些DCC软件包,这需要花费大量时间来完成某个任务。虽然他们都不错,有自己的长处,但对我来说,有些事情变得重复了很多。
所以,我是一个非常懒惰的人,我开始研究自动化某些任务的方法,这使我发现了这个令人难以置信的令人敬畏的程序 - Houdini,与之相关的一个词是程序主义。因此,我的直觉告诉我,这将节省整个过程中的大量精力,所以我没有等待太久,就开始研究几乎所有我能找到的关于如何开始使用Houdini的资源,并找到了解决问题的方法。事实证明,我们在互联网上可以学到的东西比我们预期的要多得多。因此,在某种程度上,我自己的懒惰促使我学习胡迪尼。
The Jibaro-Inspired Project
I started binging this show on Netflix named Love, Death+Robots, and I was blown away, especially by the Jibaro episode, which showcased some of the best animation and FX works I have ever seen. I immediately realized that a lot of fanart and cosplays were definitely on their way. So just like most artists, I was also inspired. But Inspiration wasn't enough – I still needed to figure out the best way to get it done in a time frame while not disturbing my work and sleep schedule.
So, I set a goal in my mind to make something which is somewhat resembling the original and is fairly optimized. The first thing I did was to set up a previz animation and a camera in Maya which I locked in at this stage itself.
吉巴罗启发的项目
我开始在Netflix上狂欢这部名为《爱,死亡+机器人》的节目,我被震撼了,尤其是Jibaro剧集,它展示了我见过的最好的动画和FX作品。我立即意识到,很多同人艺术和角色扮演肯定正在路上。所以就像大多数艺术家一样,我也受到了启发。但灵感还不够 - 我仍然需要找出最好的方法,在一段时间内完成它,同时不打扰我的工作和睡眠时间表。
因此,我在脑海中设定了一个目标,即制作一些与原始版本有些相似且经过优化的东西。我做的第一件事就是在玛雅(Maya)设置一个previz动画和一个摄像机,我在这个阶段就锁定了它。
The Water and the Terrain
Before we set up the water simulation, there's one thing that's very important to prepare first i.e, the environment itself. FLIP solver is very good at simulating water behaviors so as long as the prerequisites are right we can pretty much just run the FLIP sim and get pretty good results.
To elaborate further, I'll use the terrain I created for my project.
水和地形
在我们设置水模拟之前,首先要准备一件事非常重要,即环境本身。FLIP求解器非常擅长模拟水的行为,因此只要先决条件正确,我们几乎可以运行FLIP SIM并获得非常好的结果。
为了进一步详细说明,我将使用我为项目创建的地形。
I started with a grid and sculpted areas as I want my water to move. If I want to make the flow faster in an area I'll just decrease the depth, and if I want an area with slower movements I'll increase the depth. It's that simple! This way we can literally art direct the flow of water. The splashes and interaction as well were just set up through basic collision VDBs.
我从网格和雕刻区域开始,因为我希望我的水移动。如果我想使一个区域的流动更快,我只会减少深度,如果我想要一个运动较慢的区域,我会增加深度。就是这么简单!通过这种方式,我们可以从字面上指导水的流动。飞溅和交互也是通过基本的碰撞VDB设置的。
Now to the Meshing Technique! The first question that arises is why, why do we want to "not" use the traditional method of water meshing where we just convert the flip particles into VDBs at a super less resolution? Well, I am in no case and scenario saying we should not use the usual method in production but maybe sometimes we don't have enough memory or computational power in our own PCs. In that case, I hope this method can save you a lot of time.
Water Setup:
现在来看看网格划分技术!出现的第一个问题是,为什么我们要“不”使用传统的水网格划分方法,即我们只需以超低的分辨率将翻转粒子转换为VDB?好吧,我在任何情况下都说我们不应该在生产中使用通常的方法,但有时我们在自己的PC中没有足够的内存或计算能力。在这种情况下,我希望这种方法可以为您节省大量时间。
供水设置:
Above is the FLIP simulation I get from just setting the terrain right. I deleted the particles outside the camera frustum. It’s all basic FLIP sim.
After the FLIP simulation we have to split the simulation into two parts:
The first part is to isolate the FLIP simulation only to the height we want.
The second part is all the particles which have a higher velocity and a distance quite apart from each other.
以上是我从设置正确的地形中获得的FLIP模拟。我删除了相机视锥体外的粒子。这都是基本的FLIP模拟游戏。
在FLIP模拟之后,我们必须将模拟分成两部分:
第一部分是将FLIP仿真仅隔离到我们想要的高度。
第二部分是所有具有较高速度和距离的粒子。
In the above GIF, we can see the separation between the base flow layer (Green) and the splash (Red). Basically, we are separating the splashes with the water flow. Once we have our base water flow separated, we can lay out a grid with enough resolution and size within the bounds of our FLIP simulation.
Once we have that we can transfer attributes such as vorticity and velocity on the grid. Once we have this information on the grid, we can use them to deform the geometry. Now, I don't want to bore all readers with a math explanation, so here is the vex code I used to deform the grid:
在上面的GIF中,我们可以看到基础流层(绿色)和飞溅(红色)之间的分离。基本上,我们将飞溅物与水流分开。一旦我们分离了基础水流,我们就可以在FLIP模拟的范围内布置一个具有足够分辨率和大小的网格。
一旦我们有了这个,我们就可以在网格上传递诸如涡度和速度之类的属性。一旦我们在网格上有了这些信息,我们就可以使用它们来变形几何体。现在,我不想用数学解释来烦扰所有读者,所以这是我用来变形网格的vex代码:
As for the splashes, we can just go ahead and process them in a traditional VDB conversion method. Later we can merge and blend the splash and the deformed grid by using a light position transfer.
至于飞溅,我们可以继续使用传统的VDB转换方法处理它们。稍后,我们可以通过使用光位置传递来合并和混合飞溅和变形的网格。
Here is a screenshot of both splash mesh (Red) and deformed grid (Green) merged.
We can now smooth the final mesh and cache it out. This will give us a mesh that will have a deformed grid as a base flow with some meshes being the splash and it’ll save a lot of time in processing the material for rendering later in Arnold.
下面是合并的初始网格(红色)和变形网格(绿色)的屏幕截图。
现在,我们可以平滑最终网格并将其缓存出来。这将为我们提供一个网格,该网格将具有变形的网格作为基本流,其中一些网格是飞溅的,它将节省大量处理材质的时间,以便稍后在 Arnold 中渲染。
Setting Up the Leaves
The Meshing Process we discussed in the previous chapter actually makes setting up the leaves a bit easier. The challenge here would be to set up a Scattering System that doesn't kill the hardware before and while the simulation.
So, to set it up we first need some primitives with leaf shader. I found some online but we can also prepare them however we want. Just make sure that they're not overkilling the mesh. I'd recommend having a 2D grid with a maximum of 8 divisions. Once we have that we have to set up the scattering in a way that:
In the first frame, it emits all over the water deformed grid as we want our first frame to have.
In the next frames, we can scatter random mesh outside the camera frustum to keep the leaves being generated and flowing in view once we set up the Vellum solver later.
设置叶子
我们在上一章中讨论的网格划分过程实际上使设置叶子变得更加容易。这里的挑战是建立一个散射系统,该系统在模拟之前和期间不会杀死硬件。
因此,要设置它,我们首先需要一些带有叶子着色器的基元。我在网上找到了一些,但我们也可以按照自己的意愿准备它们。只要确保他们没有过度使用网格即可。我建议使用最多8个分区的2D网格。一旦我们有了这个,我们必须以这样的方式设置散射:
在第一帧中,它在整个水变形网格上发射,就像我们希望第一帧一样。
在下一帧中,我们可以在相机视锥体外部散布随机网格,以便在稍后设置Vellum求解器后保持生成和流动的叶子。
Once we have the scattering, we can use our trusty and handy Vellum to take over. The trick here is to have the geometry stick to the surface of our water-deformed grid. To do so, a Velocity volume is prepared from the FLIP simulation and used as an advection force in the Vellum solver.
一旦我们有了分散,我们就可以使用我们可靠而方便的Vellum来接管。这里的诀窍是让几何体粘附在我们的水变形网格的表面。为此,从 FLIP 仿真中准备了速度体积,并将其用作牛皮套焊机中的平流力。
And to make the geometry stick to the deformed water grid, here's the VEX code used in a geometry wrangle with the second input being the water grid we cached out earlier:
为了使几何图形粘附在变形的水格栅上,下面是几何图形争论中使用的 VEX 代码,第二个输入是我们之前缓存的水栅:
Recreating the Golden Woman's Dance
First of all, I am not in any way or form an Animator. In fact, I am terrible at it. But my very thanks to the incredible team at Adobe to provide us with this vast library of mocap and characters at Mixamo. I downloaded different varieties of dancing animation and processed them in Houdini using KineFX, which I myself had never used before but surprisingly it is something that is super easy to get started and is very accessible. With a little bit of exploration, trials, and errors, I was able to combine some mocap data, and just like editing a video, I was able to compile an original dance.
再现金女之舞
首先,我不是以任何方式或形式成为动画师。事实上,我对此感到很糟糕。但是,我非常感谢Adobe令人难以置信的团队在Mixamo为我们提供了这个庞大的动作捕捉和角色库。我下载了不同种类的舞蹈动画,并使用KineFX在Houdini中处理它们,我自己以前从未使用过,但令人惊讶的是,它非常容易上手,并且非常容易访问。通过一点点的探索,尝试和错误,我能够结合一些动作捕捉数据,就像编辑视频一样,我能够编译一个原创的舞蹈。
As for the jewelry, the modeling part was all done by painstakingly placing individual curves using the Vellum drape and mostly done manually. This step saved me a lot from having anything to do later with the entire jewelry simulation. This one had an additional advection set up similar to the leaves to make the jewelry react to the water flow.
The real meshing was actually done post-simulation, as Vellum gives us some interesting attributes such as pScale, which I used to instance some spheres to give it a look while also not worrying about intersections.
至于珠宝,建模部分都是通过使用牛皮纸垂坠精心放置单个曲线来完成的,并且主要是手动完成的。这一步使我节省了很多东西,使我以后无法进行整个珠宝模拟。这个有一个类似于叶子的额外平流设置,使珠宝对水流做出反应。
真正的网格划分实际上是在仿真后完成的,因为Vellum为我们提供了一些有趣的属性,例如pScale,我用它来实例化一些球体,以使其看起来,同时也不用担心交叉点。
But here's a fun fact! The small parts of the jewelry are not even simulated! To keep the longer jewelry from being inteviend too much from smaller ones, I set up a procedural system to deform the smaller parts, and here's how I did it! To demonstrate it I'll use a head with individual strands.
1. Use the point deform system to make the strand attached to the dancing body.
但这是一个有趣的事实!珠宝的小部分甚至没有模拟!为了防止较长的珠宝从较小的珠宝中得到太多,我建立了一个程序系统来变形较小的部分,这就是我是如何做到的!为了演示它,我将使用带有单个链的头部。
1.使用点变形系统使股线附着在舞蹈体上。
2. Calculate the velocity of the deformed strand.
2. 计算变形链的速度。
3. Calculate a CurveU attribute starting from the tip to the end. Tip being 0 and end being 1.
3. 计算从尖端到结束的 CurveU 属性。提示为 0,结束为 1。
4. Now we can add the position of each strand with the inverse of the velocity which is calculated from body movement and multiply the results with the CurveU value. This will make a gradient transition of position from start to finish making it look like a strand reacting to the motion.
5. Ray the results back to the body using the closest point ray and lift the strands again a bit towards the normals to keep them from intersecting.
4.现在,我们可以将每条链的位置与根据身体运动计算的速度的倒数相加,并将结果乘以CurveU值。这将使位置从开始到结束的梯度转换,使其看起来像一根对运动做出反应的链。
5.使用最近的点射线将结果射回身体,并再次将链向法线抬起一点,以防止它们相交。
And here you go! You can use this algorithm for all the strands in your systems to emulate the movement of small jewelry.
你来了!您可以将此算法用于系统中的所有股线,以模拟小珠宝的运动。
Rendering and Lighting
Once I had all the elements in Houdini, it was very important to clean up all the geometry before we cache out everything into alembics. By cleanup, I mean deleting every attributes that I don't need and making sure we have all the attributes in the correct context.
渲染和光照
一旦我在Houdini中获得了所有元素,在我们把所有东西都缓存到alembics之前,清理所有的几何体是非常重要的。通过清理,我的意思是删除我不需要的每个属性,并确保我们在正确的上下文中拥有所有属性。
Because I knew I would be rendering in Arnold, I made sure to promote all the attributes I need to the vertex context. Please note that the attributes need to be in the RGB (for example V.r, V.g, Vb) format, not in any other array. Only then the utility data will work in Arnold. And Maya always reads attributes from vertices.
Once all the clean-up was done, I simply cached everything out as an alembic, imported everything in a new Maya scene, and set up the shaders using the aiUserDataColor utility. I won't go in-depth on how to use aiUserDataColor as there are a lot of good tutorials online.
因为我知道我将在 Arnold 中渲染,所以我确保将我需要的所有属性提升到顶点上下文。请注意,属性需要采用 RGB 格式(例如 V.r、V.g、Vb),而不是任何其他数组。只有这样,效用数据才能在 Arnold 中工作。Maya 总是从顶点读取属性。
完成所有清理后,我只需将所有内容缓存为 alembic,将所有内容导入新的 Maya 场景中,然后使用 aiUserDataColor 实用程序设置着色器。我不会深入介绍如何使用aiUserDataColor,因为网上有很多好的教程。
For motion blur, I also baked the velocity data in Houdini to the Cd attribute as the motion blur from alembics when the mesh is inconsistent is not possible. We can simply replace the Motion Vector source for any mesh as shown in the picture below, just make sure that for every mesh, in the export setting under in attribute editor, we have the export vertex colors enabled.
对于运动模糊,我还将Houdini中的速度数据烘焙到Cd属性,因为当网格不一致时,运动模糊来自alembics是不可能的。我们可以简单地替换任何网格的运动矢量源,如下图所示,只需确保对于每个网格,在属性编辑器下的导出设置中,我们启用了导出顶点颜色。
The lighting was done using a 3-point lighting setup with the key light exposing more to the back side as it enhances the silhouette of the character.
Additional lighting specifically in the reflective area was also added to get some shiny details which were later enhanced in the compositing stage.
Water had a similar 3-point lighting setup (exactly the same position and orientation) but the exposures were manipulated to make it less apparent in the reflections.
照明是使用3点照明设置完成的,关键光更多地暴露在背面,因为它增强了角色的轮廓。
还增加了专门用于反射区域的额外照明,以获得一些闪亮的细节,这些细节后来在合成阶段得到了增强。
水具有类似的3点照明设置(完全相同的位置和方向),但曝光纵以使其在反射中不那么明显。
For the camera, animation I just stick with the original camera I set during the previz and rendered everything using lower than default settings except the camera AA set to 4 and motion blur enabled. Everything was rendered as a single layer with one additional crypto material pass for color correction in composting.
对于摄像机,动画我只是坚持使用我在预览期间设置的原始摄像机,并使用低于默认设置渲染所有内容,除了摄像机AA设置为4并启用运动模糊。所有内容都渲染为单个图层,并带有一个额外的加密材料通道,用于堆肥中的颜色校正。
Conclusion
The entire project took 12 days from setting up the animation to rendering out and compositing. The main challenges were to set up a reliable system for optimizing everything and not spend any money on outsourcing at any stage. Cumulatively, it all went down as a challenge of planning and knowing the prerequisites.
My tip to beginners would be not to listen to any tips, always listen to yourself! Learn what interests you and you’ll excel!
结论
整个项目从设置动画到渲染和合成花了12天时间。主要的挑战是建立一个可靠的系统来优化一切,而不是在任何阶段在外包上花任何钱。累积起来,这一切都是计划和了解先决条件的挑战。
我对初学者的建议是不要听任何提示,总是听自己!了解您感兴趣的内容,您将脱颖而出!
|