Unity 大咖作客 | 地球渲染、引力模拟、尾焰特效… 这是要上天?

最新一期的 [Unity 大咖作客],B 站 UP 主矢速老师带大家体验了一把太空之旅。不得不感叹,如今创作者的灵感已经突破了地球,冲向外太空啦!
无论是制作航空CG视频,还是制作太空背景的游戏,都可以从这次分享中有所收获。话不多说,完整版技术分享奉上。老师的讲解录播以及 PPT 已经发布在 Unity 中文课堂 ,欢迎大家下载:[https://learn.u3d.cn/tutorial/aerospace-simcg ](https://learn.u3d.cn/tutorial/aerospace-simcg )
矢速 :大家好!我是矢速。很荣幸受邀来分享我们制作航天模拟CG动画的一些Unity技术经验,我先讲讲这样做的来历。
我本人目前是一名学生,喜欢航天与单机游戏。在2016年的时候巧合接触了《坎巴拉太空计划》这款游戏,当时的感觉是相见恨晚。这款游戏是基于Unity开发的一款沙盒航天模拟游戏,在2015年正式发售,官方支持基于Unity的mod开发,目前有一个活跃的mod开发者社区。
而Kerwis团队全称中国坎巴拉太空计划智库团队,是2014年创建的KSP mod制作团队。在我和其他几个制作《坎巴拉太空计划》游戏视频的UP主,在2020年加入Kerwis团队以后,获得了有多年开发经验的老成员的技术指导,之后我们直接在Unity编辑器内制造航天模拟类CGI。同时又因为一些巧合,获得了中科院网络信息中心的支持,在开始制作航天科普模拟视频后,我在团队中主要担任Unity内的CGI特效、渲染、模拟工作。这页PPT背景,是我们开发的中国航天器mod在《坎巴拉太空计划》中运行时的一张截图。
我先把今天要讲的内容做一个总览,首先要说明的是我本次分享的内容更偏向Unity与航天CG结合的技术点。
第一点,首先讲一下我们是怎样做出乍一看很高的画质,这些其实都是Unity内嵌好的渲染功能。
第二点,讲一些CG动画相关的东西。这一点在细节上会有别于游戏渲染。
第三点,航天中近地轨道占了很大比例的时间,在近地轨道的视角中,地球的渲染效果会很重要。
第四点,运动方面。其实在CGI中手动做动画曲线也可以,但是因为我们特别看重动画的真实性,外加Unity中有物理引擎的内嵌,所以尽可能使运动过程动画基于物理模拟。
第五点,讲一些视觉特效。
首先大致讲一下渲染方面的总体效果,我们使用的是Unity的HDRP渲染管线,并开启了光线追踪的全局光照、反射、环境光遮蔽与阴影。
关于开启的方法,B站Unity官方账号中有一个专门的系列视频,栋哥做了详细讲解,然后使用Post Processing后期处理来进一步提升画面观感。
我们的模型也都是基于PBR流程制作的,在Substance Painter 中有Unity HDRP贴图方案的预设,直接使用就可以了。
除了模型与材质外,光照渲染方面也全部基于HDRP的流程标准。
在渲染时,我首先会创建几个基础场景,比如说在发射场、大气中、近地轨道,然后为每个分镜复制并布置场景中的具体细节,使用Cinemachine插件实现运动镜头与镜头语言的设计;使用Timeline插件来控制诸如助推器分离、镜头运动、引擎点火这样时间轴上的事件;然后使用Recorder插件来渲染出最终的用于剪辑的分镜。
一般来说,我们会借助Unity实时渲染高速迭代的优势,通过关闭光线追踪与降低分辨率的形式来大大降低渲染的时间,并使用Recorder插件录制体积很小的H.264视频,发到团队群中做测试分镜。
这样差不多一个下午就能为一个分镜做5到10版的迭代改进,在最终效果达到较为妥当状态时再开启光线跟踪,录制4K分辨率QuickTime格式的最终分镜文件。
接下来讲讲地球的渲染,这一点首先需要说明的是目前我们仅仅是实现了渲染效果,但是暂时还没有做优化。从目前的GPU性能与显存需求来看,只适合做CGI渲染。我之后有计划做性能优化与效果的进一步提升。
我首先去NASA官网下载了86K分辨率的基础色与高程的清卫投影图。
然后是拆分成了满足Unity分辨率限制的14400×14400分辨率的贴图,这些就是我拆分后的基础色图。
第三是在Unity编辑器中将它们打造成2D纹理阵列,在shader中可以通过UV两个浮点数与阵列层整数获取到一个颜色。
注:要获取一个片元的基础色,可以先获取到片元的物体空间坐标系,这个坐标是直角坐标系,而经纬投影的经度和纬度是球坐标系的,那么可以先通过算法把片元位置直角坐标转化成球坐标,然后再使用乘/取小数/取整等计算获得这个坐标在贴图阵列中的U,V与层数位置. 例子:图中红海边上这个点的片元最终用于查询纹理颜色的坐标就是9号纹理层,U值为0.6,V值为0.35.在BC1纹理压缩下,这个14400x14400x18个像素的T2D Array大约会占用5G显存。
第四是建模一个球体网格作为地球模型。我是在Blender中生成了一个800万顶点的棱角球,然后删掉了它的UV。
第五步可选,是在顶点着色器中使用曲面细分进一步平滑基础的网格,同时可以基于高程图置换出山脉等细节。我制作这个地球的时候,似乎HDRP的光线追踪阴影等功能与顶点置换并不兼容,所以这一步我并没有在CG中实装。
第六步是在片元着色器中,根据片元的物体空间位置计算出对应的贴图阵列中的UV位置与层数。
然后是使用高程图计算出法线贴图,并在shader中设置一个高程的阈值。比如假设设置成0,低于海拔高度0的地方光滑度高一些。实际上这里合理的做法是寻找水域遮罩图,因为并不是所有海拔低于0的地方都会被水覆盖,也不是所有高于海拔0的地方都很粗糙。例如贝加尔湖、青海湖等地方。不过,目前我并没有这样做,因为其实看起来已经大差不差了。
第八是使用HDRP基于物理的天空来渲染大气,移动地球的位置 (注:Physically Based Sky组件中的星球位置选项) 使之与地球的模型同步。这里有一个要注意的点,因为天空渲染时一定会置于所有物体的视角方向上的后方,所以需要使地球模型半透明,来与大气层混合。又由于不同视角方向,以这里的背景图为例,远处的地面比起近处由于视角方向与地平面夹角比较小,所以光线会穿过更厚的大气层。
我在这里基于菲涅尔计算地面模型的透明度,使得视角方向与地面夹角较小的部分拥有看起来更厚的大气层。
接下来讲讲关于引力的模拟,Unity的世界坐标是单精度浮点数,精度远不能满足浩瀚的宇宙空间的位置精度要求,所以使用双精度浮点数来写一个独立的坐标系(就叫它”宇宙空间坐标”吧),每次物理帧更新时,以相机的宇宙空间位置作为宇宙空间的世界坐标原点。将所有Transform的位置从宇宙空间坐标系反推并应用到Unity的世界坐标。
这么做可以保证物体渲染时的位置仍能保持在单精度浮点的精度范围内,同时不会影响到双精度坐标系中的位置计算。在计算时,还可以将物体分为引力源与引力受体两种。例如在有行星、恒星和航天器的模拟系统中,无需考虑航天器对行星与恒星的引力产生的加速度。然后每个物理帧对每个引力受体遍历每一个引力源。
对于物体的运动方程,可以用数值方法计算,考虑引力后的位移与角位移。目前我们实现过的只是一个比较初级的系统,使用Unity物理帧时间为步长的4阶显式龙格库塔法,并使用Unity Mathematics包的有单指令多数据流优化的双精度三维向量结构体。同时使用Job system可以使计算线程并行于主线程。
至于我们之前做的祝融火星车在CG中对轮架的模拟,这个并没有复杂的东西。直接使用Unity自带的轮子碰撞器,编写一个C#脚本,让它可以做出这些行为就行了,包括轮子的悬挂效果模拟等等功能都是Unity自带的。
然后使用注视\旋转\位置约束等现成的组件,使得轮架行为可以配合轮子的行为即可。这两个动图是我们模型师做完白模以后,直接在Max中手K动画曲线,然后离线渲染的。我在Unity里做的实时模拟测试视频,与有这个表现的成品CG在B站都可以看到。
接下来讲讲特效。
RCS发动机燃气没什么特别的,直接找一张类似引擎燃气的照片,然后对着做一个模型网格,在shader中使用分型噪波与UV动画做出向外喷射的效果。最后再基于菲涅耳透明度,做出边缘透明度升高的淡出效果就可以了。这一点与地球渲染时的操作大同小异。
接下来是我们特效的重头戏,就是火箭发动机的尾焰。我需要说明的一点,由于目前我们并没有固体燃料发动机的模拟需求,并且固体燃料发动机的尾焰涉及了大量流体体积模拟与渲染,看起来类似这里背景图中的导流槽水雾。这方面我们并不擅长,所以这里我分享的仅限液体燃料发动机的尾焰效果。与固发效果不同的是,液体燃料的燃气不再发光后便几乎不可见,而不可见对于图形渲染来说就是不存在。
液体燃料主要分为四种,他们也都对应了四种特征迥异的尾焰种类。先说一些共同的特点,首先说明的是本人并没有高超音速流体模拟方面的专业背景,以下说明的都是针对视觉效果的经验特征。
尾焰分为较为稳定的部分与较为紊乱的部分,从喷嘴开始沿着喷射方向,较为稳定的部分会逐渐减少,并且从第一次收缩开始较为紊乱的部分会有内而外代替比较稳定的部分。并且随着环境气压的降低,尾焰的边界会逐渐膨胀,马赫盘会逐渐拉长乃至消失。
接下来看看四种尾焰的特点,偏二甲肼+四氧化二氮燃料的尾焰看起来比较清澈透明,在稳定段以蓝紫色为主,到了紊乱段以黄色为主。我们目前并没有做过液氧甲烷燃料的尾焰,不过外观与偏二甲肼+四氧化二氮燃料尾焰较为相似,发光颜色可以参考家里的天然气灶。
液氧+煤油燃料的尾焰特点,是在喷出后的一段距离内有很高的亮度,并且似乎透明度也很低。目前我并不清楚这是因为很高的亮度导致背景光相比之下看起来很暗,还是因为这段亮度很高的区域类的对光的吸收也会比较强,亦或二者都有。但对着照片做,总不会有问题的。在亮度比较高的区域,以明亮的黄色为主;而之后的一段区域内,则是比较黯淡的蓝色。
液氢+液氧的尾焰一般看起来是黄色偏红的,较为透明,并且亮度会比液氧+煤油的尾焰低很多。在这里由于照片的曝光,所以看起来似乎是差不多的。但是这一点可以在液氧+煤油发动机与液氢+液氧发动机同时出现的照片中看到,比如可以去找到一张长征五号起飞时的照片看一看。
(下附图:长征五号,芯级液氢液氧,助推液氧煤油,芯级尾焰极不显眼)
接下来讲一讲尾焰特效实现的平台,在稳定流体部分使用的是半径1米、高5米的圆柱形网格,在shader中使用Amplify Shader editor的自定义函数节点(注:HDRP自带的Shader Graph也可以这样做)调用外部文件中的函数功能。然后直接在外部文本文件中,使用CG或HLSL语言编写函数。在较为紊乱的流体部分,使用HDRP内建的VEG粒子系统,以传统方式实现尾焰喷射效果就可以了。
首先,在每段尾焰的外层与马赫盘各使用一段上文提到的圆柱体网格,然后观察要做的尾焰的外观并拟合一个外形与体积的密度与亮度的分布等信息的函数。然后在顶点着色器中,根据拟合的外形函数置换顶点的位置,到可以包裹整段尾焰或马赫盘即可。可以将顶点计算相关的shader参数暴露,并通过C#脚本控制,使得顶点位置的计算满足之前提到的变化规律。
接下来在片元着色器中,使用射线步进(Ray Marching)算法渲染拟合出的体积描述。之所以要在上一部顶点着色器中包裹整个尾焰的外表,而不是直接建模一个立方体在里面做射线步进渲染的因是,可以直接从包裹整个体积的网格上的片元的物体空间位置开始做射线步进,这样省去了计算有符号距离场跳过空白的空间,或者是直接将整个空白部分都做射线步进采样,浪费显卡算力。
体积描述要注意尾焰不同的部分的自发光,以及不同部分对光的吸收,比如在煤油发动机中可以清晰看到亮度较低的、未充分燃烧的,但还未被重新点燃的煤油区域。就是我红圈圈出的这几个区域,这里显然透明度是很低的.而尾焰对光的散射较小,并且射线步进中处理起来比较棘手,所以散射可以忽略掉。
自发光又分为焰色反应与黑体辐射两个部分,黑体辐射光色可以基于对于尾焰温度的模拟来实时计算,而焰色反应对着照片与视频资料调整即可。而尾焰中不稳定的部分,使用VEG粒子系统的传统火焰制作方法即可制作出来,只需要注意与稳定部分的过渡尽可能平滑就可以了。 以上就是我要分享的技术内容了,最后打一个广告,如果对我们的制作感兴趣的朋友,欢迎来团队帮忙。(经济方面的报酬不一定有,因为我们自己都不一定有.)目前音效与程序方面是比较紧缺的,想加入的朋友也可以加入群聊。如果对我们的制作有建议,也欢迎提出B站私信我,或者加入群聊提出都可以。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D是一款强大的跨平台游戏开发引擎,可以用于创建各种类型的游戏或交互式应用程序。有许多开源的地球模型可以在Unity Asset Store中获取,其中一些免费,一些需要付费。这些地球模型源文件可以用于快速搭建一个高度真实的地球环境,提供了一系列功能。 首先,地球模型源文件中通常包含了高质量的3D模型,包括地球表面的地形和地貌,以及水体和动植物生态等要素。这些模型可以用于创建一个逼真的地球场景,配合Unity渲染引擎,使得地球呈现出细腻的纹理和真实的光影效果。 其次,地球模型源文件还包含了与地球相关的各种资料和数据,如卫星图像、地图数据、气象数据等。这些数据可以用于构建高精度且准确的地理信息系统,例如用于虚拟旅游、科学教育、城市规划等领域。 此外,地球模型源文件还可能包含一些预设的功能和交互性。比如,可以添加轨道动画,展示地球的自转和公转;可以设置天气效果,模拟不同的气候和季节变化;可以添加交互式元素,如点击某个地区弹出相关信息等。这些功能和交互性使得地球模型更加有趣和实用,可以用于游戏或其他虚拟仿真系统中。 总的来说,Unity3D地球模型源文件提供了一个快速搭建高度真实的地球环境的解决方案。开发者可以根据自己的需求进行定制和扩展,实现各种各样的地球相关应用。无论是游戏开发、科学研究还是教育培训,这些地球模型源文件都提供了一个强大的工具和资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值