What’s on our mind?

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


const scene = new THREE.Scene(),
    width = window.innerWidth,
    height = window.innerHeight,
    camera = new THREE.PerspectiveCamera(90, width / height, 0.1, 1000),
    renderer = new THREE.WebGLRenderer(),
    startTime = new Date().getTime(),
    raycaster = new THREE.Raycaster(),
    timeOffset = 15,
    halfPI = Math.PI / 2

var composer, outlinePass;

let currentTime = 0,
    mouse = new THREE.Vector2(0, 0),
    hoverables = [],
    objects = []

// document.body.addEventListener('mousemove', function (e) {
//     let x = (e.clientX / window.innerWidth) * 2 - 1,
//         y = -(e.clientY / window.innerHeight) * 2 + 1;

//     mouse.set(x, y)
//     raycaster.setFromCamera(mouse, camera);

//     let intersects = raycaster.intersectObjects(hoverables)
//     intersects.map(x => {
//         if (!x.object.userData.hovered) {
//             x.object.userData.rotation += Math.PI * 2
//         }
//         x.object.userData.hovered = true
//     })
// })

renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

let CameraHolder = new THREE.Object3D()
CameraHolder.add(camera)
scene.add(CameraHolder)

composer = new THREE.EffectComposer(renderer)

var renderPass = new THREE.RenderPass(scene, camera);
composer.addPass(renderPass);

outlinePass = new THREE.OutlinePass(new THREE.Vector2(window.innerWidth, window.innerHeight), scene, camera);
composer.addPass(outlinePass);

let bloomPass = new THREE.UnrealBloomPass(new THREE.Vector2(width, height), 1.5, .4, .85);
renderer.toneMappingExposure = 1;
bloomPass.threshold = 0;
bloomPass.strength = .5;
bloomPass.radius = 1.5;
composer.addPass(bloomPass);

let filmPass = new THREE.FilmPass(0.34, 0.025, 256, false);
composer.addPass(filmPass);

outlinePass.edgeStrength = 3
outlinePass.edgeThickness = 1
outlinePass.edgeGlow = 0
outlinePass.visibleEdgeColor.set('#ffffff')
outlinePass.hiddenEdgeColor.set('#ffffff')
outlinePass.BlurDirectionX = new THREE.Vector2(0.0, 0.0)
outlinePass.BlurDirectionY = new THREE.Vector2(0.0, 0.0)

let uniforms = {
    camera: {
        value: camera.position
    },
    time: {
        value: 0
    }
}

let length = 3,
    cameraZ = Math.max(width, height) / length

var geometry = new THREE.TorusGeometry(length * .95, length * .35, 25, 50)
var hoverGeom = new THREE.BoxGeometry(length * 2.75, length * 2.75, length)

let material = new THREE.ShaderMaterial({
    uniforms: uniforms,
    fragmentShader: shaders.cloth.fragment,
    vertexShader: shaders.cloth.vertex,
    side: THREE.BackSide
})
const hoverMaterial = new THREE.MeshBasicMaterial({
    color: 0xffff00,
    opacity: 0,
    transparent: true,
});

let xLen = 10,
    yLen = 10

for (var x = 0; x < xLen; x += 1) {
    for (var y = 0; y < yLen; y += 1) {
        var mesh = new THREE.Mesh(geometry, material);
        mesh.position.x = (x - xLen / 2) * 10 + 5
        mesh.position.y = (y - yLen / 2) * 10 + 5
        mesh.userData.delay = (x - y) * -.15
        objects.push(mesh)
        scene.add(mesh)

        var hoverMesh = new THREE.Mesh(hoverGeom, hoverMaterial);
        hoverMesh.position.x = (x - xLen / 2) * 10 + 5
        hoverMesh.position.y = (y - yLen / 2) * 10 + 5
        hoverables.push(hoverMesh)
        scene.add(hoverMesh)
    }
}

camera.position.z = 25
console.log(hoverables)

function animate() {
    var now = new Date().getTime();
    currentTime = (now - startTime) / 1000;
    let t = currentTime + timeOffset;

    CameraHolder.updateMatrixWorld();
    camera.updateMatrixWorld();
    var vector = camera.position.clone();
    vector.applyMatrix4(camera.matrixWorld);

    uniforms.time.value = t;
    uniforms.camera.value = vector;

    camera.position.y = mouse.y
    camera.position.x = mouse.x

    objects.map(x => {
        x.rotation.y = (Math.cos((currentTime * .8) + x.userData.delay)) * halfPI + halfPI
    })
    //console.log(hoverables[0].rotation)

    requestAnimationFrame(animate)
    //renderer.render(scene, camera)
    composer.render()
}
animate();

function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
}

window.addEventListener('resize', onWindowResize, false);