写一写在红警2里vxl转shp制作动画过程中的小技巧

ICE Lab Copyright 2021,All right reserved.
前排感谢克洛瑞德曼(B站ID:阿联UASR)在Voxelshop与MagicaVoxel上的帮助,感谢萌新(B站ID:上仙-符华)为本文演示提供的vxl素材。
注意事项:
本文需要一点PS基础与一些3dsmax基础,当然,对其他3D软件或图像处理软件的同等功能有所了解也可以。
本文共7894字
vxl与shp(pcx),这两者共同决定了红警2内的所有的美工素材。vxl作为体素文件格式,与shp这种2D素材存在着相互转换的障碍。许多时候我们需要制作一些单位变形动画,而这些单位往往又是vxl单位,这时候转换vxl为shp就变得格外重要。当然,vxl转shp并不难,只需要用Voxel Section Editor(下文简称vse)的1.39版本里的3D Modelizer功能即可。不过,modder们转vxl为shp最大的需求并不是单纯做图标或是做碎片,而是做vxl变形成建筑或是变形成另一个单位的动画(Ares的vxl变形成vxl时调用shp动画的功能似乎有bug,此处待查,我不保证这句话的准确性),这个过程中出现的问题就远比简单的转换来得多多了。在此本文就简单以vxl的变形动画为引子,聊一聊关于vxl转shp中我认为需要注意的一些问题与动画制作过程中的小技巧。

一般来说vxl转shp的步骤分为vxl端处理,3D端处理与渲染成png序列后转换成shp这三部分,所以本文也按这些步骤的顺序来逐个介绍其中我所知道的一些小技巧。
一.vxl转通用3D格式(obj等)
一般来说,vxl转3D会用到的方法是使用vse1.39里的3D Modelizer功能。该功能我就不再详细介绍了,部分内容可以看我之前发过的专栏CV3465938。但是这个功能有许多不好的地方,比如转出的单位面数过多,转出的单位并不像vxl那么棱角分明,贴图过于模糊等等问题。下面我针对以上问题提出一些在实际使用中我的解决方案。
1.vxl棱角不够分明
在vse1.39的Tools工具栏里,我们可以找到vse自带的转3D必备的3D Modelizer选项,然而这个选项并不是完美转换。一方面vxl模型作为是体素模型,转换成通用3D模型后应该是类似mc内方块场景般的颗粒感,然而实际使用中转换后的效果如下:


很明显,转换后的模型比原来显得更糊了。那么有没有办法转出完美vxl模型,也就是跟原版一样棱角分明的那种呢?vse在此其实留了个后门,我们可以打开3D Modelizer的Views菜单,菜单入口样式如下图所示:

然后选择这个菜单里Model Quality选项,你会发现一个如下的菜单。

然后你就会发现,当你选择Quad Based 3D Model选项的时候,3D Modelizer的模型样子就变成了很舒服的倒角但不模糊的样子。

而当你选择那俩Very Low或者是Visible Triangle Cubes样式的时候,vxl原本的棱角分明回来了。

然而,当你满怀欣喜的以为你真的能转出这样的模型的时候,事实却并不是这样。熟悉vse转换的人都知道,打开3D Modelizer后第一个步骤便是调整贴图格式并加入材质效果。而这时你会发现,如果你使用的不是Medium样式而是Low或者Very Low样式的话,Texture Effects的贴图渲染区整个都灰掉了,换句话说就是你无法输出贴图,你输出的模型只能是白模。

很明显,作者功能没做完,目前我的vse1.39.273在这里就是个未完成品。可能后续vse出了新版修了这个问题,如果修了的话,vse直接转完美vxl模型就不是梦了。(所以说vse的作者很工口,他早就想写这个功能了,但是留个口没写完。等到用户等的受不了了再放出来)
但是当前这个问题对于我们来说并非无解。还记得VoxelShop吗?一个为vxl导入MagicaVoxel提供跳板的完美软件。VoxelShop能直接打开红警2的vxl模型并将其转换成vox文件。vox文件则能被MagicaVoxel读取,而MagicaVoxel自带obj模型导出功能。虽然绕了点,但是经过这一系列的转换,我们就可以获取完美的3D版vxl模型。(在此感谢克洛瑞德曼(阿联UASR)的指导)。
只不过MagicaVoxel有个128大小限制(详情见我之前写的专栏CV3465938),没有限制的0.99.5现在网上又只能找到MacOS版,同时下载官网的Github挂了(估计是域名没续费),永硕网盘也挂了,所以目前暂时破除限制的方式是按照以下克洛瑞德曼视频中的描述来弄。




