Search code examples
javascriptanimationthree.jsring

Three.js – Create half a ring and animate it


I've created a Ring and would like to have only half of it. And after that animate it, that it builds itself up from 0 to half.

var geometry = new THREE.RingGeometry(10, 9, 32);
var material = new THREE.MeshBasicMaterial({
  color: 0xffff00,
  side: THREE.DoubleSide,
});
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

How can I archive it? I'm new to three.js.


Solution

  • Use thetaStart and thetaLength to animate the half-ring.

    body{
      overflow: hidden;
      margin: 0;
    }
    <script type="module">
    import * as THREE from "https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js";
    
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight, 1, 100);
    camera.position.set(0, 0, 10);
    var renderer = new THREE.WebGLRenderer({antialias: true});
    renderer.setSize(innerWidth, innerHeight);
    document.body.appendChild(renderer.domElement);
    
    var grid = new THREE.GridHelper(10, 10);
    grid.rotation.x = Math.PI * 0.5;
    scene.add(grid);
    
    var innerRadius = 1;
    var outerRadius = 2;
    
    // re-building geometry
    var usualRingGeom = new THREE.RingBufferGeometry(innerRadius, outerRadius, 32, 1, 0, 1);
    var usualRingMat = new THREE.MeshBasicMaterial({color: 0xffff00});
    var usualRing = new THREE.Mesh(usualRingGeom, usualRingMat);
    scene.add(usualRing);
    
    var clock = new THREE.Clock();
    
    renderer.setAnimationLoop(()=>{
      let t = clock.getElapsedTime();
      
      // re-building geometry
      usualRingGeom = new THREE.RingBufferGeometry(innerRadius, outerRadius, 32, 1, 0, (Math.sin(t) * 0.5 + 0.5) * Math.PI);
      usualRing.geometry.dispose();
      usualRing.geometry = usualRingGeom;
      
      renderer.render(scene, camera);
    });
    </script>

    PS You also can achieve the same result without re-building a geometry. For that, you can bend a plane in js (changing vertices) or in shaders :)