fix(studio): дверь поворачивается вокруг петли (как настоящая), а не отскакивает

Было: дверь сдвигалась вбок. Стало: вращение вокруг левой грани (петли) на
90°. Центр двери пересчитывается по дуге вокруг hinge (p0.z - halfW), плюс
self.rotate(angle) — дверь распахивается, как в реальности.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-05 08:51:36 +03:00
parent 4906c82792
commit 32cbb7bbe9

View File

@ -267,14 +267,24 @@ game.self.onTouch(() => {
icon: 'door', category: 'world', icon: 'door', category: 'world',
prims: [{ type: 'cube', x: 0, y: 2, z: 0, sx: 1, sy: 4, sz: 3, color: '#8a5a3c', material: 'matte', name: 'Дверь' }], prims: [{ type: 'cube', x: 0, y: 2, z: 0, sx: 1, sy: 4, sz: 3, color: '#8a5a3c', material: 'matte', name: 'Дверь' }],
scripts: [{ attachTo: 'on-target', code: scripts: [{ attachTo: 'on-target', code:
`// Дверь по E: уезжает В СТОРОНУ (вбок) и возвращается. Ширина двери sx=1, `// Дверь по E: ПОВОРАЧИВАЕТСЯ вокруг петли (левой грани), как настоящая дверь.
// сдвигаем на 3 единицы вбок — проход открывается. // Толщина двери по X (sx=1) → полуширина 0.5. Петля у грани z = центр - halfZ.
let open = false; let open = false;
const p0 = game.self.position; // закрытое положение const p0 = game.self.position;
const halfW = 1.5; // половина ширины двери по Z (sz=3 → 1.5)
// Петля — у левого края двери (по Z): hinge = p0.z - halfW.
const hingeX = p0.x;
const hingeZ = p0.z - halfW;
function placeDoor(angle) {
// Центр двери на расстоянии halfW от петли, повёрнут на angle вокруг петли.
const cx = hingeX + Math.sin(angle) * halfW;
const cz = hingeZ + Math.cos(angle) * halfW;
game.self.move(cx, p0.y, cz);
game.self.rotate(angle);
}
game.self.onInteract(() => { game.self.onInteract(() => {
open = !open; open = !open;
if (open) game.self.move(p0.x + 3, p0.y, p0.z); // уехала вбок (открыта) placeDoor(open ? Math.PI / 2 : 0); // 90° открыта / 0° закрыта
else game.self.move(p0.x, p0.y, p0.z); // вернулась (закрыта)
}, { text: 'Открыть / закрыть', key: 'e', distance: 5 });` }], }, { text: 'Открыть / закрыть', key: 'e', distance: 5 });` }],
}, },
]; ];