3.1 KiB
作物绘制统一定位规则
2026-10-19 经用户确认,后续普通地块作物绘制采用本文公式。
本文取代 14-crop-position-calibration.md 中的人工逐阶段定位方案。
不再扩展人工锚点,不按非透明包围盒裁剪图片,不保存网页作物 ID。
已确认的来源
网页公开 Lua 包的 WebGLMainSceneLandController:SetCropTexture:
先调用 Image.SetNativeSize(),生长阶段宽高乘 0.75,
再将 RectTransform.anchoredPosition 设为零。
WebGLMainSceneLandsController:InitLands 使用
LandsCrops/LandN/crop 作为普通地块作物节点。
主场景包中对应的 90 个普通作物节点(含不同预制体副本)
统一采用 pivot = anchorMin = anchorMax = (0.5, 0)。
这是完整画布底边中点,不是可见茎根的人工标注点。
普通土地与作物父容器中心一致;参考矩形为 153 × 79.5。
计算公式
输出画布左上角为原点,x 向右、y 向下。土地矩形中心为
(Cx, Cy),显示高度为 D,作物完整画布最终显示宽高为 w, h:
left = Cx - w / 2
top = Cy + D / 2 - h
原版原生像素单位一致时,PNG 完整画布为 W, H,场景倍率为 s:
D = 79.5 × s
w = 0.75 × W × s
h = 0.75 × H × s
left = Cx - 0.375 × W × s
top = Cy + 39.75 × s - 0.75 × H × s
先确定统一场景单位,不能把 0.75 重复叠加到已有图片缩放。 以实际最终显示宽高计算位置,仅在落到输出像素时取整。 必须保留透明留白;参考土地矩形,不能使用土壤可见像素包围盒。
阶段边界
- 原版 step 2~6:上述生长图片公式。
- step 1:公共种子图,原生尺寸乘 0.5,localPosition=(0,0,0)。
- step 7/8:公共枯萎图,原生尺寸乘 0.5,localPosition=(0,-8,0)。
- 本地阶段编号需正确映射到原版资源阶段,不能直接混用。
- 特殊、动画和其他场景的作物须分别核验其控制器。
验证与接入状态
随机抽取本地数据库的茄子、油菜、黄瓜、迎春花、桂圆, 共绘制 24 个生长阶段;保留完整透明画布,不使用人工锚点。 场景倍率为 2,底边对齐的计算误差不超过 0.5 输出像素。 这验证了预览公式的执行与图片效果,不代表所有素材已逐一核对原图。
正式渲染器已切换到本文公式。crop_positions.json schema=2 保存统一规则,
不再包含人工逐阶段锚点;导出 metadata 也不再写入人工标注。
种子和枯萎使用场景包原始公共精灵,分别为 69×30 和 209×92。
现有 3072 基准场景沿用旧土地布局;以其土地显示高度 D 除以 79.5
得到原版单位到当前布局的统一倍率,再换算作物与虫子尺寸和坐标。
跨输出分辨率只追加 width/3072,不重复应用 0.75。
旧土地的宽高比例仍沿用本地布局,因此本次是定位规则移植,
不是对整个网页场景像素级复刻。
scripts/preview_crop_positions.py 已改为调用正式渲染器,生成
1024、1536、3072 三种输出档位的作物阶段及虫子预览。