feat(stereo3d): drag-to-rotate для 3D-сцен Геометрии 10

STEREO3D.attachDragRotate(target, scene, onChange?) — мутирует scene.rotX/rotY на mouse/touch drag, по умолчанию пересобирает innerHTML контейнера через scene.render(). Применено к аннотированному кубу §1 (viz1-cube) в geometry_10_r1.html. Остальные сцены не затронуты.
This commit is contained in:
Maxim Dolgolyov
2026-05-29 21:45:33 +03:00
parent 96b5e46660
commit b3ea35049f
2 changed files with 76 additions and 3 deletions
+6 -3
View File
@@ -245,7 +245,7 @@ const PARAS = [
{ id:'p1', num:'§ 1', name:'Пространственные фигуры', sub:'Призма · пирамида · цилиндр · конус · шар' },
{ id:'p2', num:'§ 2', name:'Прямые и плоскости', sub:'3 аксиомы стереометрии + следствия' },
{ id:'p3', num:'§ 3', name:'Построения сечений', sub:'Метод следов · max 6-угольник у куба' },
{ id:'final', num:'', name:'Финал раздела', sub:'4 интегрированных босса', final:true }
{ id:'final', num:'★', name:'Финал раздела', sub:'4 интегрированных босса', final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -579,7 +579,7 @@ function buildP1(){
html += makeCard('rule', 'Формула Эйлера', '§ 1.3',
'<p>Для любого <b>выпуклого многогранника</b>:</p>'
+ '<p style="text-align:center;margin:8px 0">$$В - Р + Г = 2$$</p>'
+ '<p>Куб: $8 - 12 + 6 = 2$ . Тетраэдр: $4 - 6 + 4 = 2$ .</p>'
+ '<p>Куб: $8 - 12 + 6 = 2$ &#10003;. Тетраэдр: $4 - 6 + 4 = 2$ &#10003;.</p>'
+ '<details class="spoiler"><summary>Свойства основных тел</summary><div class="spoiler-body">'
+ '<ul>'
+ '<li>$n$-угольная призма: $В=2n$, $Р=3n$, $Г=n+2$.</li>'
@@ -948,7 +948,10 @@ function buildAnnotatedCube(){
sc.addCube({center:[0,0,0], size:2.0, labels:true});
sc.addEdge([-1,-1,-1],[1,1,1], {stroke:'#dc2626', width:3, dash:'5 3'});
sc.addFace([[-1,-1,-1],[1,-1,-1],[1,-1,1],[-1,-1,1]], {fill:'#a78bfa', opacity:0.30, stroke:'none'});
const el = document.getElementById('viz1-cube'); if(el) el.innerHTML = sc.render();
const el = document.getElementById('viz1-cube');
if(!el) return;
el.innerHTML = sc.render();
if (S.attachDragRotate && !el.__rotBound){ S.attachDragRotate(el, sc); el.__rotBound = true; }
}
function buildPrismDirect(){