fix(studio): декор двери (филёнки+ручка) вращается вместе с полотном

Декор-части находятся по имени (findOne), их локальное смещение от центра
полотна поворачивается вокруг той же петли в place() — теперь филёнки и ручка
открываются вместе с дверью, а не висят в проёме.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-05 09:20:15 +03:00
parent 9a58c34303
commit 0e4fa89f40

View File

@ -285,18 +285,41 @@ game.self.onTouch(() => {
// Скрипт на полотне двери. Филёнки/ручка двигаются вместе как часть полотна?
// Нет — они отдельные примитивы, поэтому анимируем только полотно (game.self),
// а декор оставляем — на низкой толщине двери смотрится цельно.
const p0 = game.self.position;
const p0 = game.self.position; // центр полотна (закрытое положение)
const halfW = 1.3; // половина ширины полотна по Z (sz=2.6)
const hingeX = p0.x;
const hingeZ = p0.z - halfW; // петля у левого края
let open = false;
let cur = 0, target = 0; // текущий и целевой угол (радианы)
const SPEED = Math.PI; // рад/сек → ~0.5с на 90°
// Декор полотна — двигаем вместе с дверью. Запоминаем их СМЕЩЕНИЕ относительно
// центра полотна (в закрытом виде), чтобы вращать вокруг той же петли.
const decorNames = ['Филёнка верх', 'Филёнка низ', 'Ручка'];
const decor = [];
for (const nm of decorNames) {
const o = game.scene.findOne(nm);
if (o && o.position) {
decor.push({ obj: o, dx: o.position.x - p0.x, dy: o.position.y - p0.y, dz: o.position.z - p0.z });
}
}
function place(angle) {
const cx = p0.x + Math.sin(angle) * halfW;
const cz = hingeZ + Math.cos(angle) * halfW;
const s = Math.sin(angle), c = Math.cos(angle);
// Полотно: его центр на дуге вокруг петли.
const cx = hingeX + s * halfW;
const cz = hingeZ + c * halfW;
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);
if (d.obj.rotate) d.obj.rotate(angle);
}
}
// Один постоянный тик плавно ведёт cur → target.
game.onTick((dt) => {
if (cur === target) return;