2023-6-23-unreal-engine官方出品的黑客帝国场景学习分析2

之前的教程都是很小范围的景观或者小镇局部,这对展示建筑场景而言是不足够的,做出来的话顶多选几个摄像机位置截图一下,这样的话有没有ue的实时渲染没啥区别,在max、blender中做也差不多,顶多就是制作过程中ue可以通过实时渲染观察效果,但搞了半天最后就是为几张静态的图。

最前面当然是官方的动图分布教学,整个city sample项目文件貌似是93gb,目前没有wifi下个月初下载,正好这几天试一下blender手动低配版。

City Sample Quick Start - Generating a City and Freeway using Houdini

City Sample Quick Start - Generating a City and Freeway in Unreal Engine 5

第一篇的总结从47分钟视频中剔除了动画、特效、交互、光影相关的技术介绍,剩下的部分足足看了我一整天,目前还是头昏脑胀的,一方面是基础太差,另一方面是项目确实够庞大其涉及的技术范围十分广。以至于如何整理这几篇总结,把科技树整理清晰感觉都是个不小的挑战,毕竟在没有上手实践是要对一门技术去做分类心里是没底的。方才快速过了一遍昨天写的东西,从副标题创造世界,相对于这一篇的生成世界,再结合内容来看的话,可以概括的说第一篇是如何解决16平方公里的城市3d化问题,一个城市涉及道路、建筑、街道和建筑的道具(广告牌、长椅、路灯)、车辆、行人等等,在第二篇中得知整个项目创建了7000多栋建筑,这在开始时可能是难以预计的?如果手动去做一个个建筑并去摆放需要多大的工作量我还没有概念,在blender中用building nodes也是一种通过建筑部件模块化生成建筑的方式。我感觉先用blender的building nodes配合trim sheet uv着色的方式过一遍做个局部能更加深刻体会程序化城市建筑的思想。对于matrix这个项目而言,无非就是其模块更多,模块排布的规则更加复杂多样化而已,这在blender building nodes中做应该来说是差不多的。区别点在于blender中的部件是极低面数的,而配合houdini程序化生成的建筑所使用的部件是在maya中做的极高面数的模型,我不知道在blender中几何节点操作高模去做排布是否可形,照理来说操作的都是实例,只是增加了位置信息。


​​​

我可以先找一些50-100个部件的房子做2-3个练习看看在blender中做建筑究竟是怎么回事。先从building nodes的示范文件开始研究。然后是低模+trim sheet uv着色,最后是尝试高模。

具体步骤对应matrix系列的话:

1.creating modules也就是用基本几何体做低模部件并为其名命、building models/go hi-res在低模基础上做高模都,用blender建模

2.shaping grammar制定规则来组合部件形成建筑,用blender几何节点。

3.city generator模块部件通过houdini的点云存储的位置信息导入后自适应分布。下面这个教学似乎可以解决在blender中做场景直接导入到ue,通过在blender创建一个empty对象,将场景其他的对象作为其子对象,ue导入时选择fbx scene即可整体导入且对这些子对象可以基于他们自己的pivot移动。那么问题就在于blender能承受多大的场景,根据初步搜索来看千万级别的polygon数没问题,但matrix的项目是万亿级别的polygon如果想要blender做的话必定需要拆分场景分批导入,那样做的话就涉及到道路连续性问题了,肯定需要一个低模版本的city layout在ue和blender上处于同一坐标位置,然后保存多个分区版本,继而分区导入建筑部件?

How to ACTUALLY export Blender scenes to Unreal Engine 5

4.建筑部件的纹理、材质、着色。matrix中合计有2333个建筑模块部件,看上去很多有种想死的感觉,团队将其拆解成3个部分一是质感与基础色,然后是砖块、石块的构成排布,这里涉及到无缝纹理贴图udim的运用,然后加入各种侵蚀、污渍遮罩。我在想这一块能不能在blender里面做好导入ue还是说必须在ue做的?到时候尝试一下。

5.道路的纹理、材质、着色。这个就在ue里面搞了,一些pack里面有现成的材质估计可以直接拿来用。

以上是上一篇总结下来我对应着打算用blender绕开houdini做的方式,下面看看第二篇。

第二篇:基于官方字幕《[技术演讲]黑客帝国觉醒:生成世界》的总结

街道260公里,人行道512公里,7000多栋建筑,18000多辆汽车,35000多行人,800万nanite模型,53次程序化生成

