做时间复利图片时,我遇到过一个看起来很小、但会反复破坏画面的问题:书明明是同一本书,生成出来却一会儿出现在画面的右边,一会儿又把封面和书脊的关系弄反。尤其是在做翻转、旋转或平摊效果时,模型似乎只把书当成一个带文字的矩形,而没有把它当成一本真正存在厚度、铰链和正反面的书。
当时我先想到的也是最直观的办法:是不是再补一句提示词,告诉模型“封面在左边”?后来发现,这句话只能纠正某一张图,不能保证后续程序在读取、变换和组合素材时继续遵守同一个空间关系。问题表面上是图片位置不对,实际上是我们没有把一本书的几何身份说清楚。
一张参考图如果没有携带正反面和变换关系,生成模型看到的就不是资产,只是一块可以随意翻转的纹理。
书放错一侧,不只是构图问题
用户指出了一个很具体的判断:从书的正面看,封面应当在左侧;如果书被平摊,看到的是背面关系,不能把正面简单复制后做水平镜像。这句话的重要性在于,它没有把问题停在“看起来顺不顺眼”,而是把画面判断放回了真实物体上。
一本书只有一个正面和一个背面。正面、背面不是两张可以互换的装饰图,更不是随时可以镜像的左右版本。书脊、封面、封底和书页之间有固定的连接关系。书从闭合到打开,变化的是展开角度和可见面,不是它突然拥有了另一个对称的正面。
如果不处理这层关系,后面会出现一串连锁问题:封面可能跑到错误的一侧,书脊会和翻页方向冲突,平摊图会把封底误认为封面,视频里的开合动作也会像把纸片沿着错误的边折叠。单张图也许还能靠人工挑出来,但一旦多个程序共同读取素材,错误就会被不断复制。
这件事让我重新意识到,视觉资产也有类似产品数据的身份。它不只需要“长什么样”,还需要“从哪个方向看”“可以怎样变换”“哪些变换会破坏它”。没有这些信息,越自动化,错误传播得越快。
先把一本书拆成几个状态
我会先把书拆成至少4种状态:闭合正面、闭合背面、平摊状态,以及用于视频或合成的视角信息。闭合正面负责确认书名、封面和书脊位置;闭合背面负责确认封底、背面文字和另一侧的结构;平摊状态负责说明书打开后两面如何相连;视角信息则说明当前画面是从哪一侧观察。
这里的“平摊”不能只理解为把两张封面并排放置。真实的书打开后,左右两页共享同一条书脊边界,封面与封底的朝向也由铰链关系决定。平摊时如果看到的是外侧,就应该保留背面关系;如果看到的是内侧,则需要明确那是打开后的内页视图。两种状态不能用一张模糊的“打开的书”混在一起代表。
我会给每个状态加上机器可读的元数据:它是正面、背面还是平摊;观察方向是什么;书脊位于哪一侧;当前画面显示的是内侧还是外侧;它允许绕哪条轴旋转。这样,后续技能读取的就不是“某张看起来像书的图片”,而是“正面版本”“背面版本”或“外侧平摊版本”。
先定义状态,再允许变换;如果状态没有定义清楚,任何旋转按钮都可能只是把错误放大。
旋转可以有,镜像要谨慎
最容易误判的地方,是把旋转和镜像当成同一种操作。旋转是在三维空间中改变物体的朝向;镜像则会改变左右手性。一本书绕竖直轴转过去,仍然是同一本书,只是从另一侧看到它;把图片水平镜像,书脊和文字的左右关系却会被反转,现实中的物体并不会因为摄影机换了位置就发生这种变化。
因此,我会把允许的变换和禁止的变换分开写进资产契约。允许的变换包括在明确坐标系内的旋转、按比例缩放、裁切和保持透视的平移;禁止的变换包括未经声明的水平镜像、把正面图当成背面图、把平摊图折回成闭合图,以及只凭文件名猜测书的状态。若某个特殊镜像确实需要使用,也必须标记为“视觉镜像版本”,不能覆盖原始正面或背面。
我选择这样做,是因为生成链路通常不止一个环节。一个程序可能只负责选图,另一个程序负责合成,还有一个程序负责生成视频。如果只在提示词里说“不要镜像”,约束会随着环节切换而变弱;如果把禁止动作写进元数据和读取校验,错误就能在进入下一步前被拦住。
给后续程序一份参考图契约
这份契约不需要很复杂,但必须能回答几个问题。第一,资产的唯一身份是什么,当前版本是否为可用版本。第二,它属于哪个状态,正面、背面还是平摊。第三,书脊在哪一侧,观察方向是什么。第四,它可以接受哪些变换,不能接受哪些变换。第五,生成结果应该检查什么,比如封面文字是否仍然可读、书脊是否保持同一侧、平摊后两面是否沿同一条边连接。
我会把这些内容放进一个固定结构,而不是散落在说明文字中。读取程序先按资产身份找到候选版本,再按状态筛选参考图;如果请求“正面视角”,就不能返回平摊背面图凑数;如果请求“翻转”,就必须先确认这是三维旋转还是二维镜像。缺少状态、方向或版本标记时,程序应当停止并报告缺项,而不是自作主张选一张最接近的图片。
这相当于给模型一张小型地图。图片本身提供外观,契约提供边界。模型仍然可能生成不理想的结果,但它至少不会在输入阶段就把正面、背面和平摊状态混为一谈。真正可靠的参考图系统,不是给模型更多图片,而是让每张图片都带着不可混淆的身份。
生成之后还要做方向验收
有了契约,也不能把生成结果直接当成正确结果。视觉模型可能读到了正面参考图,却仍然把文字倒置,或者把封底的颜色和封面拼在一起。这里需要一条轻量的方向检查:先看书脊位置,再看封面和封底的身份,最后看翻页或开合方向是否符合铰链关系。
例如,闭合正面从正面观察时,封面与书脊的位置必须和参考图一致;闭合背面不能因为颜色相近就被判成正面;外侧平摊图必须保留背面关系,不能用水平镜像替代;视频中如果书从闭合转为打开,运动应围绕正确的书脊边展开,而不是从另一侧凭空掀起。
我会把方向检查分成自动检查和人工抽样。自动检查负责发现元数据缺失、错误变换、版本不匹配和明显的左右关系冲突;人工抽样负责判断透视、遮挡和书页厚度这些规则不容易完全描述的部分。这样做的理由很简单:自动检查适合守住底线,人工检查适合发现“数学上没报错、看起来却不像书”的问题。
如果不做这一步,错误会在视频阶段才暴露。那时已经叠加了镜头运动、字幕和时间线,返工成本远高于在参考图阶段拒绝一张不合格素材。一个流程成熟的标志,不是它能生成一次,而是它能在错误还便宜的时候把错误挡住。
下次我会怎么做
下次再遇到会被翻转、旋转或平摊的实体资产,我会先问它在现实中有哪些固定关系,再决定需要上传哪些参考图。对于一本书,至少提供闭合正面和闭合背面;如果要表现打开状态,再提供明确标注内侧或外侧的平摊图。视角不同但状态相同的图,可以作为补充参考,不能互相替代。
接着,我会为资产建立唯一身份和版本标记,把正面、背面、平摊、观察方向、书脊位置、允许变换和禁止变换写进机器可读的契约。任何后续程序读取素材时,先按身份和状态取图,再执行变换;遇到缺标记或不允许的镜像,直接拒绝继续。
最后,我会用一个小样本做方向验收,检查封面位置、书脊关系、平摊连接和翻转轨迹。这样做并不是把创作变成僵硬的工程,而是承认真实物体本来就有规则。我们给模型的不是“请画得像一本书”的愿望,而是一组能让它少猜、让程序能拦错、让结果经得起复看的事实。
这件事表面上是在处理一本书,实际上是在处理所有带方向、带连接和带时间变化的视觉资产。只要一个物体有正反面、有铰链、有固定朝向,就不应该把它交给随意镜像来解决。把判断写下来,下一次系统才有机会记住;把约束写进读取和验收,正确格式才不会只依赖某个人当时有没有想起来。