@@ -1255,8 +1255,17 @@ def _init_state():
12551255 fragmentShader: `
12561256 varying vec3 vNormal;
12571257 void main() {
1258- float intensity = pow(0.65 - dot(vNormal, vec3(0.0, 0.0, 1.0)), 2.2);
1259- gl_FragColor = vec4(0.22, 0.72, 0.95, 1.0) * intensity;
1258+ // Fresnel-style rim glow. Three knobs:
1259+ // 0.55 — glow REACH inward from the rim. Higher = glow
1260+ // extends further into the disk (filling more of
1261+ // the visible globe with halo); lower = tight rim.
1262+ // 2.6 — falloff EXPONENT. Higher = sharper edge between
1263+ // glow and space; lower = softer/wider falloff.
1264+ // 0.7 — overall BRIGHTNESS multiplier. The cleanest
1265+ // single knob to dim or boost the halo without
1266+ // changing its shape.
1267+ float intensity = pow(0.5 - dot(vNormal, vec3(0.0, 0.0, 1.0)), 2.4);
1268+ gl_FragColor = vec4(0.22, 0.72, 0.95, 1.0) * intensity * 1.0;
12601269 }`,
12611270 side: THREE.BackSide,
12621271 blending: THREE.AdditiveBlending,
@@ -1305,14 +1314,23 @@ def _init_state():
13051314 const halo = new THREE.Mesh(haloGeo, haloMat);
13061315 satGroup.add(halo);
13071316
1308- // Trailing signal cone down to earth.
1309- const coneGeo = new THREE.ConeGeometry(0.35, 1.4, 20, 1, true);
1317+ // Spotlight beam projecting from the satellite onto the globe.
1318+ // ConeGeometry has its apex at +Y by default; rotating π around X
1319+ // flips it so the apex sits at the satellite end and the base widens
1320+ // toward Earth — reads as a real Earth-observation cone instead of a
1321+ // beam pointing into space. cone.position.y = +0.8 puts the cone on
1322+ // the Earth-facing side of satGroup (in the post-lookAt+rotateX frame
1323+ // local +Y points toward the globe). The base extends slightly past
1324+ // the globe surface; the opaque globe occludes the interior portion
1325+ // automatically, giving a clean "footprint" where the beam hits.
1326+ const coneGeo = new THREE.ConeGeometry(0.6, 1.4, 20, 1, true);
13101327 const coneMat = new THREE.MeshBasicMaterial({
13111328 color: 0x10b981, transparent: true, opacity: 0.12, side: THREE.DoubleSide,
13121329 blending: THREE.AdditiveBlending, depthWrite: false,
13131330 });
13141331 const cone = new THREE.Mesh(coneGeo, coneMat);
1315- cone.position.y = -0.8;
1332+ cone.rotation.x = Math.PI;
1333+ cone.position.y = 0.8;
13161334 satGroup.add(cone);
13171335
13181336 // --- Mouse parallax ---
0 commit comments