oneshotlm
Compare all models on this prompt →

3D solar system · grok-build-0.1

Using the pre-provided three.min.js (global THREE), build a 3D solar system with the sun and orbiting planets at varied speeds and sizes, orbit-drag camera controls, and a starfield.

⛨ sandboxed Open in new tab ↗
transcript · 10 messages
user

Using the pre-provided three.min.js (global THREE), build a 3D solar system with the sun and orbiting planets at varied speeds and sizes, orbit-drag camera controls, and a starfield.

assistant
thinking
The task is: "Build a single-page web app and write it ALL into one self-contained file named index.html in the current directory: CSS in a <style> tag, JS in a <script> tag, inline — do not create se...
bash {"command":"ls -la /tmp/ws"}
toolResult

total 592 drwxr-sr-x. 2 node node 26 Aug 1 20:46 . drwxrwsrwx. 3 root node 16 Aug 1 20:46 .. -rw-r--r--. 1 node node 603445 Aug 1 20:46 three.min.js

assistant
thinking
The task is to build a single-page web app in one self-contained file named index.html. It should use the pre-provided three.min.js (global THREE). No external resources, CDNs, or network requests. Th...The task is to build a 3D solar system using three.min.js, in a single index.html file. It needs sun, orbiting planets with varied speeds and sizes, orbit-drag camera controls, and a starfield. No external resources.

three.min.js is the global THREE. I need to include it via script or something? No, since it's local, <script src="three.min.js"></script> in index.html.

The file is self-contained, so index.html will have the script tag for three.min.js, style, and script.

I need to implement OrbitControls myself because it's not provided.

Recall how to make simple 3D orbit controls.

Use spherical coordinates for camera position.

Variables: theta (azimuth), phi (polar angle), radius.

Update on mouse drag.

For starfield: use Points with random positions.

Planets: spheres with different params.

Add some lights.

Make it full screen.

