fix(studio): декор двери поворачивается в ту же сторону (левосторонняя СК Babylon)

Ручка/филёнки уезжали на обратную сторону двери: формула поворота смещения
была правосторонняя, а Babylon mesh.rotation.y — левосторонняя. Единая rotY()
(wx=lx·c+lz·s, wz=-lx·s+lz·c) для полотна И декора → всё открывается синхронно
в одну сторону.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-05 09:23:35 +03:00
parent 0e4fa89f40
commit 6938f83a3c

View File

@ -304,18 +304,23 @@ for (const nm of decorNames) {
} }
} }
// Поворот локального вектора (lx,lz) вокруг оси Y на angle — согласованно с
// тем, как Babylon поворачивает меш при rotation.y=angle (левосторонняя СК).
function rotY(lx, lz, a) {
const s = Math.sin(a), c = Math.cos(a);
return { x: lx * c + lz * s, z: -lx * s + lz * c };
}
function place(angle) { function place(angle) {
const s = Math.sin(angle), c = Math.cos(angle); // Полотно: центр = петля + повёрнутый локальный вектор (0, +halfW).
// Полотно: его центр на дуге вокруг петли. const pc = rotY(0, halfW, angle);
const cx = hingeX + s * halfW; const cx = hingeX + pc.x;
const cz = hingeZ + c * halfW; const cz = hingeZ + pc.z;
game.self.move(cx, p0.y, cz); game.self.move(cx, p0.y, cz);
game.self.rotate(angle); game.self.rotate(angle);
// Декор: позиция центра полотна + повёрнутое локальное смещение. // Декор: центр полотна + повёрнутое локальное смещение (той же формулой).
for (const d of decor) { for (const d of decor) {
const rx = d.dx * c - d.dz * s; // поворот смещения вокруг Y const r = rotY(d.dx, d.dz, angle);
const rz = d.dx * s + d.dz * c; d.obj.move(cx + r.x, p0.y + d.dy, cz + r.z);
d.obj.move(cx + rx, p0.y + d.dy, cz + rz);
if (d.obj.rotate) d.obj.rotate(angle); if (d.obj.rotate) d.obj.rotate(angle);
} }
} }