把houdini想象成一个工厂,节点就像执行特定任务的机器,节点连接起来就像工厂的流水线

有了nanite,1平米最多可以有100万个三角面而不需要担心性能。整个城市16平方公里意味着有16万亿个三角面。然而磁盘上的资产大小和数量成为了限制因素,此外资产越大意味着运行速度慢,得想个办法切割世界。

一开始团队想到的是openstreetmap(osm),它提供的地区大小、形状是无序的,转化和调整的工作量太大。团队认为基于osm去做不好操控,应该用自己创建的建筑模块来构建世界,尽可能依赖实例化。

那么问题就转换为了如何划分出一个城市世界,在真实世界中很难用模块去定义,因此要严格控制任意的程度。

the city layout

首先创建一个城市布局的工具,对于这个项目而言就是程序化生成一个美式现代城市。只需要输入两种数据,基本形状和主干线。通过修改一些属性就能获取一个美式城市布局。

control zone

下一步是城市分区,在这个阶段定义商业区、居民区。从某种意义上说,这个工具相当于城市的垂直建模工具。在ue中使用houdini engine也可以对houdini导出的hda文件编辑从而设计城市。

the city metadata

确定布局后,这个工具可以输出大量的metadata,下游工具会用这些数据创建城市,其中包括道路网络、地块定义、人行道网络,还有其他属性如道路连通性、交通密度、行人密度。

the city processor

有了这些数据,进入最后的创建阶段。每一段路由两点一线代表,路包含的元数据有路的宽度、路的id、每个交叉口的分支数等等。

将道路切开预留交叉部分。道路有3种长度5、10、20米,因此整个路网由9个道路组件构成(arterial collector local各自3种长度,3x3)。

对于交叉路口,需要缩放到彼此相邻的能够衔接上?

用高模代替低模组件。road processor会输出点云用于实例化ue中的道路组件。大致可以推测,白色是交叉路口吗,较长的红绿蓝两点为5、10、20米的模块,较短的则是5米的模块做了缩放。

创建好道路网络后就可以提取交通信息了。使用道路的metadata可以提取每个车道,把他们连接起来可以形成基础交通网络。

这些数据之后会通过unreal中的“交通工具”编译变成区域图,这部分会由julien marchand在后面详细介绍。

下一步是生成高速公路。

高速包括55个入口,在unreal中用spline可以快速制作高速路,这个估计和joe garth的示范是差不多的,由蓝图程序驱动spline对一个road mesh做控制生成。

由于高速路的“有机”特征,这使得要对它重构实例化部件装配变得不可能因此要做一个mega mesh(这个概念chatgpt表示不清楚,大概就是巨大的单一面片模型吧?)。这个大型网格之后会被分割成100米左右的小网格。

作者这里提到标志、路障、柱子、杂物等都是nanite scatters。我是不是可以理解这些都是手动置放的呢?

道路与高速道路制作完毕,接下来是地块(lots)和建筑体积(building volume)

在city layout工具中有高度信息,首先确保高速路的部分不会生成建筑。清除过滤掉部分之后,再对地块细分。

进一步划分地块的算法会考虑建筑高度和可用表面,表面越大最终建筑占地面积(footprint)越大,但这只适用于高楼建筑。

可以从图示中看出来矮的建筑是被细分的较多的地块,不适合布置建筑的为不规则地块。

引入17种不同的占地形状。城市中的每栋建筑都会以其中一种占地形状被建立。通过下面这些参数可以确保每栋建筑独一无二。

用这17个dna占地形状去分割那些不规则地块,使它们可以放置建筑。

生成建筑体积,在这个houdini工具种可以调节方形建筑和阶梯交错式建筑(staggered building)的比例,这里估计用了噪音纹理来控制整体高度,之前在blender见过用类似的噪音纹理的黑白作为高度的输入通过一定的乘法运算放大对比度从而形成高高低低的实例排布。

路面是第三人称视角中十分显著的元素,因此要做的很细致。整个项目的人行道有5种类型,它们有3-4个尺寸的模块,10种不同的地面砖,以及转角模块。我不清楚这5种人行道难道不是按照地面砖的类型来分的吗?10种地面砖和人行道无关?作者说使用经过修改的megascan资产加上displacement map,我对置换贴图还没有很直观的使用体验,推测是一个细分较高的面片直接用置换贴图生成表面位移的凹凸效果(物体的顶点发生实际变化的凹凸)。

