What’s on our mind?

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

* index31
var camera;
var scene;
var renderer;
var mouseX = 0;
var mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
var minX = -500;
var maxX = 500;
var minY = -500;
var maxY = 500;
var minZ = -40;
var maxZ = 40;
var minNodeDistance = 90;
var numNodes = 300;
var nodes = [];
var lines = [];
var moveAmplitude = 50;
var lightColors = [
    0xffffff,
    0xff0000,
    0xff00ff,
    0x0000ff
];

init();
animate();

function init() {
    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.z = 400;

    scene = new THREE.Scene();

    while (numNodes--) {
        var geometry = new THREE.CircleGeometry(5, 16);
        var material = new THREE.MeshPhongMaterial({
            color: 0x00ff00,
            specular: 0x00ff00,
            shininess: 30,
            shading: THREE.SmoothShading
        });
        var nodeMesh = new THREE.Mesh(geometry, material);
        nodeMesh.position.x = getNumberInRange(minX, maxX);
        nodeMesh.position.y = getNumberInRange(minY, maxY);
        nodeMesh.position.z = getNumberInRange(minZ, maxZ);
        nodeMesh.numConnections = 0;
        nodeMesh.moveIterationCount = 0;
        nodeMesh.movePeriod = (Math.random() * 200) + 300;
        nodeMesh.lines = {
            start: {
                lines: [],
                lineGeometry: []
            },
            end: {
                lines: [],
                lineGeometry: []
            },
        };
        scene.add(nodeMesh);
        nodes.push(nodeMesh);
    }

    _.each(nodes, function (node) {
        if (node.numConnections > 10) return false;

        _.each(nodes, function (otherNode) {
            var start = new THREE.Vector3(node.position.x, node.position.y, node.position.z);
            var end = new THREE.Vector3(otherNode.position.x, otherNode.position.y, otherNode
                .position.z);
            var distance = start.distanceTo(end);

            if (otherNode.numConnections > 10) return false;

            if (distance < minNodeDistance) {
                var geometry = new THREE.Geometry();
                geometry.vertices.push(
                    start,
                    end
                );
                var material = new THREE.MeshPhongMaterial({
                    color: 0xffffff,
                    specular: 0xffffff,
                    shininess: 10,
                    shading: THREE.SmoothShading
                });
                var line = new THREE.Line(geometry, material);
                scene.add(line);
                lines.push(line);

                node.lines.start.lines.push(line);
                node.lines.start.lineGeometry.push(geometry);
                otherNode.lines.end.lines.push(line);
                otherNode.lines.end.lineGeometry.push(geometry);
            }
        });
    });

    // 조명 설정
    scene.add(new THREE.AmbientLight(0x002222));

    _.each(lightColors, function (color) {
        var directionalLight = new THREE.DirectionalLight(color, 0.1);
        directionalLight.position.x = getNumberInRange(0, 1);
        directionalLight.position.y = getNumberInRange(0, 1);
        directionalLight.position.z = 1;
        directionalLight.position.normalize();
        scene.add(directionalLight);
    });

    // 컨트롤 설정
    document.addEventListener('mousemove', onDocumentMouseMove, false);
    document.addEventListener('touchstart', onDocumentTouchStart, false);
    document.addEventListener('touchmove', onDocumentTouchMove, false);

    // 렌더링 설정
    renderer = new THREE.WebGLRenderer();
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // 리사이즈 설정
    window.addEventListener('resize', onWindowResize, false);
}

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

function onWindowResize() {
    windowHalfX = window.innerWidth / 2;
    windowHalfY = window.innerHeight / 2;

    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth, window.innerHeight);
}

function updateCamera() {
    camera.position.x += (mouseX - camera.position.x) * .05;
    camera.position.y += (-mouseY - camera.position.y) * .05;
    camera.lookAt(scene.position);
}

function onDocumentMouseMove(event) {
    mouseX = event.clientX - windowHalfX;
    mouseY = event.clientY - windowHalfY;
}

function getNumberInRange(min, max) {
    return Math.random() * (max + Math.abs(min)) - Math.abs(min);
}

function onDocumentTouchStart(event) {
    if (event.touches.length > 1) {

        event.preventDefault();

        mouseX = event.touches[0].pageX - windowHalfX;
        mouseY = event.touches[0].pageY - windowHalfY;
    }
}

function onDocumentTouchMove(event) {
    if (event.touches.length == 1) {

        event.preventDefault();

        mouseX = event.touches[0].pageX - windowHalfX;
        mouseY = event.touches[0].pageY - windowHalfY;
    }
}

function animate() {
    requestAnimationFrame(animate);

    _.each(nodes, function (node) {
        node.quaternion.copy(camera.quaternion);
        node.position.z = moveAmplitude * Math.cos((Math.PI * 2) * node.moveIterationCount / node
            .movePeriod);

        _.each([node.lines.start, node.lines.end], function (lineSet, idx) {
            _.each(lineSet.lines, function (line, lineIdx) {
                var lineGeometry = lineSet.lineGeometry[lineIdx];
                lineGeometry.vertices[idx].z = node.position.z;
                line.geometry.verticesNeedUpdate = true;
            });
        });

        node.moveIterationCount++;
    });

    updateCamera();

    renderer.render(scene, camera);
}