Skip to content

1. 获取游戏原本的武器贴图动画

文档作者:HK560

要制作武器mod,我们肯定是需要获取游戏原本的武器模型手臂模型还有贴图动画等资源文件。

考虑到可能部分制作者是第一次尝试制作mod;我推荐找一个地方新建一个R2Modding文件夹,用于存放我们之后用于制作mod的项目和相关文件。

我们可以新建一个文件夹R2Modding/modProject/Fennec45,用于存放我们本项目涉及的相关文件。

1.1 解包vpk文件

基本上,ttf2的模型文件存放在游戏目录下的vpk里,也就是Titanfall2\vpk下的vpk文件,这个vpk文件格式来自起源引擎,但又和其他常见的起源引擎游戏封装的vpk有些许不同,我们需要专门的工具来打开浏览。

这里推荐使用Harmony VPK Tool来打开提取vpk文件

我喜欢把用到的工具都放在一个特定的文件夹下,所以我把Harmony VPK Tool工具放到了R2Modding/toolWorkSpace里面,方便以后使用。

打开Harmony VPK Tool,选择Open VPK,找到Titanfall2\vpk下的vpk文件。

因为我们需要的是武器模型手臂模型等资源基本都放在englishclient_mp_common.bsp.pak000_dir.vpk文件里,所以直接找到这个文件并打开。

1openvpk

左边显示的是文件列表,右边显示的是对应文件基本信息。我们点击左边的RootDir,再点击右边的Unpack按钮,选择一个位置导出。

我这边选择的是新建个文件夹R2Modding/vpkUnpack/englishclient_mp_common.bsp.pak000_dir,并导出到此文件夹下,点击确定导出。

2unpackvpk

最后的文件布局大概是如此

R2Modding/vpkUnpack
└── englishclient_mp_common.bsp.pak000_dir
   ├── cfg
   ├── depot
   ├── maps
   ├── materials
   ├── models
   ├── resource
   └── scripts

这样我们就得到englishclient_mp_common.bsp.pak000_dir里的所有内容了,之后我们会频繁的使用此文件夹里的内容。

1.2 获取武器模型MDL文件

我们的模型文件基本都在englishclient_mp_common.bsp.pak000_dir\models文件夹下,包括人物模型,武器模型等。我们需要的R97的模型文件在englishclient_mp_common.bsp.pak000_dir\models\weapons\r97文件夹下。

如果你需要其他找到武器模型的文件位置可以参考NoSkill文档

此r97文件夹有如下两个文件

r97
├── ptpov_r97.mdl
└── w_r97.mdl

其中以ptpov_开头的文件是武器的第一人称下模型文件(你自己看到的),以w_开头的文件是第三人称下的武器世界模型文件(第三人称下你看到角色上拿的武器)。

我们把这两个文件复制到R2Modding/modProject/Fennec45/orgMdl文件夹下。

1.3 获取武器贴图文件

与模型文件存放的路径有所不同,游戏的贴图材质大部分存放在游戏目录下的Titanfall2\r2\paks\Win64文件夹里的rpak文件里。(vpk文件里也有存放材质和贴图,但比较少用于特殊情况)

rpak是重生自己封装的一种文件格式,需要特定的软件打开。

这里推荐使用RSX来打开浏览rpak文件。

同样的我们把这个工具下载下来并丢到R2Modding/toolWorkSpace/rsx文件夹下。

打开rsx.exe,选择Open File...,找到Titanfall2\r2\paks\Win64文件夹,我们要找的武器贴图存放在common.rpak里,找到并打开。

3rsx

RSX的使用没有看起来那么复杂,大家自己摸索一下就会了。

基本上就是左上角Edit > Settings里打开设置窗口配置一些导出的参数和格式。

Asset List则是你刚刚打开的rpak文件里的资产列表,可以在上面的窗口中搜索。

选中某一个资产就可以在Asset Info窗口中查看信息。