Let me sketch the code.

 <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Solar System</title>
    <style>
      body { margin: 0; overflow: hidden; background: black; }
      #controls { position: absolute; top: 10px; left: 10px; color: white; z-index: 1; }
    </style>
  </head>
  <body>
    <div id="controls">
      <button id="pause">Pause</button>
      <button id="reset">Reset</button>
      <label >Speed: <input type="range" id="speed" min="0.1" max="2" value="1"></label>
    </div>
    <script src="three.min.js"></script>
    <script>
      // JS code here
      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 500);
      const renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(renderer.domElement);
      // resize
      window.addEventListener('resize', () => {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
      });
      // lights
      const ambientLight = new THREE.AmbientLight(0x 404040);
      scene.add(ambientLight);
      const sunLight = new THREE.PointLight(0xffff00, 2, 500);
      scene.add(sunLight);
      // sun
      const sunGeo = new THREE.SphereGeometry(5, 32, 32);
      const sunMat = new THREE.MeshPhongMaterial({color: 0xffaa00, emissive: 0xff6600, shininess: 50});
      const sun = new THREE.Mesh(sunGeo, sunMat);
      scene.add(sun);
      sunLight.position.set(0,0,0);
      // starfield
      const starsGeo = new THREE.BufferGeometry();
      const starPositions = [];
      for (let i = 0; i < 10000; i++) {
        const x = (Math.random() - 0.5) * 400;
        const y = (Math.random() - 0.5) * 400;
        const z = (Math.random() - 0.5) * 400;
        starPositions.push(x, y, z);
      }
      starsGeo.setAttribute('position', new THREE.Float32BufferAttribute(starPositions, 3));
      const starsMat = new THREE.PointsMaterial({color: 0xffffff, size: 0.5});
      const stars = new THREE.Points(starsGeo, starsMat);
      scene.add(stars);
      // planets data
      const planetData = [
        {name: 'Mercury', size: 0.5 , dist: 10, speed: 0.04, color: 0x8c8c8c, rot: 0.02},
        {name: 'Venus', size: 0.8, dist: 14, speed: 0.025, color: 0xffc49 9, rot: 0.015},
        {name: 'Earth', size: 0.9, dist: 18, speed: 0.02, color: 0x 4b9eff, rot: 0.01},
        {name: 'Mars', size: 0 .6, dist: 22, speed: 0.015, color: 0xff4d4d, rot: 0.025},
        {name: 'Jupiter', size: 2.0, dist: 30, speed: 0.008, color: 0xd 8a56b, rot: 0.05},
        {name: 'Saturn', size: 1.7, dist: 40, speed: 0.006, color: 0xf4e4bc, rot: 0.04},
        {name: 'Uranus ', size: 1.3, dist: 50, speed: 0.003, color: 0x4b7 0b8, rot: 0.03},
        {name: 'Neptune', size: 1.
write /tmp/ws/index.html (20047 bytes)
toolResult

Successfully wrote 20047 bytes to /tmp/ws/index.html

assistant
thinking
The file has been written. Now I should verify it exists and is complete.
bash {"command":"ls -la /tmp/ws/index.html && wc -c /tmp/ws/index.html"}
toolResult

-rw-r--r--. 1 node node 20057 Aug 1 20:47 /tmp/ws/index.html 20057 /tmp/ws/index.html

assistant
thinking
The file is created. It's a single self-contained index.html using three.min.js as instructed. It includes:
bash {"command":"head -30 /tmp/ws/index.html && echo \"...\" && tail -10 /tmp/ws/index.html"}
toolResult

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Solar System</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { background: #000; color: #eee; font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; overflow: hidden; } canvas { display: block; } #ui { position: absolute; top: 0; left: 0; right: 0; padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; pointer-events: none; z-index: 10; } .title { pointer-events: auto; background: rgba(0,0,0,0.6); padding: 8px 16px; border-radius: 6px; ... info.classList.add('active'); setTimeout(() => info.classList.remove('active'), 2400); } }, 1200); } start(); </script> </body> </html>

assistant
thinking
The file is complete. It uses the local three.min.js via <script src="three.min.js"></script>, everything is self-contained in index.html with inline CSS and JS. No external network resources.

The self-contained single-file 3D solar system is ready: **`/tmp/ws/index.html`** (20 KB, uses the local `three.min.js`) ### Features - **Sun** (bright emissive) with a soft glow - **8 planets** (Mercury → Neptune) with unique radii, orbit distances, and orbital speeds - **Saturn ring** with tilt + faint outer band - **Earth's Moon** that orbits independently - **Starfield** (procedural, subtle rotation) - **Orbit-drag camera**: - Drag to rotate view (mouse + touch) - Scroll wheel to zoom - Double-click or "R" key resets camera - **Simulation controls**: - Pause / Resume button + `Space` key - Speed slider (0×–5×) - Planets self-rotate at different rates - **Click planets** (or tap) to show name/info panel - Fully sandboxed: zero external requests or CDNs Open `index.html` in a browser to run it.

TAKE IT TO CODE

A single self-contained HTML file — copy it and open in any browser, or reuse the prompt with your own pi-agent run.

RUN

modelgrok-build-0.1
vendorxAI · Grok
harnesspi-agent
generated2026-08-01

EVALUATION

4/5 working

3D solar system with sun, orbiting planets, rings, starfield; drag rotates camera, space pauses; arrows/WASD have no effect.

Vision grade · anthropic/claude-sonnet-5

MEASUREMENTS

Raw readings from the capture, not a verdict — the grade above is the only judgement. Percentages are how much of the screen changed; the measure under-reports sparse motion on a dark background.

idle motion3.1%
on click3.2%
on drag3.5%
on wheel4.5%
on enter + space1.7%
on arrow keys0.0%
on w/a/s/d0.0%
frame spread25.3 / 255
console errors0
js errors none

METRICS

runtime81.2s
tokens in7.0k
tokens out12k
cached19k
cost / run$0.0355