这里补充一下关于凹凸、法线、置换贴图的区别。

Bump map、normal map和displacement map是在计算机图形学中用于模拟凹凸效果的技术,它们的确有一些相似之处,但在实现和效果上存在一些区别。

  1. Bump Map(凹凸贴图): Bump map是一种灰度图像,用于模拟物体表面的微小凹凸。它通过改变光照计算来产生视觉上的凹凸效果,而不是实际改变模型的几何形状。Bump map中的每个像素值表示对应点的凹凸程度,黑色表示最深的凹陷,白色表示最高的凸起。通过将这种凹凸信息应用到表面法线方向上,可以让光照在表面上产生变化,从而呈现凹凸的外观。

  2. Normal Map(法线贴图): Normal map是一种RGB图像,用于模拟物体表面的细节凹凸。与bump map不同,normal map不仅考虑了表面的高低变化,还考虑了表面的法线方向的变化。Normal map中的每个像素值表示对应点的法线方向。通过将法线贴图应用到模型的表面上,光照会根据法线的方向产生变化,从而在视觉上呈现出凹凸细节。

  3. Displacement Map(位移贴图): Displacement map是一种灰度图像,可以实际改变模型的几何形状。它通过对模型的顶点进行位移来模拟凹凸效果。Displacement map中的每个像素值表示对应点在模型上的位移量。当应用位移贴图时,模型的顶点会根据位移贴图中的值进行移动,从而实现凹凸效果。

总结来说,bump map通过改变光照计算来模拟凹凸效果,normal map通过改变法线方向来模拟凹凸细节,而displacement map则实际改变模型的几何形状以达到凹凸效果。它们在实现方式和效果上有所不同,但都可以用于增加物体表面的细节和真实感。 这么说来使用displacement map的话模型本身的大小也改变了?

ChatGPT 是的,使用displacement map时,模型的几何形状会实际发生变化,从而改变模型的大小。Displacement map中的像素值表示对应点在模型上的位移量,应用位移贴图后,模型的顶点会根据位移贴图中的值进行移动,从而改变模型的几何形状和大小。 具体来说,正值的位移会使模型的顶点向外移动,导致模型膨胀或凸起;负值的位移会使模型的顶点向内移动,导致模型收缩或凹陷。这种位移是基于模型原始的顶点位置进行计算的,因此可以改变模型的几何形状,使其具有真实的凹凸效果。 需要注意的是,使用displacement map对模型进行位移可能会增加模型的多边形数量,因为位移会在原始的顶点之间创建新的顶点。这可能会增加渲染的计算量和内存消耗。因此,在应用displacement map时,需要在考虑视觉效果和性能之间进行权衡。 照你这么说的话使用displacement map,需要模型本身面数比较高吧?不然本身没多少顶点数,配合不了贴图的移动

ChatGPT 确实,使用displacement map时,较高的模型面数可以更好地配合贴图的移动效果。较高的面数表示模型具有更多的顶点和多边形,这样位移贴图的效果会更加细腻和精确。 当模型的面数较低时,即使应用了位移贴图,凹凸效果可能会受限于模型的细节和形状。由于模型的顶点数量较少,无法精确地表现出位移贴图中的细微变化。这可能导致凹凸效果不够明显或不如预期。 因此,如果你希望在使用displacement map时获得更好的效果,选择具有较高面数的模型会是一个好的选择。这样可以提供更多的几何细节,使位移贴图的变化更加显著和逼真。

通过地块信息和人行道spline,把人行道模块生成出来。

这张图上许多细小的色彩马赛克每一个就是上面提到的一块tile砖块,合计有250万块这样的砖,也就是1.25万亿个三角面。机动车马路看起来其texel density要比人行道低很多。

Leftover zones

剩下的区域在前文中多次分割地块后还余下一些,被分为广场、停车场和高架。

上一章提到过这个instance-packed blueprint.作者说采用基于区域uv空间的分散技术来在剩下的区域上分配这些。我目前没有在网上找到所谓的uv space节点、uv layout节点。

团队用houdini开发了一个工具用于散步“群落”。

road decals路面贴画也是程序化生成地。将路面贴画标记点云位置,并在点云上创建面片。

the city audio音效部分暂时跳过

在houdini中生成城市的流程图。需要25分钟用rtx3090显卡运行生成一座城市(拥有800万个实例)。

作者在这一段快速演示了houdini创建城市形状道路布局、城市功能区块划分

