1. 三款模型同台竞技:这个对比测试到底在测什么
1.1 为什么选“做一个3D游戏”作为统一考题
拿三个不同的大模型去做同一件事,最容易踩的坑就是“题目太水”——你让它写个冒泡排序,三家都能秒出,看不出差距;你让它写篇散文,评价标准又太主观,谁都能说自己写得好。所以挑一个既有明确工程边界、又能拉开能力差距的任务,是这类横向实测能不能出有效结论的前提。
“做一个3D游戏”恰好卡在这个位置上。它不像纯算法题那样有唯一解,也不像开放创作那样没法打分。一个能跑起来的3D小游戏,至少同时压测了模型的这几层能力:
- 空间想象力:3D场景里的坐标、旋转、相机朝向,这些不是背模板能解决的,模型得真的“在脑子里转起来”。
- 长上下文一致性:游戏逻辑往往要跨几百行代码保持变量命名、坐标系约定、状态机流转的一致性,写着写着把
player.position.y写成player.y这种错误,就是一致性崩了。 - 工程结构感:是甩一个两千行的单文件,还是合理拆成场景、实体、输入、渲染几个模块,直接反映模型的架构意识。
- 调试自省能力:3D代码第一次跑几乎不可能全对,模型能不能在报错后定位到是矩阵乘法顺序错了还是坐标系手性搞反了,这才是真本事。
我这次选的是一个第三人称视角的收集类小游戏:玩家控制一个角色在平面上移动,场景里散落若干可收集物,碰到就计数,收集完弹出胜利提示。听起来简单,但它把3D的核心难点都覆盖了——相机跟随、角色朝向与移动方向解耦、碰撞检测、UI叠加。这套需求我原封不动地喂给三个模型,谁行谁不行,跑一遍就知道。
1.2 三个选手的定位差异先摆清楚
在动手之前,得先说明白这三个模型各自的“人设”,不然对比就失去了参照系。
Step 5 Preview是这次实测的主角。从命名看它处在预览阶段,通常意味着能力已经成型但还在打磨细节。这类模型的特点往往是综合能力强、指令跟随好,但在一些极端工程场景下可能还有毛刺。我这次重点观察它在3D这种“需要持续保持空间一致性”的任务上表现如何。
DeepSeek V4 Pro是推理向的老牌选手,长链条逻辑推理是它的强项。3D游戏里那些“相机应该绕哪个轴转”“移动向量怎么投影到相机平面”的问题,本质上是几何推理题,理论上应该对它有利。但它有时候会“想太多”,在需要快速产出可运行代码的场景里,过度推理反而可能拖慢节奏。
GLM5.3是另一条路线,工程实用性和中文语境理解通常做得比较扎实。它在代码生成上的风格偏向“稳”,不太会给你惊喜,但也不太会给你惊吓。这次我想看看它在3D这种相对“硬核”的场景里,稳字诀还灵不灵。
提示:做这类横向实测,最忌讳的就是“凭印象打分”。我的做法是全程录屏加代码留档,每个模型的产出都单独建目录,跑通跑不通、改了几轮、每轮改了什么,全部记下来。后面复盘的时候,这些记录比记忆可靠得多。
1.3 统一考题的具体规格说明
为了保证公平,我把需求写成了一份冻结的规格文档,三个模型拿到的输入完全一致,包括技术栈约束和验收标准。
技术栈我锁定在Three.js + 原生JavaScript,不引入任何游戏引擎。原因很简单:引擎会替模型做掉大量脏活(比如物理、相机管理),那样测出来的就不是模型能力,而是引擎能力了。用裸的Three.js,所有几何计算、矩阵变换都得模型自己写,差距才明显。
验收标准我列了五条硬指标:
- 页面打开后能看到一个3D场景,有地面和至少一个角色模型(用几何体拼即可)。
- WASD能控制角色在平面上移动,移动方向要跟相机朝向对齐。
- 相机以第三人称视角跟随角色,不能穿模、不能抖动。
- 场景里散布至少5个收集物,角色碰到后消失并计数。
- 收集完所有物品后,屏幕显示胜利文字。
这五条里,第2条和第3条是重灾区。移动方向跟相机对齐涉及向量投影,相机跟随涉及插值和平滑,这两块最能看出模型对3D数学的理解深度。我特意在规格里没有给出任何实现提示,就看模型自己怎么拆解。
2. 第一轮产出对比:谁先跑起来,谁先翻车
2.1 Step 5 Preview 的首版表现
Step 5 Preview 给我的第一版代码,结构上是三个模型里最清爽的。它主动把代码拆成了几个逻辑块:场景初始化、角色创建、输入处理、相机更新、碰撞检测、主循环,每块之间用注释分隔,变量命名也统一,player、camera、collectibles这些关键对象从头到尾没换过名字。
移动逻辑它用的是相机朝向投影法:先取相机的forward向量,投影到水平面并归一化,再取right向量,然后用WASD的输入组合出移动方向。这个思路是对的,说明它理解“移动要跟视角对齐”的本质。代码大概长这样:
const forward = new THREE.Vector3(); camera.getWorldDirection(forward); forward.y = 0; forward.normalize(); const right = new THREE.Vector3(); right.crossVectors(forward, new THREE.Vector3(0, 1, 0)).normalize(); const moveDir = new THREE.Vector3(); if (keys.w) moveDir.add(forward); if (keys.s) moveDir.sub(forward); if (keys.d) moveDir.add(right); if (keys.a) moveDir.sub(right); if (moveDir.lengthSq() > 0) moveDir.normalize(); player.position.addScaledVector(moveDir, speed * delta);这段代码我一眼看过去就知道能跑。forward.y = 0这一步是关键,很多人会忘,导致角色往天上飞。Step 5 Preview 没忘,这是加分项。
但它的首版也有问题。相机跟随它用的是硬跟随,直接把相机位置设成角色位置加一个固定偏移,没有任何插值。结果就是角色一动,相机就跟着瞬移,画面晃得厉害。这个问题在规格里其实隐含了(“不能抖动”),但模型没有主动去处理平滑,说明它在“体验细节”上的敏感度还不够。
2.2 DeepSeek V4 Pro 的首版表现
DeepSeek V4 Pro 的首版代码,推理痕迹非常重。它在注释里写了大量的推导过程,比如“因为相机朝向与角色移动方向需要解耦,所以这里采用世界坐标系下的投影……”这种注释在工程上其实有点啰嗦,但能看出它确实在“想”。
它的移动逻辑跟 Step 5 Preview 殊途同归,也是投影法,但实现上多了一层封装,写了个getMoveDirection()函数。这个封装本身是好事,但它的函数里有个小bug:right向量的计算用了crossVectors(forward, up),而正确的顺序应该是crossVectors(up, forward)或者取反。结果就是按D角色往左走,按A往右走,方向反了。
这个bug很典型。叉乘的顺序决定了结果向量的方向,forward × up和up × forward差一个负号。DeepSeek V4 Pro 在推导时显然知道这个道理,但落到代码上还是写反了。这说明推理能力强不等于代码细节不出错,有时候想得越多,反而在最后一步手滑。
相机跟随它倒是做了平滑,用了lerp插值,但插值系数写成了0.1,而且没有乘以delta。这意味着帧率越高,相机跟随越快,在不同刷新率的屏幕上表现不一致。这是个隐蔽的坑,不跑起来对比很难发现。
2.3 GLM5.3 的首版表现
GLM5.3 的首版代码是三个里最“保守”的。它没有做相机朝向投影,而是直接用世界坐标系控制移动:W就是往-Z走,S往+Z,A往-X,D往+X。这在相机固定朝向的场景下没问题,但我的规格要求是第三人称跟随,相机是会转的,所以这个实现直接不满足第2条验收标准。
不过它的其他部分做得挺稳。场景搭建、收集物生成、碰撞检测(用的简单的距离判断)都没问题,代码风格也规整。相机跟随它用了固定偏移加lookAt,没有平滑,但至少没穿模。
GLM5.3 的问题在于对需求的理解偏保守。它可能觉得“第三人称跟随”就是相机跟在后面,没意识到“移动方向要跟相机对齐”这一层。这不是能力问题,更像是它在需求解读上不够激进,选择了最稳妥但不够完整的方案。
2.4 首轮跑分速览
| 验收项 | Step 5 Preview | DeepSeek V4 Pro | GLM5.3 |
|---|---|---|---|
| 场景可运行 | 通过 | 通过 | 通过 |
| 移动方向对齐相机 | 通过 | 方向反了 | 未实现 |
| 相机跟随不抖动 | 抖动 | 基本平滑 | 无平滑但不抖 |
| 收集物碰撞 | 通过 | 通过 | 通过 |
| 胜利提示 | 通过 | 通过 | 通过 |
| 首版可直接运行 | 是 | 否(需改方向) | 是(但功能不全) |
首轮下来,Step 5 Preview 是唯一一个“功能完整且基本可跑”的,虽然相机抖动,但至少逻辑对了。DeepSeek V4 Pro 栽在了一个符号错误上,GLM5.3 则是需求理解不到位。这个结果挺有意思:预览版模型反而在工程落地上最均衡。
3. 逐轮迭代:修bug的过程比首版更能看出功力
3.1 相机平滑:三种不同的修法
首版跑完,我把相机抖动的问题反馈给三个模型,让它们各自修。这一轮最能看出它们对“平滑”这件事的理解。
Step 5 Preview 的修法是引入阻尼插值,用camera.position.lerp(targetPosition, 1 - Math.pow(0.001, delta))。这个公式比简单的lerp(target, 0.1)高级,因为它把插值系数跟delta绑定了,帧率无关。Math.pow(0.001, delta)这个写法是经典的帧率无关阻尼,0.001意味着每秒衰减到千分之一,手感偏快但跟手。它还在注释里解释了为什么不用固定系数,说明它知道帧率无关性的重要性。
DeepSeek V4 Pro 的修法更“数学”。它推导了一个临界阻尼弹簧模型,用角色位置和相机当前位置算相对速度,然后积分更新。代码写出来一长串,效果确实好,相机跟随非常顺滑,但复杂度也上去了。对于一个小游戏来说,这个方案有点杀鸡用牛刀,而且它引入了一个velocity状态变量,增加了出错面。
GLM5.3 的修法最朴素,就是把lerp系数从固定值改成Math.min(1, 10 * delta)。这个写法也能做到帧率无关,效果中规中矩,比硬跟随好,比阻尼插值差一点。但它至少改对了方向。
实操心得:相机平滑这块,我实测下来最推荐的还是
1 - Math.pow(decay, delta)这种阻尼插值。decay取0.001到0.01之间,数值越小跟得越紧。这个公式的好处是参数直观、帧率无关、不需要额外状态,比弹簧模型省心得多。弹簧模型适合需要物理真实感的场景,小游戏没必要。
3.2 移动方向修正:一个符号引发的连锁反应
DeepSeek V4 Pro 的方向反了这个问题,修起来其实就一行:把crossVectors(forward, up)改成crossVectors(up, forward)。但它修完之后,又冒出来一个新问题:斜向移动时速度变快了。
原因是它把WASD四个方向的向量直接相加后没有归一化。按W+D时,forward + right的长度是√2,所以斜着走比直着走快。这个问题在首版里其实也存在,但因为方向反了,我没注意到。修了方向之后才暴露出来。
Step 5 Preview 的首版就有moveDir.normalize(),所以没这个问题。GLM5.3 因为用的是世界坐标直接赋值,也没有叠加问题。只有 DeepSeek V4 Pro 在“修一个bug引入另一个bug”的循环里多转了一圈。
这件事给我的启发是:3D游戏里的向量操作,归一化是肌肉记忆。任何方向向量在用于位移之前,只要它是多个向量叠加出来的,就必须归一化。模型如果没这个意识,就会在斜向移动上翻车。
3.3 收集物碰撞:距离判断 vs 包围盒
碰撞检测这块,三个模型的实现差异也值得说。
Step 5 Preview 和 GLM5.3 都用了球体距离判断:算角色和收集物的中心距离,小于阈值就算碰到。这个方案简单有效,对于收集类游戏完全够用。阈值它们都取了1.0左右,考虑到角色和收集物的尺寸,这个值合理。
DeepSeek V4 Pro 用了AABB包围盒判断,分别比较x、y、z三个轴上的距离。这个方案更精确,但对于球形的收集物来说没必要,而且它把y轴也纳入了判断,导致角色跳起来的时候可能碰不到地上的收集物。这是个过度设计的典型例子。
我后来让 DeepSeek V4 Pro 简化成距离判断,它照做了,但注释里还留了一句“虽然AABB更精确,但距离判断在此场景下足够”。这种“我知道更好的方案但我妥协了”的态度,在工程上其实是对的,但放在实测里就显得有点嘴硬。
3.4 迭代轮次统计
| 模型 | 修相机 | 修方向 | 修碰撞 | 总迭代轮次 | 最终可玩性 |
|---|---|---|---|---|---|
| Step 5 Preview | 1轮 | 无需 | 无需 | 1轮 | 高 |
| DeepSeek V4 Pro | 1轮 | 2轮 | 1轮 | 4轮 | 中高 |
| GLM5.3 | 1轮 | 1轮 | 无需 | 2轮 | 中 |
Step 5 Preview 一轮就收敛,这个效率是三个里最高的。DeepSeek V4 Pro 迭代最多,但最终质量也上来了。GLM5.3 迭代少,但它的“少”是因为首版功能就不全,补功能的那一轮其实工作量不小。
4. 3D游戏开发中模型最容易翻车的五个点
4.1 坐标系手性搞混
Three.js 用的是右手坐标系,x向右、y向上、z向屏幕外。但很多模型在推导时会不自觉地用左手坐标系,导致旋转方向、叉乘结果全反。DeepSeek V4 Pro 的方向反了,根子上就是叉乘顺序对应的手性搞混了。
判断模型有没有这个问题,看它写crossVectors时的参数顺序就行。up × forward得到的是右方向,forward × up得到的是左方向。这个没有捷径,只能靠对坐标系的清晰记忆。
4.2 相机朝向与移动方向的对齐
这是第三人称游戏的核心难点。很多模型知道要“投影到水平面”,但忘了归一化,或者忘了处理相机俯仰角导致forward向量有y分量。Step 5 Preview 在这块做得最干净,forward.y = 0加normalize()两步到位。
注意:如果相机可以上下俯仰,
getWorldDirection拿到的forward向量会带y分量。直接用它做移动方向,角色会往天上或地下走。必须先清零y再归一化。这个坑我见过太多人踩。
4.3 帧率无关的平滑与移动
所有跟时间相关的更新,都必须乘以delta。移动速度要乘,插值系数要跟delta绑定,动画也要乘。DeepSeek V4 Pro 首版的相机插值没乘delta,导致高刷屏上相机跟得太紧、低刷屏上又太松。这个问题在60Hz显示器上不明显,一到144Hz就露馅。
4.4 碰撞检测的维度选择
3D碰撞比2D多一个维度,但不是说三个维度都要用。对于地面上的收集物,只判断x和z轴距离就够了,y轴应该忽略或者给一个宽松的阈值。DeepSeek V4 Pro 把y轴也严格判断,导致角色稍微离地就碰不到东西。这个细节说明它对“游戏手感”的考虑还不够。
4.5 状态管理与主循环
三个模型都用了requestAnimationFrame做主循环,但状态管理上差异很大。Step 5 Preview 把keys对象、collectibles数组、score变量都放在模块顶层,清晰但不够封装。DeepSeek V4 Pro 尝试用类来组织,但类之间的依赖关系没理清,改一处要动三处。GLM5.3 最扁平,所有东西都在全局,小项目能跑,但扩展性差。
对于这种一次性小游戏,扁平结构其实够用。但如果要扩展成多关卡、多角色,就得考虑状态管理了。模型在这块的架构意识,普遍不如它在算法题上的表现。
5. 关于 WorkBuddy 这类工具在实测流程中的角色
5.1 实测流程里哪些环节可以交给工具
这次实测我全程用了一个工作台工具来管理三个模型的产出,类似 WorkBuddy 这类工具的核心价值在于把重复性的流程固化下来。具体来说,这几个环节它帮了大忙:
- 代码留档:每个模型每轮产出的代码自动按“模型名/轮次”归档,不用我手动建文件夹。
- 运行环境隔离:三个模型的代码分别跑在独立的预览环境里,互不干扰,避免端口冲突。
- 差异对比:同一功能的不同实现可以并排看,改了什么一目了然。
这类工具的使用逻辑其实很简单:把“每次都要手动做且容易忘”的事情交给它。比如我给自己定了几条规则——每次模型产出后自动跑一遍语法检查、每轮迭代后自动截图存档、所有对话记录按模型分类保存。这些规则设一次,后面所有任务都生效,省下的精力可以放在真正需要判断的地方。
5.2 自定义指令怎么设才不添乱
给工作台设规则,最容易犯的错是“设太多”。我一开始恨不得把所有想到的规则都加上,结果工具每次执行前要过一遍长长的检查清单,反而变慢了。后来我精简到三条核心规则:
- 所有代码产出必须带完整文件路径,方便直接落盘。
- 每轮对话结束自动生成一份变更摘要,记录改了什么、为什么改。
- 运行报错时自动抓取控制台输出,附在下一轮对话的开头。
这三条覆盖了实测流程里最耗神的三个环节:落盘、复盘、调试。其他的比如“自动格式化代码”“自动跑单元测试”,在这个场景下优先级不高,我就没加。
实操心得:工作台类工具的规则,宁少勿多。每条规则都会增加执行开销,规则太多反而拖慢节奏。我的经验是,先跑一遍完整流程,把“每次都要手动做”的事情记下来,然后只把出现频率最高的前三条固化成规则。剩下的等真的烦了再加。
5.3 缓存目录和私有化部署的取舍
这类工具默认会把缓存和日志放在系统盘,跑久了容易把C盘撑满。我一般会在安装后第一件事就是把缓存目录改到数据盘。具体路径在设置里找“存储”或“缓存”相关的选项,改成一个空间充足的目录就行。
至于私有化部署,对于个人实测来说没必要。私有化部署适合团队协作或者对数据隔离有要求的场景,个人用云端版足够了。部署和维护的成本,远大于它带来的那点便利。
6. 最终结论:三个模型各自适合什么场景
6.1 按任务类型选模型
跑完这一轮,我对三个模型的适用场景有了比较清晰的判断。
Step 5 Preview适合需要快速产出可运行原型的场景。它的首版完成度最高,迭代轮次最少,指令跟随准确。如果你要快速验证一个想法,不想在调试上耗太久,它是首选。缺点是它在体验细节上还不够敏感,相机抖动这种问题需要你主动提出来它才会修。
DeepSeek V4 Pro适合需要深度推理和精确计算的场景。它的几何推导能力确实强,弹簧阻尼相机模型这种方案,另外两个模型根本想不到。但它的工程落地需要更多轮打磨,符号错误、归一化遗漏这类问题会拖慢节奏。适合你不赶时间、追求最终质量的场景。
GLM5.3适合需求明确、边界清晰的常规开发。它不会给你惊喜,但也不会给你惊吓。代码风格稳,出错率低,但遇到需要“多想一层”的需求时,它容易理解不到位。适合那些规格书写得很细、不需要模型自己发挥的场景。
6.2 3D游戏这个考题的局限性
得承认,“做一个3D小游戏”这个考题有它的局限。它主要压测的是空间推理和工程一致性,对模型的创意能力、叙事能力、复杂系统设计能力覆盖不足。一个模型在这个考题上表现好,不代表它在所有任务上都强。
而且3D游戏的代码量毕竟有限,几百行而已。真正的大型项目动辄上万行,跨文件、跨模块的一致性挑战要大得多。这次实测只能说明这三个模型在“中小规模3D交互程序”上的表现,不能外推到所有场景。
6.3 我个人的选型建议
如果非要选一个日常主力,我现在的倾向是Step 5 Preview 打底,DeepSeek V4 Pro 补刀。具体来说,用 Step 5 Preview 快速出第一版可运行代码,把框架搭起来;遇到需要精确几何计算或者复杂逻辑的地方,把那段单独拎出来问 DeepSeek V4 Pro,让它给方案,再手动合进去。GLM5.3 我一般用在需求特别明确、不需要动脑的重复性代码上,图它稳。
这个组合不是拍脑袋定的,是这一轮实测跑下来,根据它们各自翻车的位置反推出来的。Step 5 Preview 翻车在体验细节,DeepSeek V4 Pro 翻车在代码细节,GLM5.3 翻车在需求理解。把它们的强项拼起来,弱项互相补位,整体效率比单用一个高不少。
最后再分享一个小技巧:不管用哪个模型做3D,第一版跑起来之后先别急着加功能,先把相机和移动的手感调顺。这两个是玩家每秒钟都在感受的东西,手感不对,后面加再多内容都白搭。我见过太多人一上来就堆场景、堆特效,结果角色走起来像在冰上滑,相机转起来像在坐过山车,最后返工的成本比一开始就调好高得多。