diff options
| author | Valentin Popov <valentin@popov.link> | 2026-10-31 19:31:22 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-10-31 19:31:22 +0300 |
| commit | 9df0d8594f606c518fdf53cde4da55a44001031e (patch) | |
| tree | 035e2545043000dcd493a018e2c152e3f85a456a /docs/reference/atmosphere.md | |
| parent | f08476e65550bb9156c40f99c5dc6a7f68b292b3 (diff) | |
| download | fparkan-9df0d8594f606c518fdf53cde4da55a44001031e.tar.xz fparkan-9df0d8594f606c518fdf53cde4da55a44001031e.zip | |
fix(render): apply celestial birth matrix to column vectors
Diffstat (limited to 'docs/reference/atmosphere.md')
| -rw-r--r-- | docs/reference/atmosphere.md | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/docs/reference/atmosphere.md b/docs/reference/atmosphere.md index 65ed176..d755bfb 100644 --- a/docs/reference/atmosphere.md +++ b/docs/reference/atmosphere.md @@ -50,7 +50,25 @@ key_time = floor(duration * (key_hour * 60 + key_minute) * 60 / 86400) theta = (clamp((now - birth_start) / lifetime, 0, 1) * 1.2 - 0.1) * pi ``` -Затем к нему применяется матрица рождения. У солнца и луны независимые +Затем к нему применяется матрица рождения как к вектору-столбцу. Если `A` и +`B` — углы рождения, а `x = cos(theta)` и `z = -sin(theta)`, результат равен + +```text +[x*cos(A) + z*sin(A)*sin(B), + x*sin(A) - z*cos(A)*sin(B), + z*cos(B)] +``` + +Порядок важен для всего освещения: транспонированное умножение переносит +солнце на другую сторону мира и меняет освещённые склоны, блики и тени. +В GOG `Terrain.dll` (SHA-256 +`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`) +матрицу строит RVA `0x4A550`, а вектор преобразует `CSun::Update`, RVA +`0x4B570`. Живой замер после 282184 мс при длительности 525000 мс и углах +`[90, 30]` дал направление `[-0.4950135, -0.1408745, -0.8573891]`; +Rust-тест проверяет этот результат с допуском `3e-6`. + +У солнца и луны независимые интервалы и независимые направления: при отсутствии активной луны нельзя подменять её направление противоположностью солнца. `SunFrame::color` — это единственный primary directional RGB. Второй источник получает направление |
