Files
main_plugin_farm/docs/15-crop-position-formula.md
T

73 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 作物绘制统一定位规则
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`:
```text
left = Cx - w / 2
top = Cy + D / 2 - h
```
原版原生像素单位一致时,PNG 完整画布为 `W, H`,场景倍率为 `s`:
```text
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=4 的本地可见落地机制,
不包含人工逐阶段锚点。种子和枯萎仍使用场景包原始公共精灵,
分别为 69×30 和 209×92。
此前将本地土地完整 PNG 高度除以 79.5,混用了透明画布与父矩形语义。
当前通过全部 30 块地中心计算整体尺度;作物保持直立等比缩放,以可见
底部区域的加权中心对齐本地土地中心,不再使用网页底边锚点。
虫子保留局部坐标映射;输出分辨率再乘 `width/3072`。
详见 [作物场景映射修正](22-crop-scene-mapping.md)。
原网页规则仍成立,但不能把本地 PNG 高度直接视为上文的 D。
沿用的旧土地网格存在拟合残差,不是网页场景的像素级复刻。
`scripts/preview_crop_positions.py` 已改为调用正式渲染器,生成
1024、1536、3072 三种输出档位的作物阶段及虫子预览。