不过u1s1,当你的vxl考虑法线烘焙后,游戏内显示效果或许更接近vse转出的模型的那种圆滑边缘。因此用完美vxl转obj的方法还是选择vse的3D Modelizer的方法,两者的选取就见仁见智了。电脑配置低的建议前者,不想费劲转多个软件而只想用vse搞定的建议后者。
2.vxl转出的模型面数太高
现在主流的3D模型其实都是“空的”,即模型表面布满节点,点与点之间构建面的空心模型。然而vxl却不是空的,它是以体素为单位的实心模型(你可以理解为单位体素内实心且不可分),同时根据obj的转换规则模型会以每个表面的体素的四角为点来构筑模型。这样往往使vxl转换后的模型面数与点数高的离谱,尤以vse的3D Modelizer功能转出的模型更甚,而MagicaVoxel转换obj的面数情况则会好很多。


那么我们是否能追求极致,把面数进一步减少呢?
在vxl转shp上,我曾经做了个厄普西隆缝合怪。缝合怪本身不难做,拼合模型加绑定骨架就行了。但是当时我转换vxl后,每个vxl转出的模型部件都有几十万面,而它们拼合起来以后则形成了一个上百万个面的怪物模型,要知道上百万面的模型在影视级都算是精模了,无疑这让我的电脑变得巨卡无比,我制作骨骼动作时都必须在绑定骨骼与蒙皮后单独导出骨骼,再在另一个空max文件里单独创立一个biped骨骼,拉完动作后用biped的脚本导入功能才完成了动画制作。视频如下:

尽管我的模型动画与绑定是分开做的,但当时我为了减轻电脑压力,曾经使用了一个方法来减少面数。
首先选中需要减面的部分,然后点击3dsmax的工具栏框。也就是如下图所示的这个部分。


选择后,由于obj导入max的模型都是网格模型,我们先将其转换为多边形模型。

注意,这个操作与转换为可编辑多边形是等价的。转换好以后,选择建模菜单中的几何体子菜单,点击四边形化全部。

然后我们就能发现,模型的面被明显的减少了。

与此同时,我们发现模型的质量没有明显变化。

当然,作为3dsmax来说,还有另一个更普遍的方法来减少面数,即专业优化(英文名ProOptimizer)修改器。

修改器初始化后,修改器设置如下图:

大多数设置按照默认设置即可,由于我们导入的模型带有贴图,所以别忘了勾选材质与UV栏中的保持纹理,然后点击计算即可得到结果,计算后我们自由设置顶点百分比,个人推荐50%左右即可,太小会失真,太大又没意义,鉴于vxl模型的精度,保持35%-50%的顶点都是可以的。


上述演示我所用的是3D Modelizer处理的模型。MagicaVoxel处理后的模型的减面方法与之有所不同,由于MagicaVoxel软件本身的优化,专业优化修改器处理会使MagicaVoxel处理后的模型产生严重的失真。

不过,石墨工具四边形化的减面方式还是可以用的,使用石墨工具以后,我们可以在原模型的面数上减少约50%。同时石墨工具让大量三角面合并,为之后制作动画提供了便利。

3.贴图转换
熟知shp的人都知道,shp的所属色是靠16-31号色来完成的。我们转换vxl时vxl单位色盘自带红色非所属色区,很明显,如果我们依旧按照红色来导出很明显不明智。

vxl一般很少使用绿色,所以此时我们可以将vxl所属色改成绿色后导出,导出方式依据3D Modelizer与MagicaVoxel处理方式的不同有如下两种修改方式:
1.3D Modelizer


