import_3d - seraph526/godot-se GitHub Wiki

3D 场景导入

简介

大多游戏引擎只能导入3D物体,其中可能包括骨架或动画,之后的一些工作都是在引擎里完成的,如物体的放置,整个场景的动画等等.在Godot中,现有的节点系统和3D DCC软件很像(如Maya,3DS Max 或Blender),整个3D场景可以被完整的导入.此外,使用简单的标记系统,可以定义导入的物体为几个不同的部分,如碰撞,房间,车辆,车轮,LOD距离,广告牌等.

这使它具有一些有趣的功能:

  • 导入简单的场景,操控的物体,动画等.
  • 导入完整的场景.全部的场景可以在3D DCC软件中创建和更新,每次修改完毕后导入到Godot中,在引擎端只有很少的编辑工作要做.
  • 全过场动画导入,包括多角色动画,灯光,摄相机运动等.
  • 场景可以在引擎中进一步编辑和脚本化,可以加入渲染和环境效果,敌人的初始化等等.当源场景改变时,导入器会更新几何形状的变化,同时保持本地的变化(Godot编辑器是实时的)
  • 当源场景改变时,纹理可以批量导入和更新.

这些可以通过简单的语言标记实现,稍后我们会详细介绍.

导入过程

导入从3D场景导入菜单开始:

这会打开可有能是所有导入对话框中最大的一个:

它有很多选项,下面每个部分都会一一讲解到:

源&目标路径(Source & Target Paths)

要导入,需要两个选项.第一个是源.dae文件(Collada标准的.dae文件.更多的格式会被填加,但Collada是写此文章时最完善的开源格式).需要提供一个目标文件夹,以便可以导入场景.导入的场景会和源文件有同样的文件名,但后缀会是.scn,所以确保导出时你有好的命名.

材质将被拷贝和转换.在3D程序中材质通常是PNG或JPG文件.Godot将默认转换材质为视频内存压缩格式(s3tc,pvrtc,ericsson等等)以便提高效率和保存资源.

因为原始的材质,3D文件和材质通常不是必须的,建议将他们保存在项目文件夹之外.这里有一些如何更好的实现这些的建议,可以查看版本控制&项目管理教程 这里提供了两种保存材质的选择.他们可以拷贝到和场景相同的目录,或者拷贝到普通的目录下(在项目设置中设置).如果你选择这项,请确保没有两张贴图使用一样的名字.

3D导入选项

这部分包含很多选项改变导入流程的工作方式.这些(如HDR)会在其他部分做详细说明,通常图案可以在以"-somthing"结尾的选项中可见,如:

*移除节点(-noimp) *设置材质Alpha(-alpha) *创建碰撞(-col)

这意味着物体在3D DCC软件中的名字需要在末尾追加这些选项,以便告诉导入器导入的是什么.导入时,Godot将把按着设置转换他们.

这里是场景在3D dcc中样子(使用blender),并且如何导入到Godot中的示例:

注意: *摄相机正常导入 *创建一间屋子(-room) *创建一个门户(-portal) *面片填加静态碰撞(-col) *灯光不被导入(-noimp)

##选项细节

接下来是大多数选项的列表和它们功能的细节.

移除节点 (-noimp)

节点名字的末尾这个标记的,在导入时会被移除,不客它们是什么类型.事后删除他们是无意义的,因为如果源场景发生变化,它将被存储.

导入动画

一些场景格式(.dae)支持一个或多个动画.如果这个选项被选中,一个动画播放器会被创建,而且其中包含动画

几何压缩

此选项(禁止,或者喜欢,通常启用,到写这些文章)通常会压缩几何以便使其占用更少的空间,很快的渲染(以损失少量的精度为代价)

强制创建切线阵列

导入器会发现使用的法线贴图,或者源文件 包含切线/副法线信息.法线贴图需要这些矩阵信息以便正常工作,许多导出者都知道导出这些信息有什么用途.但是,有可能导出的内容不带有这些信息,结果,导致法线贴图不正常工作.如果你发现当导入场景后,法线贴图不正常工作,打开这一选项.

SRGB -> 线性漫反射贴图

当渲染使用HDR(High Dynamic Range)时,可能期望使用线性空间贴图以达到真实的灯光效果.另外,颜色饱和度和对比度在曝光变化时会变化非常大.这个选项必须和SRGB选项一同[世界环境](class worldenviroment)一起使用.这个纹理导入选项也有做此变换的选项,但是,如果这项是开启的,纹理通常被渲染为漫反射纹理(通常希望如此).更多信息,请阅读[HDR教程](tutorial had).

设置材质透明度 (-alpha)

大多数3D DCCS环境中,如果材质是透明的或拥有透明度是显而易见的,这几乎不会影响工作流程和最终的渲染结果.但是,当处即时渲染时,带alpha通道的渲染通常不那么完美,所以必须明确标明.

原始的Godot检验其是否透明是基于源纹理是否含有alpha通道,但大多数图片程序像photoshop或者gimp都会导出这个通道,即使是在不使用的情况下.之后填加的代码会手动检测是否在此纹理中真的包含有透明信息,但是艺术家通常不管这些,而设置uvmaps到不透明的区域,而将未使用(没有UV存在的部分)保持透明,这使得这个检测变得毫无意义.