找到我们的r97武器材质,在Asset List窗口中搜索r97,会罗列出一堆资产。

有材质和贴图,我们可以直接找到材质点击导出,这样也会顺带导出此材质使用到的所有贴图。

4rsx

然后我们就可以在rsx.exe所在目录下的exported_files文件夹下找到我们导出的贴图文件。

rsx
├── exported_files
|  ├── ...
|  └── texture
|     └── models
|        └── Weapons_R2
|           └── r97
|              ├── R97_CN_ao.png
|              ├── R97_CN_cav.png
|              ├── R97_CN_col.png
|              ├── R97_CN_gls.png
|              ├── R97_CN_ilm.png
|              ├── R97_CN_nml.png
|              └── R97_CN_spc.png
├── imgui.ini
└── rsx.exe

5tex

我们复制这些贴图文件到R2Modding/modProject/Fennec45/orgTex文件夹下之后备用。

1.4 提取第一人称武器MDL文件里的模型和动画

回到刚刚提取出来的武器MDL文件上。

如果你制作过L4D2等其他起源引擎游戏的MOD,那么你一定对MDL文件不陌生。但是当然泰坦陨落2的MDL文件和L4D2等其他的MDL文件还是有所不同。不过我们还是可以使用Crowbar来进行反编译得到模型和动画文件。

下载Crowbar,并解压到R2Modding/toolWorkSpace/Crowbar文件夹下。

打开Crowbar.exe,并切换到Decompile选项卡。

6crowbar

参考上图进行设置

接下来我们就可以反编译MDL文件了。

因为是要提取第一人称下的模型和动画,所以我们需要选择ptpov_r97.mdl文件。

7crowbarDecompile

如上图,在MDL input中选择我们刚刚提取出来的ptpov_r97.mdl文件路径,在Output to 中填入想要decompile到的文件夹路径。我这里习惯根据不同mdl类型导出到项目文件夹下的不同文件夹里,因为是ptpov所以我选择导出到Fennec45\decompile_ptpov

然后点击Decompile按钮,等待反编译完成。

我们转到刚刚反编译到的文件夹,可以看到我们提取出来的模型和动画文件。

Fennec45/decompile_ptpov
├── ptpov_r97 decompile-log.txt
├── ptpov_r97 decompile-MDL.txt
├── ptpov_r97 decompile-VTX.txt
├── ptpov_r97 decompile-VVD.txt
├── ptpov_r97.qc
├── ptpov_r97_anims
|  ├── ads_in_anim.smd
|  ├── ......
|  └── wind_loop_anim_layer.smd
├── v_acgs.smd
├── v_cro.smd
├── v_holo.smd
├── v_proscreen.smd
├── v_r97.smd
├── v_r97_magazine.smd
├── v_r97_sight_front.smd
├── v_r97_sight_on.smd
└── v_r97_sight_rear.smd

其中根目录下的.smd文件是模型文件了,ptpov_r97_anims文件夹下的是动画文件。

ptpov_r97.qc是核心的配置文件,其内容交代了如何组合模型和动画。具体请阅读文档QC - Valve Developer Community

推荐安装VSCode,并安装扩展 Valve KeyValue Files Support来打开编辑qc文件

接下来简单讲解一下qc文件的结构

qc
$modelname "weapons/r97/ptpov_r97.mdl" // 编译出来之后的模型文件路径
qc

....

$bodygroup "ptpov_r97"
{
	studio "v_r97.smd"  //武器本体模型文件
}
$bodygroup "proscreen"
{
	blank
	studio "v_proscreen.smd"  //击杀计数器模型文件
}
$bodygroup "sight_holo"
{
	blank
	studio "v_holo.smd"  //全息瞄准镜模型文件
}
$bodygroup "sight_acgs"
{
	blank
	studio "v_acgs.smd"  //ACGS瞄准镜模型文件
}
$bodygroup "sight_cro"
{
	blank
	studio "v_cro.smd"  //CRO瞄准镜模型文件
}