2.MagicaVoxel
MagicaVoxel里可没有所属色这个东西,所以我们需要PS来手动修改贴图的红色为绿色。最方便的方法就是使用调整工具栏里的可选颜色功能,选择颜色为红色,修改青色-2%左右,洋红-100%,黄色+20%左右,黑色+50%左右,然后再在矢量蒙版里选中贴图中的橙色与黄色区选中,蒙版填充黑色将滤镜改色效果对该区块颜色无效化即可。


当然,PS的功能无疑是强大的,使用PS手动调色的方法也适用于3D Modelizer法导出的贴图。绿色只是一个例子,当你的vxl含有绿色时,你也可以用上述两种方式将所属色变成蓝色后导出,导出帧序列后,配合修改过的自定义色盘可以让你方便把帧序列变成可用的shp,自定义色盘神器Palette Studio一般用来制作该步骤的自定义色盘。它的使用方式参考该软件作者的声明与我之前写的说明书,下载地址也在作者声明与我的说明书里有提及。


当然,下文也会进一步在转换部分提到自定义色盘的制作过程。
二.转换后的动画制作
转换这一初级的步骤完成以后,下一步就是做动画了。给3D模型做动画的教程多如牛毛,我在此针对vxl这个特殊的模型格式介绍一些特殊的技巧。
1.拆分零件做动画
当你成功导出模型后,由于我刚才介绍的空心特性,你的vxl许多实心方块的作用在导入模型后都被省去了,假如你需要用到这些实心方块的时候怎么办呢?举例说明,我们需要制作某个支架展开的动画,但是支架由于导出的原因与原模型粘在一起。强行分开的话支架与模型贴合的部分会丢失背面贴图。


此时我们可以在vxl层面直接解决它。我们打开部署后完全体的vxl,将其支架与车体单独分为两个vxl并分别用3D Modelizer分别导出成不同部位,这样我们就可以得到一个支架的单独模型,背面丢失的贴图也因为重新生成而回来了。

这种方法适用于所有vxl动画,只要有刚性零件需要参与运动的一律都可以拆分零件制作动画,缺点是这个方法比较费时,需要shp制作者对vxl的编辑有一定基础。
2.max内拆分做动画
vse的建模操作相比max是麻烦不少,大多数时候我们也不需要在vse里把部件一个个分离后制作动画。再以支架为例,我现在需要制作支架的下半部分伸缩结构的动画,而我们现在拥有伸缩结构后的模型,也就是说动画只需要需要把模型推进去然后反转时间轴即可,此时最简单的方法是在可编辑多边形/可编辑网格中选中架子的下半部分,单独将下半部分支架分离成一个部分并K帧缩进即可。



这种方法最适合伸缩效果的制作,毕竟这种情况下将零件去vse里单独抠出来很麻烦且不必要。
3.绑定骨骼做动画
骨骼绑定一般在max里用来制作关节性运动,就比如双腿,机械臂,摇杆摆臂结构等。同时骨骼也可以用来进行一些可以抽象为多摇杆结构的东西比如头发尾巴啥的。在vxl里,摇摆支架,吊车摆臂等模型最适合用骨骼绑定法来制作了。骨骼绑定的原理即是将原模型的点映射到骨骼的运动上,从而骨骼的运动能抽象原模型的运动。通过原模型自身点与骨骼对应的权重不同从而实现原模型更先进的运动方式。以下是例子:


4.动画节奏与设计
动画节奏与设计往往比技术更重要。为何PS拼接的建筑与原版风格有些差距?为何自制建筑动画总感觉有些诡异?这些问题都集中在动画节奏与设计上。我在此提出一些我自己的思路供大家参考。
首先,既然你决定用3D软件来做动画效果,很多时候就没必要让零件运动显得直来直去,使用一些适当的扭曲与旋转都有助于玩家增强对动画设计的好感。

同时,并不是所有时候零件设计都能完美切合你预想中的动画,有时候在零件设计上产生的错误,用一些适当的放缩或是错位等手段是可以遮盖住玩家对动画合理性的疑虑。

在动画设计节奏上,均速设计会让人感到死板,而带有合理加速度变动的动画与一些弹跳功能则会使动画显得更富有生气且灵动。

