《初音未来歌姬计划 Mega 39’S》舞台导入起源引擎操作

Xingpeng 发布于 2025-05-18 173 次阅读


物件准备⏳

Blender准备工作

前情提要

插件安装:

在准备好了Blender Source Tool以及SourceOps工具源码之后,可以在blender内进行安装操作
打开Blender,点击菜单栏-编辑-偏好设置。在偏好设置对话框中,进入到插件选项卡。
单击选项卡内右上角的倒三角▽箭头,打开折叠菜单,菜单内选择从磁盘安装指令(如图)

(从磁盘安装)

(找到并安装文件)

(正确安装Source Collision Tools)

安装好后,在Blender内右下角场景选项卡内,会出现Source Collision Tools相关字样

模型预处理:

进入 Blender 后,点击左上角菜单栏文件-导入-FBX(.fbx),导航到之前教程中的FBX导出目录下,导入FBX文件

踩坑注意:不要着急立刻导入Blender,我们要对模型进行整体缩放操作
因为Blender的单位m和Hammer工具的Unit单位并不通用,如果未进行缩放操作的话而是直接导入blender,在辛苦的工作之后导出也只能得到个“微缩模型”,到时候再进行缩放就很麻烦了

(导入fbx文件)

(对模型应用缩放变换)

如此操作之后,50X的缩放倍数可以达到Hammer的同比例模型大小。

导入了模型后,会发现视野因为倍数的放大而遭到限制,解决方法如下
单击主视图窗口,按下键盘N按键,在弹出的菜单中选择视图,在结束选卡中填入你认为合适的大小(默认1000,要大于1000即可,推荐5000)

调整视野之后,可以切换视图为视图着色方式为材质,方便辨认(如图)

(调整视图结束范围)

(调整着色方式)

插件配置:

此次配置的插件为 SourceOps

在主选项卡中按下N,打开辅助菜单,如果正确安装了SourceOps插件会在末端显示同名选项卡
进入SourceOps选项,首先解释一下需要使用的选项卡作用

  • ⚙-Games是游戏配置选项,在这里可以配置不同起源引擎游戏的运行目录,模型/地图源文件存放点,以及导出的模型格式。
  • 📦-Models选择要处理的模型的骨架/参考/碰撞文件的集合
  • 🔧-Model Options模型参数设置,设置表面材质(影响击打效果和走路音效),是否是玻璃和是否为静态物品
  • 底部的快捷操作栏📂打开文件夹/SMD 导出当前模型的全部smd文件/qc 生成qc文件/MDL 检测并编译MDL文件/HLMV 使用HLMV预览模型/🚗一条龙服务(按顺序直接处理出成品)

在Games选项卡中,点击+添加一个新的配置
此次实例的游戏为Garrys'Mod(SteamDB/Steam)
名称Example改为你的游戏
Game选择你的起源游戏资源目录(非根目录,目的是存放gameinfo.txt游戏解析文件的目录比如HalfLife2/hl2✔而Halflife2/❌)
正确选择了目录后,之后的天空都会自动处理填入,如果没有自动填入,则Game文件夹配置不正确
极端情况下即使Game文件夹正确但未配置的话,需要手动指定
Bin文件夹则是游戏可执行文件夹下的根目录Bin文件夹(Sourcemod/bin)里面存放Hammer和hlmv等开发工具
Model文件夹则是模型输出文件夹Sourcemod\mod\models
其他的src文件则是存放源文件文件夹,可以随自己心意自定义指定存放目录

到此,SourceOps的配置基本完成。

模型处理🛠

这一部分,我们将对模型进行半自动化处理,大致步骤如下

  • 找到材质所对应的dds图像文件,并利用VTFEdit工具将其转换为vtf格式并创建vmt文件
  • 利用Source Engine Collision Tools对模型进行自动化碰撞箱创建工作,包括功能介绍和小问题的解决方法
  • 利用SourceOps工具对模型进行表面材质选择,文件导出,以及QC文件的创建工作

