What’s on our mind?

Collection of articles, design, site, and resources made by designers and publisher @Menu View

index58
let scene,
    camera,
    renderer,
    orbitControls,
    sphereMesh,
    simplexNoiseArr;

const simplexNoise = new SimplexNoise();

const render = () => {
    let timeStamp = Date.now() * 0.01;

    sphereMesh.material.uniforms.textureAmplitude.value = Math.sin(timeStamp * 0.01) + Math.sin(timeStamp * 0.01);
    sphereMesh.material.uniforms.color.value.offsetHSL(0.001, 0, 0);

    const position = sphereMesh.geometry.attributes.position.array;
    const displacement = sphereMesh.geometry.attributes.displacement.array;

    for (let i = 0; i < position.length; i += 3) {
        simplexNoiseArr[i] = Math.sin(timeStamp * 0.05) * 16 * simplexNoise.noise3D(position[i] +
            timeStamp * 0.08, position[i + 1] + timeStamp * 0.09, position[i + 2] + timeStamp * 0.084);
    }

    for (let i = 0; i < displacement.length; i++) {
        displacement[i] = Math.sin(timeStamp + i * 0.1) * Math.sin(timeStamp * 0.01) * 5;
        displacement[i] += simplexNoiseArr[i];
    }

    sphereMesh.geometry.attributes.displacement.needsUpdate = true;

    orbitControls.update();
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

const onResize = () => {
    const width = window.innerWidth;
    const height = window.innerHeight;
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(width, height);
    camera.aspect = width / height;
    camera.updateProjectionMatrix();
}

const getTexture = () => {
    const canvas = document.createElement('canvas');
    canvas.width = 512;
    canvas.height = 512;
    const ctx = canvas.getContext('2d');
    const imgDataObj = ctx.getImageData(0, 0, canvas.width, canvas.height);
    const data = imgDataObj.data;
    let yOffset = 0;
    for (let y = 0; y < canvas.height; y++) {
        let xOffset = 0;
        for (let x = 0; x < canvas.width; x++) {
            const index = (x + y * canvas.width) * 4;
            const c = 255 * simplexNoise.noise2D(xOffset, yOffset) + 255;
            data[index] = c;
            data[index + 1] = c;
            data[index + 2] = c;
            data[index + 3] = 255;
            xOffset += 0.04;
        }
        yOffset += 0.04;
    }
    ctx.putImageData(imgDataObj, 0, 0);
    document.body.appendChild(canvas);
    texture = new THREE.Texture(canvas);
    texture.needsUpdate = true;
    return texture;
}

function init() {
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
    scene.add(camera);
    camera.position.x = 0;
    camera.position.y = 0;
    camera.position.z = 340;
    camera.lookAt(scene.position);

    renderer = new THREE.WebGLRenderer({
        canvas: document.getElementById('WebGL'),
        antialias: true,
        alpha: true
    });
    renderer.setClearColor(new THREE.Color(0x000000));
    renderer.setSize(window.innerWidth, window.innerHeight);

    /* OrbitControls */
    orbitControls = new THREE.OrbitControls(camera);
    orbitControls.autoRotate = false;

    /* Mesh */
    const sphereBufferGeometry = new THREE.SphereBufferGeometry(100, 128, 64);
    const positionNum = sphereBufferGeometry.attributes.position.count;
    simplexNoiseArr = new Float32Array(sphereBufferGeometry.attributes.position.count);
    sphereBufferGeometry.addAttribute('displacement', new THREE.BufferAttribute(new Float32Array(positionNum),
        1));

    const shaderMaterial = new THREE.ShaderMaterial({
        uniforms: {
            color: {
                type: 'c',
                value: new THREE.Color(0x0aa0f0)
            },
            texture: {
                type: 't',
                value: getTexture()
            },
            textureAmplitude: {
                type: 'f',
                value: 1.0
            }
        },
        transparent: true,
        depthWrite: false,
        blending: THREE.AdditiveBlending,
        vertexShader: document.getElementById('vs').textContent,
        fragmentShader: document.getElementById('fs').textContent
    });
    shaderMaterial.uniforms.texture.value.wrapS = THREE.RepeatWrapping;
    shaderMaterial.uniforms.texture.value.wrapT = THREE.RepeatWrapping;
    sphereMesh = new THREE.Mesh(sphereBufferGeometry, shaderMaterial);
    scene.add(sphereMesh);

    /* OrbitControls */
    orbitControls = new THREE.OrbitControls(camera, renderer.domElement);
    orbitControls.autoRotate = false;
    orbitControls.enableDamping = true;
    orbitControls.dampingFactor = 0.15;

    /* resize */
    window.addEventListener('resize', onResize);

    /* rendering start */
    render();
}

window.onload = init;