最后,我们可以利用一些模型内元素来让动画的表现形式更具合理性。

三.动画转帧序列再转shp
当动画在max里做好以后,渲染成帧序列再转shp则是必经之路。vxl动画的渲染并没有想象的那么简单,无论是尺寸大小,渲染样式还是最终转换都需要注意一些必要的东西,否则做出来的效果会比较差劲。
1.场景搭建
关于vxl的灯光场景搭建,在ra2diy论坛的精华贴里mk给了一个适用于原版玩家的很好的例子。不过,vxl在游戏内的表现力与vpl有关,做个不那么准确的解释,vpl定义了vxl在游戏内渲染环境的灯光参数与部分高亮色参数。当你做的mod更改了vpl以后,vxl灯光的合理搭建则成为了渲染一个好的vxl动画的必备步骤。适当调节vxl灯光的曝光度能加强vxl动画与原模型的拟真度。

一句话就是,vxl灯光场景的搭建应匹配游戏内效果,参考vpl效果后再考虑渲染才是良策。
2.渲染设置
shp渲染中”不与边缘抗锯齿处理“这个设置是每个RA2素材制作者的必修课。vxl更极端一点,因为vxl自身就是充满了锯齿,如果在渲染中你加入了抗锯齿选项,反而会多此一举。因此渲染时直接取消抗锯齿勾选有时反而会更好。
只不过这也与你的vxl有关,如果你的vxl突出像素感与颗粒感,花纹正交较多,方形点缀灯需要突出显示则这条比较适用。但如果你的vxl需要营造弧线感,细节一般以弧形花纹为点缀而不是小灯的话,抗锯齿选项还是勾选更佳。

无论如何,不与边缘抗锯齿处理这项始终要保持勾选以省去不必要的麻烦。
3.动画尺寸与匹配
快速确定动画尺寸与原vxl匹配是一件必要的事。由于ImageShaper无法放缩帧序列,而Shp Builder的放缩功能又很蠢(除了硬边缘保留这个还可以以外,Shp Builder的非整数倍率放缩会使模型变得明显有拉伸感与低质感),在渲染时一步到位渲染出合理大小的帧序列无疑是更佳选择。在此我提供一个我现在用到的合理办法。
首先我会进游戏将vxl在游戏内的表现截图,地板背景最好是空白且易分辨的来方便我们辨认vxl的边界。(海洋的蓝色明显比陆地的黄绿色好分辨,所以你可以用地图编辑器直接把你的新单位摆海里)

然后将上述截图的100%大小导入PS内,选取特征像素并用辅助线做好标记(辅助线快捷键Ctrl+R,打开辅助线状态时再次使用快捷键会关闭辅助线系统)。

回到max,任意设定当前摄像机距离下的渲染尺寸,并且得到一张背景透明的渲染图,将其以原大小丢入PS并将一侧对齐。

我此时设定的渲染大小是300*300,很明显渲染出的图片组比vxl在游戏内的显示效果大了。这时我们在PS里锁定长宽比例放缩,直到图像与游戏内显示效果几乎重叠为止。此时记住放缩的倍率值。

根据上图所示,我们在max所需要输出的真实边框长度即为300*94.78%,取整后约为283。代入检验后果然符合要求。

但在此时,帧序列仅仅只完成了校准尺寸的步骤,我们还需要完成校准shp中心的步骤才能做出合格的shp来。vxl做部署动画一般有两种需求。一是做单位部署成单位,比如原版武装直升机的部署动画;二是做单位部署成建筑,比如原版基地车展开动画。若是单位部署成单位,则动画中心点与vxl单位中hva的设定点对齐;若是单位部署成建筑,则动画依据建筑尺寸按照建筑部署时单位的中心点对齐。
在此我个人推荐的做法是,首先一律按照单位部署成单位的要求来做,即动画与绝对中心点对齐。第二将所有帧用ImageShaper制作成一个shp,然后打开Shp Builder内的建筑网格功能,按照建筑网格的尺寸再考虑通过Resize Carvas功能与建筑中央对齐。最后再利用Shp Builder的帧移动功能,将对齐完成的shp拆成多个部分(如建造动画,建筑本体,建筑动画,毁坏动画等)逐一输出。以下是例子:


