# 陶舍人物模型来源

店主和顾客采用 Kay Lousberg 制作的 KayKit 短头身人物，外部素材仅用于人物。店面、家具、植物、小猫和制陶物件仍由本项目代码制作。

## 作者与许可

- 人物：KayKit Adventurers 2.0，免费版。官方页面：https://kaylousberg.itch.io/kaykit-adventurers
- 动作：KayKit Character Animations 1.1，免费版。官方页面：https://kaylousberg.itch.io/kaykit-character-animations
- 作者官网：https://kaylousberg.com/game-assets/characters-adventurers
- 许可：CC0 1.0，允许个人和商业使用；署名非强制。本项目保留作者归属。
- 人物包原始许可：`kaykit/License.txt`；动画包原始许可：`kaykit/License-Animations.txt`。

2026-09-05 通过作者 itch.io 页面提供的 “No thanks, just take me to the downloads” 免费入口下载 `KayKit_Adventurers_2.0_FREE.zip` 与 `KayKit_Character_Animations_1.1.zip`。未付款、登录或绕过访问限制，未使用 EXTRA/SOURCE 层内容。作者页面和原始许可均明确 CC0。

## 游戏中使用的角色

| 游戏 ID | 作者原型 | 衣色 |
|---|---|---|
| owner | Mage，移除尖顶帽 | 奶油 |
| florist | Rogue | 鼠尾草 |
| cafe | Ranger，移除箭筒 | 雾蓝 |
| collector | Mage，移除尖顶帽 | 粉陶 |
| student | Rogue | 蜂蜜 |

保持原始大头短身比例，以独立父节点等比缩放至 Idle 姿态身高 1.80、脚底 y=0，正面朝 +Z。没有拉长腿或压缩人物网格。游戏不加载武器、铠甲、兽人等其他角色和附件。

衣色由运行时材质着色器调整，保留作者内嵌渐变贴图及服装细节。头部材质单独保留原色，皮肤、眼睛与头发不参与衣色替换。

三份 GLB 共 **1,781,660 字节**（约 1.70 MiB），五名角色按实例调色。全部纹理内嵌，不需要外链 PNG、Draco、Meshopt 或网络解码器。原文件与成品 SHA-256 见 `kaykit/model-info.json`。

## 动画处理

使用作者兼容的 `Rig_Medium` 骨架，将官方动作按同名骨骼合入人物 GLB，只保留六个用于经营的动作，没有使用动画包中的战斗、死亡动作或示例人偶网格：

| 游戏动作 | 作者动作 | 来源组 |
|---|---|---|
| Idle | Idle_A | General |
| Idle_Neutral | Idle_B | General |
| Interact | Interact | General |
| Walk | Walking_A | MovementBasic |
| Run | Running_A | MovementBasic |
| Wave | Waving | Simulation |

这里的 Idle_Neutral 为接口兼容名称，实际是作者第二种自然站姿，不是静止 T-Pose。原始骨骼、蒙皮、网格及动作数据保留；移除 Ranger_Quiver、Mage_Hat 的场景网格引用。无需运行时重定向骨骼。

## 加载器接口

`loadCharacters()` 异步加载本地模型并缓存，返回 `{ ids, create(id), portraits }`；另导出 `CHARACTER_IDS`。

`create(id)` 返回独立 THREE.Group，拥有独立骨骼、AnimationMixer、几何与材质。`userData` 包含 `mixer`、`actions`、`activeAnimation`、`model`、`normalization`、`height`、`carry`。尺寸父节点不属于 mixer 的根，人物行走位置由店铺控制。`carry` 位于 `(0, 0.86, 0.36)`，用于挂载成交陶器。

`setCharacterAnimation(group, name)` 以 0.2 秒交叉淡入切换；Interact / Wave 播放一次后回到 Idle。`tickCharacter(group, dt)` 接收秒单位帧间隔。

`await renderCharacterPortraits(library)` 使用独立临时 WebGLRenderer，将相同五名角色渲染为 256×320 透明 PNG 头像，返回 `{owner, florist, cafe, collector, student}` data URL 字典。只生成一次并缓存；完成后释放临时渲染器。`getPortrait(id)` 或 `library.portraits[id]` 可同步读取缓存，不改变游戏主渲染器。

## 依赖与预览

GLTFLoader、SkeletonUtils、BufferGeometryUtils 来自 Three.js r170 官方源码，全部改成本地导入；MIT 许可保存在 `vendor/THREE-LICENSE.txt`。三个加载依赖共 150,872 字节，连同人物 GLB 共 1,932,532 字节，不含已有 Three.js 主模块。

- https://github.com/mrdoob/three.js/blob/r170/examples/jsm/loaders/GLTFLoader.js
- https://github.com/mrdoob/three.js/blob/r170/examples/jsm/utils/SkeletonUtils.js
- https://github.com/mrdoob/three.js/blob/r170/examples/jsm/utils/BufferGeometryUtils.js

`models.html` 从 `ShopWorld.modelCatalog()` 取得家具、建筑、植物、制陶工具和陶器实际模型，从本加载器取得五名角色。预览只读当前作品、库存和收藏，支持逐项查看与动画控制，不写游戏存档。

此前的成人比例 Quaternius 人物已从运行素材目录移除。没有将任何 NoAI 素材用于图像生成；头像为游戏 3D 模型的正常渲染结果。
