JSFiddle - React, Tailwind, and code Playground
CSS
body{
overflow: hidden;
margin: 0;
}
JavaScript
import * as THREE from 'https://threejs.org/build/three.module.js';
import { GUI } from 'https://threejs.org/examples/jsm/libs/dat.gui.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';
let camera, scene, renderer, material, uniforms;
const params = {
minAngle: - 90,
maxAngle: 90,
};
let clock = new THREE.Clock();
init();
renderer.setAnimationLoop(render);
function init() {
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.localClippingEnabled = true;
document.body.appendChild( renderer.domElement );
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 200 );
camera.position.set( - 3.0, 2.5, 3.0 ).multiplyScalar(10);
const controls = new OrbitControls( camera, renderer.domElement );
controls.enablePan = false;
const light = new THREE.DirectionalLight( 0xffffff, 1.5 );
light.position.set( - 1.25, 1, 1.25 );
scene.add( light );
const amb = new THREE.AmbientLight( 0xffffff, 0.25 );
scene.add( amb );
const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );
geometry.rotateX(Math.PI * -0.5);
geometry.rotateY(Math.PI * -0.5);
uniforms = {
minAngle: {value: 0.0},
maxAngle: {value: 0.0}
};
material = new THREE.MeshLambertMaterial( {
side: THREE.DoubleSide,
color: 'red',
onBeforeCompile: shader => {
Object.assign(shader.uniforms, uniforms);
shader.vertexShader = `
varying vec4 _worldPos;
${shader.vertexShader}
`.replace(
`#include <worldpos_vertex>`,
`
#include <worldpos_vertex>
_worldPos = modelMatrix * vec4( transformed, 1.0 );
`
);
shader.fragmentShader = `
varying vec4 _worldPos;
uniform float minAngle;
...