程序化的目标

从25分起-45分都是讲程序化是如何用代码程序实现的思想理念。

原型阶段团队认为需要一个dcc软件接入ue,houdini很适合快速迭代从而能快速评估改进。

作者认为建筑模块模板生成器是个houdini快速迭代的优秀例子。

建筑形状语法用来制造更多的随机,避免硬编码(hardcode,写死给定数值的代码)。作者最初的程序放到现在他自己都难以理解。

这里不知道为什么突然扯开了话题作者在ue中演示了用building generator生成建筑(注意这不是生成建筑模块,而是整栋建筑)。

改变建筑装饰、附属道具的密度、位置。

改变建筑风格、样式.

json形式的building definition files,易读可快速编辑。

这里看不懂在说什么

建筑生成器的流程

第一步是体积分割

楼层切割划分好之后,对角落做定义

简单介绍语法

形状语法选择,如何为立面选择合适的语法,这里我看不太明白,在blender building nodes里通过拉伸面会使得建筑按照一定规则重排其立面布局,目前还不清楚原理,感觉应该是一样的。

可以看到建筑选择的形状语法随着长度变化而变化。

后面讲了遮挡相关的内容,通过计算各个角度都能被遮挡的部分,把这部分删除可以过滤掉25%,节约了内存?我不太理解,ue不是对不显示的部分不加载的吗?被遮挡有必要特意去删除吗?感觉这个计算很复杂,跳过。

为单个建筑提供多个建筑定义文件(bdf,下图的建筑由两种明显不同风格的建筑模块部件组成),分配窗户、标记窗户的位置。整个城市的建筑配套道具(广告牌、空调外机、阳台等等)使用的是简单的模块化播种机制,我不知道这是不是和3dsmax的railclone插件上的演示差不多。简单粗暴的来说可以认为是一个建筑模块的变种视为建筑模块即可了。

窗的基本数据,看不懂这里说的“每个模块立面构建了一个连接性数组,立面上的模块都带有窗户标签”。作者说有了这个标签就能决定房间的大小,放置好房间以后,所有的房间实例会获得房间id。可以看到houdini vex代码中有许多和窗户有关的东西。以下为chatgpt 对houdini vex的科普。

Houdini VEX(矢量表达式)是Houdini软件中的一种编程语言,用于控制和操作三维图形和特效。VEX主要用于在Houdini的节点图形界面中编写自定义的节点、参数和着色器,以实现更高级的效果和操作。

VEX是一种类似于C语言的语法,它提供了丰富的函数和操作符,用于处理矢量、矩阵、几何形状和像素数据。使用VEX,您可以编写自定义的算法和逻辑,以控制粒子系统、模拟、几何变形、着色和渲染等方面的行为。

VEX还提供了与Houdini软件中其他组件的无缝集成,例如几何操作、光照模型、渲染管线和着色器网络。它还具有对Houdini的内部功能和数据结构的直接访问,使得在复杂的图形和特效任务中实现高度定制化的操作变得更加容易。

总而言之,Houdini VEX是一种用于编写自定义节点、参数和着色器的编程语言,它为Houdini用户提供了更大的灵活性和控制力,以实现高级的三维图形和特效效果。

一楼作为第三人称视角能近距离观察,团队设法还原真实世界的窗户与贴纸、贴画复合的效果。

屋顶,完全看不懂在说什么。

后面谈到ue中的bugit功能,如何查找程序化生成意想不到的问题,在16平方公里的城市里靠手动去搜很困难。暂时跳过。

wave function collapse意思是在一定约束条件内如何迭代?作者举例了把猫连接的例子,猫的身体只能和头尾以及身体连接,头右侧只能是空白,尾巴左侧只能是空白。

屋顶上的附属道具是用33个mesh通过这个波函数坍塌算法“膨胀”出来的变种,共有2600多个,其函数给出的约束条件有5080个。

这个波函数坍塌被做成了一个ue插件,到时候可以试一下。下面有个关于这东西的课程,目前还没看。

Procedural Game Assets in UE5 - Wave Function Collapse ( First Chapter )

最后还剩下的部分讲的是mass ai的概念,如何用这个ai去操控车流、人流的行为,这里就不展开了,似乎网上有手把手的教学不用对原理太深究。

2023-7-2-blender导入ue模块化建筑部件制作流程 2023-6-22-unreal-engine官方出品的黑客帝国场景学习分析

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×