From 6938f83a3c3e7961a76f97c898c320b4cfbd4913 Mon Sep 17 00:00:00 2001 From: min Date: Fri, 5 Jun 2026 09:23:35 +0300 Subject: [PATCH] =?UTF-8?q?fix(studio):=20=D0=B4=D0=B5=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=20=D0=B4=D0=B2=D0=B5=D1=80=D0=B8=20=D0=BF=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D1=87=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D1=82=D1=83=20=D0=B6=D0=B5=20=D1=81=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D1=83=20(=D0=BB=D0=B5=D0=B2=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=BD=D0=BD=D1=8F=D1=8F=20=D0=A1=D0=9A=20Bab?= =?UTF-8?q?ylon)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ручка/филёнки уезжали на обратную сторону двери: формула поворота смещения была правосторонняя, а Babylon mesh.rotation.y — левосторонняя. Единая rotY() (wx=lx·c+lz·s, wz=-lx·s+lz·c) для полотна И декора → всё открывается синхронно в одну сторону. Co-Authored-By: Claude Opus 4.8 --- src/editor/engine/GameplayKits.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/editor/engine/GameplayKits.js b/src/editor/engine/GameplayKits.js index 8573630..6c80889 100644 --- a/src/editor/engine/GameplayKits.js +++ b/src/editor/engine/GameplayKits.js @@ -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) { - const s = Math.sin(angle), c = Math.cos(angle); - // Полотно: его центр на дуге вокруг петли. - const cx = hingeX + s * halfW; - const cz = hingeZ + c * halfW; + // Полотно: центр = петля + повёрнутый локальный вектор (0, +halfW). + const pc = rotY(0, halfW, angle); + const cx = hingeX + pc.x; + const cz = hingeZ + pc.z; game.self.move(cx, p0.y, cz); game.self.rotate(angle); - // Декор: позиция центра полотна + повёрнутое локальное смещение. + // Декор: центр полотна + повёрнутое локальное смещение (той же формулой). for (const d of decor) { - const rx = d.dx * c - d.dz * s; // поворот смещения вокруг Y - const rz = d.dx * s + d.dz * c; - d.obj.move(cx + rx, p0.y + d.dy, cz + rz); + const r = rotY(d.dx, d.dz, angle); + d.obj.move(cx + r.x, p0.y + d.dy, cz + r.z); if (d.obj.rotate) d.obj.rotate(angle); } }