What’s on our mind?

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

index83
let camera, glScene, glRenderer, composer

let angle = 0,
    speed = 0.03,
    radius = 1,
    numLights = 10,
    slice = Math.PI * 2 / numLights,
    lights = [];

let coreData = {
    radius: 0.8,
    detail: 1
};

let lightData = {
    radius: 0.05,
    intensity: 1
}

let isMouseMoving = false

function createGlRenderer() {
    let glRenderer = new THREE.WebGLRenderer({antialias: true})

    glRenderer.setSize(window.innerWidth, window.innerHeight)
    glRenderer.setPixelRatio(window.devicePixelRatio)
    glRenderer.setClearColor('#222222')

    return glRenderer
}

function initialize() {
    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
    camera.position.z = 3;

    glRenderer = createGlRenderer()
    document.body.appendChild(glRenderer.domElement)

    glScene = new THREE.Scene()

    var coreGeom = new THREE.IcosahedronGeometry(coreData.radius, coreData.detail);
    var coreMat = new THREE.MeshPhongMaterial({
        flatShading: true
    });
    var core = new THREE.Mesh(coreGeom, coreMat);
    core.name = 'core';
    glScene.add(core);

    var lightsRing = new THREE.Object3D();
    lightsRing.name = 'lightsRing';
    glScene.add(lightsRing);

    for (let i = 0; i < numLights; i++) {
        let color = new THREE.Color(Math.random(), Math.random(), Math.random());
        let posx = Math.cos(slice * i) * radius;
        let posy = Math.sin(slice * i) * radius;

        let light = getPointLightObject(posx, posy, 0, lightData.radius, color);
        lights.push(light);
        lightsRing.add(light);
    }

    var directional = [];
    directional[0] = new THREE.DirectionalLight(0xffffff, 0.1);
    directional[0].position.set(1, 0, 0);
    directional[1] = new THREE.DirectionalLight(0xffffff, 0.1);
    directional[1].position.set(0.75, 1, 0.5);
    directional[2] = new THREE.DirectionalLight(0xffffff, 0.1);
    directional[2].position.set(-0.75, -1, 0.5);

    glScene.add(directional[0]);
    glScene.add(directional[1]);
    glScene.add(directional[2]);

    update()
}

function update() {
    glRenderer.render(glScene, camera);

    var lightsRing = glScene.getObjectByName('lightsRing');
    lightsRing.rotation.x += speed;
    lightsRing.rotation.y += speed;
    lightsRing.rotation.z += speed;

    var core = glScene.getObjectByName('core');
    core.rotation.x += .0002;
    core.rotation.y += .0001;
    core.rotation.z += .0001;

    window.requestAnimationFrame(update)
}

window.addEventListener('resize', () => {
    let width = window.innerWidth
    let height = window.innerHeight
    glRenderer.setSize(width, height)
    camera.aspect = width / height
    camera.updateProjectionMatrix()
})

window.addEventListener('mousemove', () => {
    isMouseMoving = true
});

window.addEventListener('DOMContentLoaded', initialize, false)

function getLightObject(x, y, z, color) {
    var light = new THREE.PointLight(
        color,
        lightData.intensity
    );
    light.position.x = x;
    light.position.y = y;
    return light;
}

function getSphereObject(radius, color) {
    var geom = new THREE.SphereGeometry(radius, 30, 30);
    var mat = new THREE.MeshBasicMaterial({
        color: color
    });
    var sphere = new THREE.Mesh(geom, mat);
    return sphere;
}

function getPointLightObject(x, y, z, radius, color) {
    var light = getLightObject(x, y, z, color);
    var point = getSphereObject(radius, color);

    light.add(point);
    return light;
}

function updateGroupGeometry(mesh, geometry) {
    mesh.geometry.dispose();
    mesh.geometry = geometry;
}