....

$bodygroup中配置的是模型文件,不同的分类可以用于不同的作用,例如$bodygroup "proscreen"中存在两行,第一行是blank,第二行是studio "v_proscreen.smd",第一行表示此bodygroup不使用任何模型文件,第二行表示使用v_proscreen.smd模型文件。此时它对应了游戏里选择装备击杀计数器/或不装备时候,应该显示的模型是怎么样的。因为第一行是blank,代表空,所以不会显示任何模型,第二行是studio,表示使用模型文件,所以会显示v_proscreen.smd模型文件。其他bodygroup也是类似的

qc
$texturegroup "skinfamilies"
{
	{ "models\Weapons_R2\r97\R97_CN"          }
	{ "models\Weapons_R2\r97\R97_CN_skin_31"  }
	{ "models\Weapons_R2\r97\R97_CN_prime_01" }
	{ "models\Weapons_R2\r97\R97_CN_prime_02" }
	{ "models\Weapons_R2\r97\R97_CN_prime_03" }
	{ "models\Weapons_R2\r97\R97_CN_prime_04" }
	{ "models\Weapons_R2\r97\R97_CN_prime_05" }
	{ "models\Weapons_R2\r97\R97_CN_prime_06" }
}

$texturegroup中配置的是材质路径组,不同的组对应不同的皮肤材质路径,这些材质路径对应了游戏里选择不同皮肤时候,应该的材质路径是什么。

qc
$attachment "CAMERA_BASE" "jx_c_pov" 0 0 0 rotate -90 -90 0
$attachment "CAMERA" "jx_c_camera" 0 0 0 rotate -90 -90 0
$attachment "L_HAND" "ja_l_propHand" 0 0 0 rotate -90 -90 0
$attachment "R_HAND" "ja_r_propHand" 0 0 0 rotate -90 -90 0
....

$attachment中配置的是模型附件,例如CAMERA_BASE表示武器的相机基座附加在骨骼jx_c_pov上,后面跟着是一些偏移量旋转角度等。

qc
$definebone "jx_c_delta" "" 0 0 0 0 0 0 0 0 0 0 0 0
$definebone "jx_c_pov" "jx_c_delta" 0 62.992001 0 0 0 0 0 0 0 0 0 0
$definebone "jx_c_camera" "jx_c_pov" 0 0 0 0 0 0 0 0 0 0 0 0
$definebone "def_c_hip" "jx_c_delta" 0 39.369999 0 0 0 0 0 0 0 0 0 0
$definebone "jx_c_start" "jx_c_delta" 0 0 0 0 0 0 0 0 0 0 0 0

$definebone中定义的是模型骨骼和骨骼之间的关系。

qc
$animation "ads_in_anim" "ptpov_r97_anims\ads_in_anim.smd" {
	fps 30
}

$animation "ads_out_anim" "ptpov_r97_anims\ads_out_anim.smd" {
	fps 30
}
......

$animation中配置的是动画文件,例如ads_in_anim表示武器的瞄准动画,ads_out_anim表示武器的瞄准动画。

qc
$sequence "ref" {
	"ptpov_r97_anims\ref.smd"
	fadein 0.2
	fadeout 0.2
	fps 30
}

$sequence "walk_seq" {
	"walk_anim_static"
	"walk_anim"
	"walk_anim_static"
	"walk_ads_anim"
	blend "velocity" 0 173
	blend "ads_blend" 0 1
	delta
	fadein 0.2
	fadeout 0.2
	realtime
	fps 30
	loop
}

$sequence "walk_seq_nocam" {
	"walk_anim_static"
	"walk_anim_nocam"
	"walk_anim_static"
	"walk_ads_anim"
	blend "velocity" 0 173
	blend "ads_blend" 0 1
	delta
	fadein 0.2
	fadeout 0.2
	realtime
	fps 30
	loop
}

