<!-- SAGA2 · part 41 -->
,[0,3.5,5.8]], iG); // forehead to brow
    L([[0,3.5,5.8],[0,2,6.3],[0,0.5,6.9]], iG); // nose bridge
    L([[0,0.5,6.9],[0,-0.8,7.2],[0,-1.5,6.8]], iG); // nose tip (sharp point)
    L([[0,-1.5,6.8],[0,-2.2,6.7],[0,-2.8,6.8]], iC); // to upper lip (protruding)
    L([[0,-2.8,6.5],[0,-3.5,6.2],[0,-4.2,6.3]], iC); // lower lip to chin (sharp)


    // 3D HUMAN — ear, dense profile, wrapped cheeks, protruding lips
    // EAR (intaglio, both sides) — 5 concentric C-curves at temple
    for(var er2=0;er2<5;er2++){ var erd2=0.8-er2*0.14, eep=[];
      for(var ean2=-1.2;ean2<=1.2;ean2+=0.15){
        eep.push([5.2+Math.cos(ean2)*erd2*0.4, 0.5+Math.sin(ean2)*erd2, 1.5+erd2*0.3]);
      }
      L(eep, er2%2?iG:iD);
      var eep2=[];
      for(var ean3=-1.2;ean3<=1.2;ean3+=0.15){
        eep2.push([-5.2-Math.cos(ean3)*erd2*0.4, 0.5+Math.sin(ean3)*erd2, 1.5+erd2*0.3]);
      }
      L(eep2, er2%2?iG:iD);
    }
    // PROFILE DENSITY — cheek (3), temple (2), jaw (3), both sides
    for(var pd=0;pd<3;pd++){ var pdy=-1-pd*0.8;
      L([[4.8,pdy,4.5],[5.1,pdy-0.3,3.5],[5.2,pdy-0.5,2.5]], iC); // right cheek
      L([[-4.8,pdy,4.5],[-5.1,pdy-0.3,3.5],[-5.2,pdy-0.5,2.5]], iC); // left cheek
    }
    for(var pt=0;pt<2;pt++){ var pty=3+pt*1.2;
      L([[4.9,pty,3.8],[5.2,pty,2.8],[5.3,pty,1.8]], iD); // right temple
      L([[-4.9,pty,3.8],[-5.2,pty,2.8],[-5.3,pty,1.8]], iD); // left temple
    }
    for(var pj=0;pj<3;pj++){ var pjy=-3.5-pj*0.5;
      L([[4.7,pjy,5.0],[5.0,pjy-0.2,4.0],[5.1,pjy-0.4,3.0],[5.2,pjy-0.8,1.0],[5.1,pjy-1.2,-1.0],[4.0,pjy-1.5,0.5]], iG); // right folds back then INWARD
      L([[-4.7,pjy,5.0],[-5.0,pjy-0.2,4.0],[-5.1,pjy-0.4,3.0],[-5.2,pjy-0.8,1.0],[-5.1,pjy-1.2,-1.0],[-4.0,pjy-1.5,0.5]], iG); // left folds back then INWARD
    }
    // LIPS PROTRUSION — push forward in central profile (z+0.3)


    // PRACTICE HEADS — removed (ball heads, rebuilding)
    // PRACTICE HEADS — proper human form (not balls), 10 numbered
    var practiceHeads = new THREE.Group();
    function makeNumber2(n, x, y, z){
      var cv = document.createElement('canvas'); cv.width=128; cv.height=128;
      var c2 = cv.getContext('2d');
      c2.fillStyle='#000'; c2.fillRect(0,0,128,128);
      c2.fillStyle='#0ff'; c2.font='bold 80px Arial';
      c2.textAlign='center'; c2.textBaseline='middle';
      c2.fillText(n.toString(), 64, 64);
      var tex = new THREE.CanvasTexture(cv);
      var spm = new THREE.SpriteMaterial({map:tex, transparent:true});
      var spo = new THREE.Sprite(spm); spo.position.set(x,y,z); spo.scale.set(4,4,1);
      return spo;
    }
    var vars2 = [
      [1.0,1.0,1.0,1.0],[1.5,1.0,1.0,1.0],[0.6,1.0,1.0,1.0],
      [1.0,1.5,1.0,1.0],[1.0,0.6,1.0,1.0],[1.0,1.0,1.4,1.0],
      [1.0,1.0,0.7,1.0],[1.0,1.0,1.0,1.3],[1.0,1.0,1.0,0.7],
      [1.2,1.2,1.1,1.1],
    ];
    for(var pv2=0;pv2<10;pv2++){
      var vv = vars2[pv2];
      var pg2 = new THREE.Group();
      var pL2 = function(pts, mat){
        var gg = new THREE.BufferGeometry().setFromPoints(pts.map(function(p){ return new THREE.Vector3(p[0],p[1],p[2]); }));
        pg2.add(new THREE.Line(gg, mat));
      };
      // CRANIUM — egg-shaped (longer front-back, not sphere)
      for(var pmm=0;pmm<10;pmm++){ var pmp2=[];
        for(var ptt=0;ptt<=14;ptt++){ var pta2=(ptt/14)*Math.PI;
          var px2=Math.cos(pmm/10*Math.PI*2)*4.5*Math.sin(pta2);
          var py2=5.5*Math.cos(pta2)+1;
          var pz2=Math.sin(pmm/10*Math.PI*2)*5.5*Math.sin(pta2); // longer Z
          pmp2.push([px2,py2,pz2]);
        }
        pL2(pmp2, iC);
      }
      // JAW — tapered, angular (not round)
      pL2([[-3.5,-2,3.5],[-2.5,-5,4.2],[-1.5,-6.5,4.5]], iG); // left jaw
      pL2([[3.5,-2,3.5],[2.5,-5,4.2],[1.5,-6.5,4.5]], iG); // right jaw
      pL2([[-1.5,-6.5,4.5],[0,-7,4.6],[1.5,-6.5,4.5]], iG); // chin
      // FACE PLANE — flat front
      pL2([[-3.5,3,4.8],[3.5,3,4.8]], iD); // brow line
      pL2([[-3.2,-1,5.0],[3.2,-1,5.0]], iD); // cheek line
      // Ears (variation)
      for(var per3=0;per3<4;per3++){ var pdd=(0.8-per3*0.15)*vv[0], pep3=[];
        for(var pea4=-1;pea4<=1;pea4+=0.2){ pep3.push([4.6+Math.cos(pea4)*pdd*0.4, 0.5+Math.sin(pea4)*pdd, 1.2]); }
        pL2(pep3, iG);
      }
      // Nose (variation width)
      var pnw2=vv[2];
      pL2([[0,2,5.2*pnw2],[0,0,6.0*pnw2],[0,-1,6.3*pnw2]], iG);
      // Eyes (variation size)
      var pes2=vv[3];
      for(var per4=0;per4<3;per4++){ var ped2=(1.0-per4*0.2)*pes2, pep4=[];
        for(var pea5=0;pea5<=12;pea5++){ var pa3=(pea5/12)*Math.PI*2;
          pep4.push([-1.9+Math.cos(pa3)*ped2, 2+Math.sin(pa3)*ped2*0.5, 4.9]);
        }
        pL2(pep4, iC);
      }
      pg2.add(makeNumber2(pv2+1, 0, -10, 0));
      pg2.position.set(-90+pv2*20, 14, 60);
      practiceHeads.add(pg2);
    }
    scene.add(practiceHeads);



    // PROFILE LIGHT/SHADOW — from King's reference sketch
    // SHADOW zones: dense hatching
    // Under nose (shadow) — 5 dense lines
    for(var sh1=0;sh