最终,决定最好是将导入的所有东西都看作是固态的,当其看起来不正常时,让艺术家自己云设置需要透明的区域(请查看固定材料

作为辅助,因为每个3D工具允许命名材质,并保持他们导出的名字,这(-alpha)编辑器因为它们的名字会修饰3D场景导入器,材质将使用alpha通道来记录透明.

设置材质的顶点着色(-vcol)

大部分3D DCCs支持顶点颜色.它通常是通过正片叠底或屏幕混合的方式实现.但是通常的情况是导出器导出这些信息全部为1,或者作为其他你不会意识到的东西.因为大多数情况下这个选项是不用理会的,只是要填加这一功能到其他贴图时才会用到顶点着色.

创建碰撞 (-col, -colonly)

这一功能只针对Mesh节点,如果"-col"选项被检测到,一个静态的碰撞子节点会被填加,使用相同的几何信息做为mesh.

但是,通常的情况是,虚拟的几何体太复杂或者碰撞设置太不平滑,最终会使其工作异常.为了解决这一问题,就要使用"-colonly"编辑器.它将移除导入的mesh,并创建一个[StaticBody](class staticbody)碰撞.这会帮助虚拟面片,让实际的碰撞分成多个不同的部分.

创建房间 (-room)

这个选项用来创建一个房间.通常,这个节点的任意子节点会被认为是在房间中(包括大门).更多关于房间/大门的信息,请查看大门&房间教程.

有两种方法使用这个修改器.第一种是在3D程序中使用一个虚拟/空节点,这个节点被标注为"-room".为了让其工作,这个房间的"interior"必须是关闭状态(其子几何体要包含墙,屋顶,地板等等唯一的到外界的出口要被大门覆盖).之后导入器会为这个房间创建一个简单的几何体.

第二种方法是在mesh节点上使用"-room"修改器.它将使用包含房间界限的mesh作为BSP Tree的基础.确认mesh形状是closed状态,所有法线point outside并且几体体是not self-intersecting,否则界限会计算错误(BSP Trees比较挑剔和难于控制的,这也是为什么它们几乎不再被使用的原因)

不管哪种方法,房间都需要大门,下面我们会介绍到大门的相关内容.

创建大门 (-portal)

大门是从屋子观察外界的窗口.它们通常是房间表现的一些平面图形.如果大门被单独设置,它被用来从房间内外观看时激活遮挡.更多信息请查看,大门&房间的教程.

基本上,从3D DCCl软件中制作和导入大门的情况是: *它是房间的一个子节点. *它在房间的表面(当然不需要太精确,只要保证在Godot里尽可能的接近) *它必须是平面的,凸边形,任意平面凸边形都可以,不用管坐标和大小. *平面的法线一定要指向房间的外面 通常,它是下面这个样子:

要联接房间,只需为两个房间制作两扇一样的门,并将它们重叠的放在一起就行了.不用十分的精确,Godto会自动对齐它们.

[..]

这个部分剩下的标签的功能都比较简单,或者有文档说明或者将来会有所更改.

动画选项

当导入动画时要注意一些事项.3D DCCs允许在x,y,z上的动画曲线,组件,IK约束和其他的一些设置.当实时导入时,动画是被采样的(以很小的动画间隔),所以,所有的这些信息都是消失的.采样动画执行速度快,但是会使用较多的内存. 因为这一原因,有了压缩这一选项,但是在一些情况下,这个选项会破坏动画,所以,如果你遇到这种情况,请取消此设置. 一些动画是循环的(如行走动画),如果是这种情况,以"-cycle"或"-loop"结尾的动画名字,会被自动设置为循环.

导入脚本

创建一个脚本来解析导入的场景是非常简单的.对后处理,改变材质,用几何体做有趣的东西,都是非常有效的. 创建脚本通常如下所示:

````python`

tool #needed so it runs in editor extends EditorScenePostImport

func post_import(scene): #do your stuff here pass # scene contains the imported scene starting from the root node

后导入函数将导入的场景作为参数(这些参数实际上是场景的根节点)

## 更新逻辑

其他类型的资源(如samples,meshes,fonts,images等等)改变时是全部重新导入的,用户所做的更改全部丢失.

因为3D场景是十分复杂的,它使用一个不一样的更新策略.用户可能使用引擎的一些功能做了一些设置,如果因为素材更新,重新导入后而使所做的修改全部丢失,是一件十分令人沮丧的事.

所以它采用了一个特别的更新策略.这个方法是,用户不会丢失任何他(她)所做的修改,只是被添加的数据或在Godot引擎里不能编辑的数据才会被更新.
它像这样工作:

#### 策略
基于源资源的修改(如:.dae),重新导入,编辑器会记得场景原始的样子,并会跟踪你所做的修改,像重命名节点,移动或重定义父级关系.
最终,以下的东西会被更新:
*面片数据将被更新的场景替换
*材质如果没有被用户编辑过,将会保持不变
*大门和房屋的形状将会被新的场景替换
*如果用户在Godot中移动了节点,变换将会保持不变.如果用户在源资源中移动了一个节点,这个变换将会被新资源替换掉.最终,如果节点在两处都有移动,变换将会被合并.

通常,如果用户从导入的场景中删除了任何东西(节点,面片,材质等等).更新源资源会还原你所删除的东西.这是一个还原本地修改的好方法.如果你真的想从场景中删除一个不再想要的节点,要么从两处都删除它,要么在资源中添加"-noimp"标签.

#### 全新重导入

如果资源被改得面目全非,那么就需要重新导入这一资源.如果是这样,只需从菜单中重新打开3D场景导入对话框:Import->Re-import,之后确认导入就可以了.