之前就一直想分享一下自己做Terraria的3d渲染图以及动画总结出来的一些方法(或者也可以说是体素?我不确定自己做的东西算不算是体素),但是想说的方面实在是有点多,不先打个草稿的话,做成视频怕自己说不清楚,所以干脆先写一篇文章
文章的内容分为两部分,第一部分是关于静态图片的,第二部分是关于动画的,这次主要是介绍一下整个流程,之后可能会再写一些具体点的内容
文章使用到的软件:
- 图像处理:Asprite,Photoshop
- 体素软件:MagicaVoxel
- 3D软件:Blender
- Blender插件:Stop-motion-OBJ
- Tr相关:TEdit,TConvert
其中Asprite和Blender有Steam版本
@[toc]
一.静态图片
1.1 获取素材
这里的素材可以是Tr的贴图,游戏内的建筑,或者是自己画的像素画
获取游戏贴图的话可以使用TConvert(大部分家具和植物的贴图都是分裂开的,可以使用ASprite或者别的软件合到一起,或者参考下面对建筑的处理方法(特别是树))
游戏内的建筑的话可以直接在游戏内截图然后用ps抠出来,我一般是使用地图编辑器TEdit,关闭它的网格显示,背景就变成了纯色,抠图就容易多啦。但是呢,这种方法有一个缺点就是会损失很多游戏内的“特效”,比如玻璃和光照效果
至于自己画像素画,因为我并不怎么在行,就不多介绍啦
1.2 像素变体素
为了让我们的素材之后在3d场景里看起来更立体一点呢,我们需要给素材一点“厚度”,我这里用的是MagicaVoxel,这个软件本来是专门为体素艺术设计的,直到有一次我试着拖了一张图片进去,才打开了新世界的大门。
MV单个物体的最大尺寸是256x256x256,如果你的素材超过这个大小,导入后会变模糊或者无法导入
第一次打开软件应该是在跟我一样的界面,这是MV的物体编辑界面,先点击图中所指的箭头切换到MV的世界界面,按下退格或del可以删除默认的方块
如果现在直接拖入素材(可以同时拖入多个),素材可能会变成奇怪的颜色,这是因为窗口左边的调色盘内没有和我们素材对应的颜色
我们可以先把素材拖进调色盘区域,之后再重新拖入素材来解决颜色不正确的问题(如果你需要世界内同时存在多个素材,或者素材的分辨率比较大的话——直接拖入可能无法导入所有颜色,可以先把所有素材放到Asprite或者ps里然后导出png或者act格式的调色盘文件)
这时我们会发现素材已经有了一定的厚度,接下来可以选择在右上角保存文件,直接在右下角导出成其他格式的文件(例如我会直接导出为obj,之后导入blender)
MV导出obj时会生成xxx.obj,xxx.mtl和xxx.png,所以选择储存位置和文件名的时候要注意一下,以免直接覆盖了原本的.png素材文件
或者我们也可以选择对素材进行进一步的调整,例如对于篝火,我想让底部的木头比火焰更“厚”一点。进入物体编辑模式,在右上角把z尺寸改为3,选择面笔刷-增加-使用体素颜色-颜色,沿着火焰与木头的交界画一遍,之后再选择几何,并且让物体整体再z方向循环移动,
就差不多啦
MV是一款十分强大的软件,我们是可以用它来完成场景的搭建以及渲染的,而且可以做的很好看,但还是存在一些限制,(比如由于它是为体素设计的,如果旋转的角度不是90°的倍数的话,物体就会变形)所以我会用blender来做场景和渲染
1.3 场景
这部分我其实没什么好说的,对于Blender我只是到了会用的程度,大家可以去B站和油管上看看关于Blender的教程,然后发挥自己的想象力吧!
二.动画
大家应该知道,Tr里的动画其实是按照顺序,重复的加载贴图的每个部分,所以我们制作动画呢,就是要让模型按顺序,重复的出现又消失,在Blender里可以通过对物体可见性加上关键帧来实现,但是模型一多,手动这么做的话,工作量会很大,而且很容易出错,好在我们可以通过插件来完成这个步骤
2.1 准备模型
在这之前呢,我们需要获得贴图每个部分的模型,所以需要先把贴图的每个部分导出成独立的.png文件(ps的切片可以很方便的做到,做这步的时候可以顺便导出调色盘文件),调整好调色盘之后(导入调色盘文件,或者各个部分里颜色最多的图片),就可以全选直接拖入MV
导入后大家可能会发现一个问题,某些模型的边和其他模型不在同一个位置上,以下图的篝火为例,如果我们不做改变导入blender的话,加载到这个选中的模型的时候,物体位置会出现一个突变
出现位置突变的原因我大概解释一下,MV导出的.obj文件的原点是MV中世界的原点( 因此导出的时候请确保所有模型是“重叠的” ),所以图中选中的模型在Blender里也会比其他模型稍“高”一点点
对于篝火,我们只需要全选,-y方向对齐即可让模型的底边对齐
对于其它出现这种问题的情况,就需要大家自己分析该如何处理啦。有些贴图导入之后,无法通过“对齐”的方式来解决,例如鸟妖。这里我给大家提供另一种解决办法。
会出现这种问题,其实是因为MV会自动裁剪掉贴图中完全空白的“行和列”,然后再以剩下的部分的中心作为物体的中心,所以我们要做的就是让MV不要进行裁剪,目前我想到的办法是,在分割贴图之前在贴图的左右两边各加上一条边,这样切片之后再导入MV,然后在MV中通过缩小物体的x尺寸去掉多余的边(物体编辑模式下可以用指令 size x y z)
调整完成后,就可以导出啦,最好单独导出到一个文件夹,MV默认是导出世界内所有物体的,且顺序与我们导入的顺序相反(即导入图片A01,A02,A03,导出的是A03,A02,A01,可以通过在导入前重命名文件来解决这个问题)
2.2 模型导入
前面说到,我们要使用插件来完成模型的导入和可见性的变换,我使用的插件是Stop-motion-OBJ的 v2.2.0 alpha4 (这个版本不支持Blender 2.92,支持2.91,使用alpha版本是因为它有一个关键帧的功能),启用插件后点击导入–Mesh Seaquence,在箭头出输入模型开头的几个字母,比如我要输入“harpy”(由于我是单独保存的,所以其实“h”就行),插件会自动的把模型导入到一个新的集合里
这时候播放动画,会发现动画很快的播放了一遍,我们可以在物体属性–Mesh Seaquence里进一步设置,起始帧设置动画开始的时间,速率设置每一帧持续的时间,然后是模式:
- 空白:播放一遍后消失
- 扩展:播放一遍后保持在最后一帧
- 重复:重复播放
- 弹跳:不理解,感觉是照一定规律乱变
- 关键帧:关键帧动画
着重介绍一下关键帧模式,再此模式下我们可以通过输入数字(想显示第几个模型)后按下I打关键帧,来决定这个时间点要显示的模型(可以通过打关键帧的方式解决MV导出的顺序问题)
如果有需求,可以曲线编辑器内调整曲线插值模式为常值,不然它会加载一个个模型的加载过去(例如第一个关键帧为1,第二个为6,默认会1,2,,3,4,5,6而不是1,6)