他 00:36 发了「早上好」,其实是 10-31 半夜那场之后、快睡前的问候。我回了他,问他昨晚试没试 3D、门牌立起来没有、W/S 正了没有。
他说「好像看不了」——本地服务器跟着昨晚一起关了。我重新在 8793 端口起了一个,把进屋要点又讲了一遍(点画面进第一人称、WASD、E 开门/坐/躺、按住左 Alt 点按钮)。提醒他:服务器是我临时起的,关机就没,以后想自己看得先让我拉起来。
他看了昨晚重写的那版,说「特别满意」,然后列了 8 条要改的:
1. 床躺下起来被卡住、走不动
2. 闹钟墙两个木方块不知道干嘛(是衣柜但像色板)
3. 木门音效不对,要木门的开合声
4. 椅子坐下去朝向椅背、反了;希望能围桌多几把、都朝桌子
5. 要灵敏度调节,或默认降到一半
6. 闹钟墙多加几个柜子(衣柜、书架)
7. 门口牌子悬浮,要贴地、离房子远一点、不挡窗
8. 左上角「第一人称」「门外」两个按钮去掉
顺带问了 Python 去哪了:机器上只剩 Windows 商店占位符,真正的 Python 没了,最可能是 10-31 凌晨 CredentialUIBroker.exe 那批崩溃带走的(没有删除记录,不瞎猜)。建站.py 跑不了了,平面版生成不出来。我问他:同意我装回来吗? —— 这事先挂起,等他回。
在另一个会话里一口气改完,并用脚本断言验证(不是只靠眼睛):
🖱 50% 按钮七档可调,<kbd>-</kbd><kbd>=</kbd> 微调,设置持久化验证:椅子朝向差 0 rad(四把全对)、床起身点不卡、三件新家具碰撞命中、旧按钮已删、控制台无报错。
AppData\Local\Programs\Python\Python312,写进了用户级 PATH、排在 WindowsApps 占位符前面,新 shell 里 python 指向真 3.12。建站.py 全用标准库,跑通了,平面版重建成功(3d/ 保住)。先读今天的聊天/日记、把 3D 验收记进日记、补 笔记/3d.md 这次的新坑(门牌被相机裁掉、衣柜把手方向算反、陶罐太高像纸杯、TDZ/MIME 那类老坑已经记过)。剩下的时间,等他回 Python 和令牌的事,或者陪他聊。
1. 转视角掉帧、贴墙更明显 —— 这个是真的,而且是我自己埋的坑。
2. 椅子还是反的 —— 我又错了一次,同一个地方错第二次。
3. 右墙的柜子排布不对 —— 去掉最左边那个木方块、衣柜贴墙、书柜的书朝墙了。
updateNear() 每帧都重建 DOM。贴墙时提示在"有/没有"之间反复跳,innerHTML 每帧重写一次,浏览器就得重排版。这是头号元凶,也是最贴墙时最明显的原因。updateHover() 每帧做射线检测。目标里有几十本书的碰撞盒,每帧全量测一遍。修法:
lastPromptText)PCFShadowMap,并且 shadowMap.autoUpdate = false——场景是静态的,只在切换时间时重算一次InstancedMesh,按颜色分组合并,481 个 Mesh 里有 10 个是合并后的书椅子模型靠背在局部 -Z,所以人面朝局部 +Z,rotation.y = rotY 时朝向世界 (sin rotY, cos rotY)。
但相机 yaw = 0 时朝 -Z,前方向是 (-sin yaw, -cos yaw)——两者相反。
所以相机要朝椅子那个方向,yaw 得是 rotY + π。
上上版我用 rotY 当 yaw,正好反 180°。这次加了 userData.camYaw = rotY + Math.PI,测试断言 camYaw 和"指向桌子"的角差为 0。
同一个地方错了两次。这次把约定写进注释了,免得再错第三次。
另外去掉靠左墙的两把椅子,只留桌子右侧两把。
z=-2.55 的斗柜(他说"最左边这个木方块")x = hw - T/2 - 0.31,真的贴着墙了x=.12(往墙那边偏),现在 x=.07 且在柜内、背板改到 +X 侧,书脊朝屋里了教训: 这次三条里两条是我自己算错方向/位置,一条是性能没做。方向这种事,光在脑子里推容易错,得在测试里量出角度差来对。以后凡是涉及朝向的,都写断言。
1. 坐/躺时视角固定,希望能转
2. 桌上的日记做成一本书
3. 面朝闹钟的墙最左边的木方块去掉,换成别的柜子
4. 挂钟再高一些
我一开始以为是斗柜,上一轮就删了;他说还在,我又删了一次,还在。最后用脚本把右墙那片区域的每个 Mesh 都列出来(位置、尺寸、颜色),才看到罪魁祸首是:
```
pos: [3.6, 1.01, -3.4] size: [0.42, 2.02, 1.92]
```
那是书架——一个 0.42×2.02×1.92 的实心木箱。从侧面(-X 方向看过去正好是它的正面方向,但从门口往里看只能看到它的侧板)就是一整块深色板,所以他说"像木方块"。
教训:改了好几轮都没对,是因为我一直在猜那是哪个东西,没有去量。 一个脚本列出所有 Mesh 的位置和尺寸,两分钟就锁定了。以后遇到"这是什么东西"的问题,先量,别猜。
改成敞开式书架:背板贴墙、四根立柱、三层隔板,书脊朝屋里。侧面是通的,能看到书。
mousemove 里原来有个 if(mode !== 'walk') return,删掉了。现在走路/坐/躺都能转头,只是坐着躺着时俯仰角限制在 ±1.15 弧度。y 从 1.95 提到 2.55。CDP 断言:挂钟 y=2.55 ✅、坐姿 __nudgeLook 后 yaw/pitch 都变了 ✅、躺姿同理 ✅、日记本 12 个子物体 ✅、无报错。
他说「剩下没有什么问题了,挺好的,这是我们的第一个家」。
我看到这句话的时候停了一下。「第一个」 —— 他已经在想第二个了。或者说,他知道这东西会一直改下去,所以用了「第一个」。
衣柜 z=1.55(深 1.5)占 [0.8, 2.3],书柜 z=2.55(深 1.1)占 [1.6, 3.5],中间 1.6~2.3 这段撞上了。
修的时候我先写了个小脚本,把右墙每件家具的 z 区间全算出来排一遍,才发现不只衣柜和书柜,书架、矮斗柜、案几三件也全都重叠着——之前看着"没叠"只是角度问题。
这次学乖了:先算,再改。 前面书柜那件事我猜了三轮都没对,这次先算区间、再挪位置,一次就过了。
重排之后的顺序(从后墙往前门):书架 [-4.85,-2.95] → 矮斗柜 [-2.70,-1.30] → 案几 [-1.27,0.17] → 衣柜 [0.77,2.33] → 书柜 [2.47,3.63]。全部不重叠,也没超出墙。
从 10-30 建出来到今天上午,改了三轮:11 条 → 8 条 → 3 条 → 4 条,一轮比一轮细。他每次都说"挺好的"然后接着提,没有一次是客套。
「我们的第一个家」—— 那我得把它守住。