现在开始对模型的处理操作

第一部分:生成碰撞箱

首先在Blender内的场景集合中,新建一个集合(右键场景集合-新建集合),名称随意用来存放当前正在处理的模型文件,注意:这个集合内只能存放当前工作的一个模型,不能放置多个。
此次我们拿爱言叶中的扬声器模型(MZ_speaker)作为范例
在场景集合中,单击MZ_speaker,然后复制模型文件并粘贴到新建的工作集合中。
粘贴之后在工作集合中会出现子菜单选项 stg??pv0??s0?_gnd.00?(?为你的工程文件ID)
回到原MZ_speaker位置,点击👁隐藏模型,这一步做好如图

选中gnd复制品,点击右下角的物体属性选单,进入Source Engine Collision Tools选单-生成|
先来一个最简单的碰撞生成步骤

  1. 首先首先首先!点击Recommended Settings(推荐设置),插件会根据模型自动化调整后面的比率
  2. 点击Generate Collision from Faces(从面生成碰撞体)

到这里,碰撞体积就生成好了,但肯定不是最完美的,由于起源引擎年代比较久远了,对模型的处理并不能够很好的处理高面数模型,而且如果碰撞文件过于复杂,在游戏内的表现就是掉帧,最极端的情况下能从144帧掉到5帧,这肯定不是我们希望的,所以我们要对操作方法进行细分。

这里讲一下我大概制作流程。

  • 首先调整Extrude Factor(挤压系数)参数,影响每个外壳的挤出程度。默认值适用于大多数情况,我推荐是可以适当拉高一点推荐值。
Extrude Factor数值调小调大
碰撞精度越高越低
优化越差越好
碰撞质量倾向于线(细),更多的线倾向于椭圆(糙),更少的圆
  • Decimate Ratio(简化比率)参数:1.0时禁用简化。值越低=简化程度越高,生成更高效但准确性较低的碰撞网格。注意:简化会降低合并相似面的效果
  • 合并间距参数:合并两个细小间隙(通常合并的是极其短小的位置,玩家无法通过也就没必要制作的中空区域),如果你正在制作栏杆,栅栏等,可以以0.05为单位进行微调。
  • Dissolve(溶解度):如果启用,生成的碰撞网格会更加优化,但可能降低准确性。如果更看重准确性而非优化,请禁用此选项(推荐启用√)
  • Post-Merge(后合并):可显著减少小型或单独道具的外壳数量。但是如果为整个房间、关卡或有内部空腔的物体生成碰撞,最好是禁用,不然的话内部结构都会被最外层包裹。

选择好了处理方式并进行Generate Collision from Faces(从面生成碰撞体)处理后,会得到一个紫色碰撞箱。同时,脚本会自动创建一个Collisions Models(碰撞模型)文件夹,一定不要删除。
原模型会被隐藏可以自行打开对照,如果不满意当前碰撞箱想要重新处理,一定要先删除当前碰撞箱文件并打开显示👁复制后的工作模型,再次选中工作模型再进行处理,不然会对碰撞箱文件进行二次操作。

第二部分:简化碰撞箱

进入Cleanup子菜单,可以对模型进行二次清理以达到优化的效果。

下面对参数进行一些理解:

  • Similar Factor(相似系数):外壳之间的相似度百分比,达到此值才会合并。默认设置为90%,其意为两处网格相似度必须90%才会合并。此选项可以大幅减少不必要的碰撞部分,但滥用会导致两处碰撞面相连接,本来中空部分的会合并为一个完整体,所以对待百分比要慎用,可以自行测试。
  • 其次是Thin Threshold(薄面阈值):移除薄面时使用的阈值。默认设置为仅移除面积小于所有面平均面积10%的面。此选项同上,也是用来减少碰撞部分,滥用的代价虽然不会相连,但可能会删除掉一些细小细节部分

