JSFiddle - React, Tailwind, and code Playground
CSS
body {
margin: 0;
}
canvas {
display: block;
}
JavaScript
import * as THREE from 'https://unpkg.com/three/build/three.module.js'
let camera, scene, renderer;
let geometry, material, mesh, mesh2;
init();
animate();
function init() {
camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
camera.position.z = 4;
scene = new THREE.Scene();
geometry = new THREE.SphereBufferGeometry( 1.2, 11, 8 );
material = new THREE.MeshBasicMaterial( { color: 'green', wireframe: true } );
var wire = new THREE.Mesh( geometry, material );
wire.scale.setScalar( 1.01 );
material = new THREE.ShaderMaterial( {
vertexShader: `
varying vec3 eye;
varying vec3 pos;
void main () {
vec4 mvp = modelViewMatrix * vec4 (position, 1.0);
pos = position;
eye = vec3(mvp) * normalMatrix;
gl_Position = projectionMatrix * mvp;
}
`,
fragmentShader: `
// https://www.shadertoy.com/view/XsdXRs
#define BOUNDING_RADIUS 1.1
#define COLOR1 vec3(1.0, 0.5, 0.1)
#define COLOR2 vec3(0.5, 0.1, 0.0)
float mandelbulb(vec3 pos){
vec3 w = pos;
float dr = 1.0,r;
vec3 p,p2,p4;
float k1,k2,k3,k4,k5;
for (int i = 0; i < 10; i++){
r = dot(w, w);
if (r > 4.0) break;
dr = pow(r, 3.5)*8.0*dr + 1.0;
p = w;
p2 = w * w;
p4 = p2 * p2;
k3 = p2.x + p2.z;
k2 = inversesqrt( k3*k3*k3*k3*k3*k3*k3 );
k1 = dot(p4, vec3(1)) - 6.0 * dot(p2, vec3(p2.y, p2.z, -p2.x / 3.0));
k4 = dot(p2, vec3(1, -1, 1));
k5 = 8.0*p.y*k4*k1*k2;
w = pos + vec3(8.0*k5*p.x*p.z*(p2.x-p2.z)*(p4.x-6.0*p2.x*p2.z+p4.z),
-16.0*p2.y*k3*k4*k4 + k1*k1,
-k5*(p4.x*p4.x - 28.0*p4.x*p2.x*p2.z +
70.0*p4.x*p4.z - 28.0*p2.x*p2.z*p4.z + p4.z*p4.z));
}
return log(r)*sqrt(r)/dr;
}
float dist(vec3 p) {
return 0.385*mandelbulb(p);
}
bool...