......

$sequence中配置的是动画序列,和一些配置信息。

其他一些配置参数和变量不再过多详细介绍,一些参数会在后面着重介绍。具体的信息可以访问Valve Developer Community查看。

1.5 在blender中组合模型和动画

基本上模型和动画我们都有了,可以开始尝试在Blender组合出武器模型并使用动画了

为此我们需要安装使用Blender, 我推荐使用Steam上安装的Blender,因为我们可能会频繁地切换版本,这在Steam上会比较方便。

因为受限于不同插件依赖的Blender版本,本教程主要使用Blender 4.2LTS版本

同时我们还需要下载安装Blender Source Tools插件,用于打开读取多个起源引擎的文件格式,其中就包括.qc .smd等格式

具体如何安装Blender和插件这里不再赘述,请自行网上搜索文档和教程。

所以,让我们打开Blender新建一个项目

然后导入我们反编译出来的武器的qc文件

8importqc

9importqc

然后稍等片刻,我们就可以看到导入进去的武器模型和动画了

10blenderload

1.5.1 导入手臂模型

完成上面的步骤之后我们能够得到武器模型和武器动画,但在制作武器mod时候我们可能还需要人物手臂模型才能更直观地对动画进行编辑。

获取手臂模型的过程和获取武器模型的过程非常相似,这些文件在englishclient_mp_common.bsp.pak000_dir\models\weapons\arms文件夹下。

englishclient_mp_common.bsp.pak000_dir\models\weapons\arms
├── human_pov_cockpit.mdl
├── petepov_workspace.mdl
├── pov_pete_core.mdl
├── pov_pilot_light_ged_f.mdl
├── pov_pilot_light_ged_m.mdl
├── pov_pilot_light_jester_f.mdl
├── pov_pilot_light_jester_m.mdl
├── pov_pilot_medium_geist_f.mdl
├── .......
├── pov_titan_medium_ion_prime.mdl
├── pov_titan_medium_tone_prime.mdl
├── pov_titan_medium_vanguard.mdl
└── pov_titan_medium_wraith.mdl

包含了泰坦的手臂模型和铁驭的手臂模型,因为我们制作的是铁驭武器模型,所以我们随便选一个铁驭的手臂模型即可,我选择的是pov_pilot_medium_geist_f.mdl,让我们把它也复制到R2Modding/modProject/Fennec45/orgMdl文件夹下。

然后一样使用Crowbar来反编译这个模型文件,反编译到Fennec45\decompile_pov_arm文件夹下。

Fennec45\decompile_pov_arm
├── pov_pilot_medium_geist_f decompile-log.txt
├── pov_pilot_medium_geist_f decompile-MDL.txt
├── pov_pilot_medium_geist_f decompile-VTX.txt
├── pov_pilot_medium_geist_f decompile-VVD.txt
├── pov_pilot_medium_geist_f.qc
├── pov_pilot_medium_geist_f.smd
└── pov_pilot_medium_geist_f_anims

其中的pov_pilot_medium_geist_f.smd就是我们需要的手臂模型文件看,让我们在刚刚的Blender项目中导入

记得在导入前,我们先在blender中选择骨架,然后和刚刚的操作一样导入,选择pov_pilot_medium_geist_f.smd文件,导入。

WARNING

注意在导入窗口右侧记得选择Append to Target,否则其会新建一个新的骨架,而不是将模型应用在原本已导入的武器模型骨架上

11blenderloadarm

导入之后可能会有很多类似以下的错误

Error: Material name "XXXX" is too long to import

这个我们不需要在意,只是材质名太长了,Blender会报错,我们忽略即可。

13armwithweapon

至此我们就已经完成了游戏原本的武器模型动画导入,让我们把这个Blender项目保存一下,保存到Fennec45\blenderPorject\ogwpn.blend文件中,供以后使用。

todo....

Powered by VitePress, ❤️ from HK560