fix(render): apply celestial birth matrix to column vectors
Docs Deploy / Build and Deploy MkDocs (push) Successful in 40s

This commit is contained in:
Valentin Popov committed 2026-10-31 20:31:22 +04:00
1 parent f08476e655
commit 9df0d8594f
4 files changed
+51 -22

No files matched your search

+19 -1
View File
@@ -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. Второй источник получает направление