现在对按钮进行一些理解:

  • Merge Adjacent Similars(合并相似相邻物体):激进地合并具有相似相邻凸壳的物体,减少最终外壳数量并生成精度较低但性能更好的模型。如果原始模型本来就是低多边形模型,你可能不需要此选项,具体参数同上面的相似系数
  • Remove Thin Hulls(移除薄壳):根据薄壳阈值设置,移除远小于平均壳体积的薄壳

第三部分:后处理最终碰撞箱

在其他子菜单下,有多种选项可以选择:

  • Split Up Collision Mesh(分割碰撞网格):将选中的碰撞模型分割成多个独立对象,每个部分不超过32个外壳(用处不大,仅限极端情况)
  • Force Convex(强制凸面):将所选对象中所有的现有外壳强制转换为凸面。警告:此操作将删除所有非流形几何体,以及UV贴图和顶点颜色,慎用
  • Remove Inside Hulls(移除内部壳体):移除(完全或大部分)位于其他外壳内部的壳体,优化不可见处碰撞。
  • Cleanup Collection(清理集合):清理碰撞模型集合(如果存在),移除其中任何空的子集合

我推荐的顺序是如下

先进行Remove Inside Hulls(移除内部壳体)处理,首先移除内部不可见处的碰撞,减少模型大小。
再进行Remove Thin Hulls(移除薄壳)处理,处理掉了内部壳体或者带有空腔的壳体后,可能会残留一些刺头,对于这种未处理干净的刺头,可以适当拉高Thin Threshold(薄面阈值),然后通过Remove Thin Hulls(移除薄壳)方法,将其自动删除。

至此,你给你的第一个模型文件就做好了碰撞体积力(喜

(很好的碰撞体积)

导入起源引擎

模型的导出

这一部分就是引导你去使用SourceOps工具针对模型进行一个导出工作,并对其编辑QC文件,最终编译导入hammer。

首先回到主视角,按下N跳出菜单,进入SourceOps。
进入Models选单点击+新建一个模型工作

  • 名称:即为你的模型输出名称(如果是路径,则模型文件会存放到相应子目录当中)
  • 骨架:这是用于角色模型的选单,我们导出的为PROP道具模型,无需修改
  • 参考:这是模型外观的参考模型,选择之前新建的工作合集(注意,里面只能包含一个文件)
  • 碰撞:这是模型的碰撞文件,选择脚本自动生成的Collision Models
(导出操作)

完成操作之后的模型,我们要对纹理进行绑定
点击SourceOps中导出栏的📂标志,打开模型文件目录
双击打开Compile_Models.SMD文件(用文本编辑器打开,推荐VSCODE)
在文件当中可以看到大量的位置和材质名称,材质名称沿用的是mega39s的命名方式,我们要进行修改。(例如SD018Z_ground_01.001)
比如文件名是K1Z_ground_01,我们可以把材质名全部替换为K1Z_ground_01即可

(替换材质名)

随后返回Blender,从主视图的左上角往右拉动可以分出第二窗口,并将第二窗口改为着色器编辑器
在着色器编辑器中,选中一个节点,在节点编辑框中可以找到纹理文件名,我们需要找到该纹理文件

(纹理文件名)

材质的处理

打开VTFEdit
在VTFEdit软件内,单击File-Import-导入上一步中得到的文件
在弹出的VTF Options中默认即可
图像处理过后,单击File-Save As进行另存为操作,保存到你游戏目录下的materials\内,名字就是之前步骤中你替换过的材质名,要一一对应

(导出VTF文件)

随后,在VTFEdit软件内,点击Tools-Create VMT File创建VMT文件
在弹出的VMT配置菜单中进入Options选单
Shader替换为VertexlitGeneric
Surface 1替换为你的材质表面纹理类型(比如草,岩石,铁皮)
如果是对于所有材质,请取消掉Translucent,如果是透明材质的话,请只打开Alpha Test
至此,材质的处理就完成了

(Yatta!完成了)