Schnitt entspiegelt: u-Achse = Betrachter-RECHTS (Rust + TS koordiniert)

Die Schnitt-u-Achse nutzte cross(normal, up) — die look_at-Konvention für
Blick entlang −z. Für einen Schnitt, den man entlang +normal betrachtet,
spiegelte das die Zeichnung (Blick nach Norden zeigte Osten links). Neu:
u = cross(up, normal) — wer nach Norden blickt, hat Osten rechts. Dieselbe
Entspiegelung wie zuvor in der Ansicht (b967146).

Koordiniert geändert: SectionPlane::u_axis (section.rs; section_fill nutzt
dieselbe Methode) + sectionUAxisModel (toSection.ts; Schicht-Orientierung
wallLayersReversedInU und Dach-Schnitt hängen daran und kippen konsistent
mit — die Aussenseite bleibt in der Zeichnung physisch aussen). Rust- und
TS-Tests auf die neue Konvention gespiegelt; Engine neu gebaut.
cargo 76/76, vitest 737/737.
This commit is contained in:
2026-07-11 02:30:35 +02:00
parent 1945fecd11
commit 983d061a0c
4 changed files with 85 additions and 75 deletions
+7 -6
View File
@@ -160,16 +160,17 @@ export function sectionPlaneFromLevel(level: DrawingLevel): SectionPlaneSpec | n
* Ebene (Modell-2D: model.x = world.x, model.y = world.z).
*
* Muss EXAKT der u-Achse des WASM-Extraktors entsprechen (`SectionPlane::u_axis`
* in section.rs): dort `u = normalize(cross(normal, up))` mit up = (0,1,0). Für
* eine horizontale Normale `[Nx, Ny, Nz]` ist `cross(normal, (0,1,0)) =
* (-Nz, 0, Nx)`; die Grundriss-Komponenten (x, z) sind also `(-Nz, Nx)`. Damit
* wächst die Ausgabe-u-Koordinate genau in dieser Modell-Richtung — die Referenz,
* gegen die die Wand-Aufbaurichtung projiziert wird. (Nicht normiert; für das
* in section.rs): dort `u = normalize(cross(up, normal))` mit up = (0,1,0)
* das Blickrichtungs-RECHTS des Betrachters (Entspiegelung; wer nach Norden
* blickt, hat Osten rechts). Für eine horizontale Normale `[Nx, Ny, Nz]` sind
* die Grundriss-Komponenten (x, z) also `(Nz, -Nx)`. (Nicht normiert; für das
* Vorzeichen des Skalarprodukts irrelevant.)
*/
export function sectionUAxisModel(plane: SectionPlaneSpec): Vec2 {
// Blickrichtungs-RECHTS (cross(up, N)) — muss EXAKT `SectionPlane::u_axis`
// in section.rs spiegeln (dort seit der Entspiegelung dieselbe Formel).
const [nx, , nz] = plane.normal;
return { x: -nz, y: nx };
return { x: nz, y: -nx };
}
/**