3.所属色问题
所属色一直是所有帧序列转shp的通用问题。刚才我提到,所属色需要设定成一种与模型其他部分都不一样的颜色来方便自定义色盘导入。那么当你模型处理好以后在色盘方面你需要怎么做呢?在此我继续介绍所属色有关的问题。
首先,建筑在抛开自定义色盘的情况下一般都使用默认的unit系色盘,再加上vxl无法自定义色盘,所以vxl部署后的建筑一般也用默认色盘即unit系色盘。unit色盘里雪地色盘的颜色是最多的,有些mod甚至将雪地色盘强行在所有情况下均使用。所以我在这以unitsno.pal的自定义色盘为例,展开介绍如何使用新工具Palette Studio来自定义所属色。
使用Palette Studio打开unitsno.pal色盘原稿,我们会发现所属色区是红色阶梯填充。首位是252 0 0,末位是32 0 0。

200号色也是252 0 0。很明显,为了让导入时不产生颜色冲突,将所属色区换成独一无二的颜色。同时我们不需要长亮色来加入动画,以此减少动画在暗光条件下部分颜色异常闪亮的问题。我们需要删掉色盘里的常亮色区域。
所属色更换色系在老工具Pal Editor里是个苦差事,但是在新的Pal Studio里我们只需要用梯度工具即可解决。鉴于我刚才将该vxl动画的所属色改成了绿色,那么此时我们需要绿色的所属色色盘来辅助导入。

然后我们用252 0 252的背景紫红色删掉常亮色区。



另存为完成以后,使用ImageShaper制作shp时导入该色盘即可。
(至于原始的unitsno.pal这个色盘在哪能找到的问题,我觉得能看下去这篇文章的人应该都懂吧,这属于modder基础知识…………(在ra2.mix的子mix—cache.mix里即可找到,mix文件用XCC Mixer打开))
四.shp最终杂谈
作为一个不会vxl制作的人来说,我一直认为vxler们在简陋的三视图条件下搭建立体模型挺厉害的,所以我相信vxler们学习如何将自己做的vxl转换成shp并做一个合适的部署动画也是易如反掌。文章的最后我提几个可能会用到的小细节,以方便各位制作shp时不必另外再寻找资料。
1.shp建筑炮台的素材旋转方向
建筑炮台方向第一帧应垂直向上,然后沿中轴逆时针旋转。一般炮台为32向。以每个方向单帧的炮台为例,前32帧为本体,后32帧是影子。

2.shp建筑炮台的初始方向
建筑建造后炮台初始部署方向为右上角(详见原版巨炮建造动画)

3.shp建筑影子完整性
shp单位需要完整影子,因为shp单位本体可以在图层上高于影子。但shp建筑的影子绘制高度高于本体,所以shp建筑一定不能做完整影子否则会出现影子前置错位bug。

4.建造动画的推荐大小与帧数。
如果是vxl单位部署成建筑的话,建造动画(部署动画)一般不要超过50帧,最好不要超过100帧。50-100帧可能会出现ini写对了但游戏内不显示的问题。100帧以上该问题发生概率会几乎100%(有人说绝对不能超过100帧,但我做建造动画的时候超过了一次100帧还成功了的例子。只是再想复制一次就很难了,哪怕我对那个shp删掉2帧,那个shp也不再显示了,有点玄学)。
(玄学:建筑大小似乎与建造动画长度有关,越大的建筑使用长建造动画越不容易出bug,但是1*1的小建筑使用50帧以外的长建造动画就容易出毛病)
建造动画最好与建筑本身素材尺寸一致。否则可能会造成建筑缺角或是建造动画无法显示或显示不全。(做红警2mod的不骂个西木**那还能算modder?)

如果部署成单位的话似乎没限制(待查),但是你确定真要做个一千帧动画折磨玩家?
文章最后希望各位读者看完本文后能入门vxl转shp后做部署动画的能力,在此我也提前祝各位读者春节快乐,万事如意。