ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

起源引擎自定义枪械模型

起源引擎自定义枪械模型

G28 模型接入问题总结与新模型检查清单

更新时间:2026-10-14

本次目标

把 Sketchfab 作者trolosqlfod的 HK G28 模型接入 Source SDK 2013 Multiplayer 的mod_hl2mp,让第一人称视图中:

  • 枪位于屏幕右下方;
  • 枪口朝准星方向;
  • 使用原始模型的颜色和贴图;
  • $scale保持1;
  • 不添加手臂、不改变玩法。

原始资产授权:SketchfabHK G28 Sniper Rifle,作者trolosqlfod,许可证CC-BY-4.0。

最终文件和路径

源文件:

  • F:\game_素材\hkg28-convert\source_qc_smd\v_hkg28.qc
  • F:\game_素材\hkg28-convert\source_qc_smd\v_hkg28_ref.smd
  • F:\game_素材\hkg28-convert\source_qc_smd\w_hkg28_ref.smd

最终视图模型 QC 关键参数:

$scale 1.0 $origin -14 8 8 -90

编译目录:

H:\cfgame\Steam\steamapps\common\Source SDK Base 2013 Multiplayer\hl2mp

运行时目录:

H:\cfgame_test\origin-of-fps\source-sdk-2013\game\mod_hl2mp

最终视图模型文件已复制到:

H:\cfgame_test\origin-of-fps\source-sdk-2013\game\mod_hl2mp\models\weapons\

包括:v_hkg28.mdl、v_hkg28.vvd、v_hkg28.dx90.vtx、v_hkg28.dx80.vtx、v_hkg28.sw.vtx。

遇到的问题和根因

1. 模型消失或顶在头上

最初的$origin -6 5 12不适合这个模型的坐标系。模型本身的几何包围盒大约为:

X = -12 .. 28 Y = -4.68 .. 4.68 Z = -6.88 .. 6.88

模型长轴实际在 SMD 的X方向,经过视图模型坐标转换后,枪口方向需要通过 QC 的旋转参数对齐 Source 第一人称坐标。最终使用:

$origin -14 8 8 -90

其中:

  • -14:把枪沿枪口方向向前移,避免枪身过于靠后;
  • 8:保持合适的横向和高度偏移;
  • -90:把模型长轴旋转到准星前方。

2. 枪的颜色像掉漆,瞄准镜出现错误颜色

这不是原始 BaseColor 损坏,主要是两个转换问题叠加:

  1. UV 的 V 坐标方向错误。原始 glTF 贴图和 Source SMD 的 V 轴方向相反,导致模型采样到图集的上下错误位置。修复方法是对视图和世界 SMD 的每个顶点执行:

    v = 1 - v
  2. 材质名中的点号被 StudioMDL 处理成扩展名分隔符。原始材质名为mat0.001到mat0.006,编译后的模型最终只剩一个mat0材质,导致枪身、瞄准镜、脚架和镜片错误地共用枪身材质。

    已改为没有点号的唯一材质名:

    hkg28_body hkg28_magazine hkg28_receiver hkg28_scope hkg28_bipod hkg28_lens_front hkg28_lens_rear

    重新编译后,v_hkg28.mdl和w_hkg28.mdl都确认包含 7 个材质。

  3. 镜片 Alpha 透明度需要保留。原始镜片 PNG 是 RGBA,前后镜片 Alpha 分别为 92 和 84。已使用 RGBA 源图重新生成镜片 VTF,并确认 VTF 使用带 Alpha 的格式。

3. 编译目录错误

studiomdl.exe -game不能指向这个模组的gameinfo.txt。正确做法是对 SDK 自带的 HL2MP 目录编译:

studiomdl.exe-game"H:\cfgame\Steam\steamapps\common\Source SDK Base 2013 Multiplayer\hl2mp"v_hkg28.qc

然后把生成的模型文件复制到mod_hl2mp\models\weapons。

新模型接入时必须检查

几何和坐标

  • 先确认原始模型的长轴、枪口方向和上下方向。
  • 先测量 SMD 顶点包围盒,再决定$origin,不要凭感觉连续试错。
  • 视图模型和世界模型分别确认坐标;不能直接假设两者使用同一套偏移。
  • $scale只有在确认尺寸错误时才修改;本项目要求保持1。
  • 第一人称验收标准是枪身在右下方、枪口指向准星,不以第三人称世界模型画面代替。

UV 和贴图

  • glTF、OBJ、FBX 转 SMD 时,明确检查 V 轴是否需要翻转。
  • 编译前后抽取少量 UV 或比较 VTF 解码图,确认贴图没有上下错位。
  • 原始 BaseColor 应尽量原样转换,不要把 BaseColor 当成法线或粗糙度图。
  • 法线图要使用$bumpmap,并在 VTF 中设置 Normal 标志。
  • 透明镜片必须保留 RGBA Alpha;不要用 RGB-only 转换覆盖它。
  • 重新生成 VTF 后检查尺寸、格式、Alpha 和是否被错误压成 DXT1。

材质命名

  • 不要使用mat0.001、material.002这类带点号的材质名。
  • 使用字母、数字和下划线,例如g28_scope、g28_lens_front。
  • 每个视觉部件必须拥有唯一材质名和对应 VMT。
  • 编译后从 MDL 读取材质表,确认材质数量和名称与 SMD 一致。
  • VMT 中的$basetexture、$bumpmap必须和实际 VTF 文件名逐字匹配。

VMT 参数

  • 先用简单的VertexLitGeneric + $basetexture验证贴图对应关系。
  • 确认颜色正确后,再逐项加入$bumpmap、$phong、$envmap和 rim light。
  • 不要一开始同时启用很强的$phongboost、$envmap、$rimlight,否则很难判断是贴图错还是光照过强。
  • 如果画面出现紫色,优先检查 VMT/VTF 路径和文件是否缺失。
  • 如果画面出现灰绿反光或像掉漆,检查环境贴图、法线 Alpha 遮罩和 Phong 强度。

编译和部署

  1. 修改source_qc_smd中的 QC、SMD 和材质源。
  2. 对 SDK 的hl2mp目录运行studiomdl.exe。
  3. 同时编译视图模型和世界模型。
  4. 把.mdl、.vvd、.dx90.vtx、.dx80.vtx、.sw.vtx复制到运行时模型目录;世界模型另外复制.phy。
  5. 把 VMT/VTF 复制到运行时materials目录。
  6. 重启游戏或换图,避免旧模型和旧材质仍在内存中。
  7. 进入dm_lockdown,确认右下角模型、准星朝向、颜色、镜片透明度和开火/换弹动画。

推荐的验收顺序

1. 模型可见 2. 枪口朝向正确 3. 位置在右下方 4. BaseColor 对应正确 5. 瞄准镜和镜片材质独立 6. 镜片 Alpha 正常 7. 法线和高光正常 8. 开火、换弹、切枪动画正常 9. 世界模型和物理文件正常 10. 重启后仍能正常加载

本次最终验收结果

  • 第一人称模型已在dm_lockdown中显示。
  • 枪位于屏幕右下方,枪口朝向准星。
  • UV 翻转问题已修复。
  • 模型材质已从错误的单材质恢复为 7 个独立材质。
  • 枪身颜色恢复为原始黑灰和沙色风格。
  • 瞄准镜使用独立贴图,镜片保持蓝色透明效果。
  • 未添加手臂,未改变玩法,$scale仍为1.0。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进