# Sun Temple：程序化建筑与角色编排

用于对称石质建筑、可展开庭院、发光装置或带角色的预设演出。先读 Skill 通用流程；本页是可选技术案例，尺寸与色板按新场景调整。

参考学习来源为 Techartist 的 [sun-temple](https://github.com/iamtechartist/sun-temple)，固定提交 `c247c0fda9e7ead65361a49742f8a6da2dabf155`，MIT，Copyright (c) 2026 Techartist。[本站 Demo](https://devtookit.com/demos/sun-temple)。原仓库未记录 AI 工具或提示词。角色资产没有单独列出外部创作者来源，不能从文件名或 clip 名字推断来源；重新分发保留仓库许可，替换资产核对其许可。

## 实现边界

- Three.js r185 WebGPURenderer + TSL，原生 ES Modules、OrbitControls；原 import map 使用 CDN，本站只改为同版本本地依赖。
- 环境几何与石材、天空、太阳光效程序化构造。祭司网格、24 骨骼、贴图和 walking/waving 动作来自内嵌 FBX，属于混合资产场景。
- 每份 FBX 一个蒙皮网格、9,215 三角形；两个 clip 约 1.03/4.10 秒。只有 walking 根对象显示，waving clip 绑定到它的骨架。无通用重定向、Root Motion、IK、导航或碰撞系统。
- 建筑与山体是固定参数布局，噪声负责细节；无历史建筑精确复原声明，无侵蚀模拟、布尔岩窟、Bloom、体积光或天气系统。

## 建模方法

1. 用左右对称循环放大体块。截头体使用上下八顶点生成收分塔门与基础；圆角单位块可共享，但非等比缩放也会改变倒角比例。
2. 柱头和简化雕像用半径/高度轮廓绕轴旋转；檐口沿 x 挤出 yz 轮廓、封端。五层门框用两柱一梁逐层缩小，暗末端遮住内部终点，不能代替完整室内。
3. 重复结构按几何、材质实例化；需要整组运动的柱廊、梁和装饰保留共同父组。
4. 34 排中央台阶更新实例矩阵，左右 68 实例保持不动。中央 y 从各排原高度汇到 12.47，厚 0.56，深 1.86；基础前顶点从 0.35 升到 12.72，重算法线。验证台阶覆盖、顶面和基础同时连续。

## 地表与岩壁

- 格点 hash：`fract(sin(127.1x+311.7z+74.7seed)*43758.5453123)`；以 `t²(3-2t)` 插值四角得到 value noise。
- 四层 fbm：初始振幅 .56，每层乘 .47，频率乘 2.02；固定种子维持可重复预览。
- 建筑附近遮罩 `M=exp(-(x/74)^4-((z-10)/82)^4)`，地表波动乘 `1-.76M`，柔和压低波动。新项目补明确的 terrainHeight 与基础支撑接口；本例没有统一接口。
- 局部沙堆 `F=max(0,1-u²-v²)`，高度为基底加 `F^1.6 * height * (.86+.22exp(-((u+skew*v)*1.8)^2))`。
- 岩体生成前后网格并封四周，顶轮廓用低频噪声。表面叠加 fbm、正弦层带、`max(0,sin(.41y+.73seed))^13*1.45` 岩架和两条负高斯沟槽。沟槽中心随 y 偏移；细节要影响几何时真正修改顶点。

## 材质与发光

- 砂岩使用世界位置的大色差、层带、颗粒，以及法线朝向调色；改变 color 与 roughness，metalness=0。没有材质位移/normal/bump。凹部来自显式 recess 参数，不是 AO。
- 移动部件穿过世界纹理场会滑纹；需要附着纹理时用局部坐标。天空与砂岩共用 SUN_VECTOR，实际方向灯另设坐标，严格一致时统一来源。
- 太阳圆柱转过 x 轴 π/2，盘材质径向使用局部 x,z；平面 corona 使用局部 x,y。保留各自坐标含义。
- 火纹 A/B/C 是不同方向、速度且相互扰动的正弦，亮丝 `F=clamp(.46A+.38B+.30C,0,1)^3.2`；ignition 同时控制砂岩/火纹混色、emissive、粗糙度和灯强度。
- 两层透明平面按径向 smoothstep 生成环与衰减；22 片五顶点三角火舌做外轮廓。AdditiveBlending、DoubleSide、depthWrite=false、保留 depthTest、renderOrder 12/13/14。固定盘平面侧面会变薄；自由相机必须额外验证。
- 环境用橙色 PointLight，而不是靠 emissive 自动照亮周围。无 Bloom；需要后处理时另实现并验证 pass 成本。

## 时序与角色

维护 `courtProgress`、`target`、累计 `discSpin`、共享 `solarClock`，以及角色 progress/mode/heading/turnDelay。

```text
u=clamp((courtProgress-start)/(end-start),0,1)
E=6u^5-15u^4+10u^3
末尾可选回摆：q=(u-.78)/.22
E += .012sin(2πq)(1-q)^2，仅 .78<u<1
```

建筑总时长 6.5 秒。柱廊区间[0,.92]、台阶[.015,.87]、塔门[.03,.90]、太阳盘[.08,.94]、点火[.62,.985]。角色在 .72（约4.68秒）出场，用6秒走到庭院；总演出约10.68秒，不能混同建筑时长。

- 左右柱廊外移16，塔门外移5.5，盘升66.7→79并转 .72π；阶段重叠但共享进度。
- 关闭且角色路径progress>0时冻结建筑进度，角色转身 .68秒再用5.6秒返回。回到入口隐藏/暂停动作后才能收平台。
- 返回途中开启：保留当前位置，转向外侧 .42秒再继续；无需重新创建场景。
- 角色模式 hidden/walkingOut/waving/turningIn/walkingIn/turningOut；整体 z=-36→1.5，y=16.2→13.53，用路径s的分段三次平滑控制下降。路程与 clip 速度要重新匹配，不能保证无滑步。
- walking速度1.14、waving .94，AnimationAction 淡入淡出。两FBX骨架命名需兼容，不兼容时显式重定向，不能直接移植。
- 角度取最短差值，`alpha=1-exp(-lambda*dt)` 平滑转向。模型视锥剔除关闭以保护动作范围；更精确时更新包围体。
- 加载器裁掉超过四个的蒙皮影响，页面过滤警告并不修复；材质强制不透明不适用于所有发片。

## 验证与改进

检查关闭、开启中段、完全开启、人物走出后关闭、返回途中重开、连续按钮、三个镜头与窄屏。核对脚下支撑、门框净空、透明遮挡和 clip 混合。

原相机41°，只允许正面左右约64°，禁止平移，Reset仅回Hero；窄屏更新aspect而不调整取景距离。需要手机完整构图时补主体包围盒适配。

像素比上限1.6，主光阴影4096²。实例化不等于全部合批。静止台阶仍更新矩阵/法线；按变化标记优化，动态角色阴影另处理。HTML约16.7MB，两份完整FBX解析产生重复资源，可考虑共享网格+独立动作。delta截断.05不补时间；要保留演出时长，用积累器或合适子步。

交付时分别报告源码机制、浏览器实际观察、真实设备测试和未测试状态。不要把单次 FPS 写成通用性能保证。
