three.js之元素周期表

three.js之元素周期表


<html>
<head>
<title>three.js css3d - periodic table</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link type="text/css" rel="stylesheet" href="../static/three.js-master/main.css">
<style>
a {
color: #8ff;
}

#menu {
position: absolute;
bottom: 20px;
100%;
text-align: center;
}

.element {
120px;
height: 160px;
box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.5);
border: 1px solid rgba(127, 255, 255, 0.25);
font-family: Helvetica, sans-serif;
text-align: center;
line-height: normal;
cursor: default;
}

.element:hover {
box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.75);
border: 1px solid rgba(127, 255, 255, 0.75);
}

.element .number {
position: absolute;
top: 20px;
right: 20px;
font-size: 12px;
color: rgba(127, 255, 255, 0.75);
}

.element .symbol {
position: absolute;
top: 40px;
left: 0px;
right: 0px;
font-size: 60px;
font-weight: bold;
color: rgba(255, 255, 255, 0.75);
text-shadow: 0 0 10px rgba(0, 255, 255, 0.95);
}

.element .details {
position: absolute;
bottom: 15px;
left: 0px;
right: 0px;
font-size: 12px;
color: rgba(127, 255, 255, 0.75);
}

button {
color: rgba(127, 255, 255, 0.75);
background: transparent;
outline: 1px solid rgba(127, 255, 255, 0.75);
border: 0px;
padding: 5px 10px;
cursor: pointer;
}

button:hover {
background-color: rgba(0, 255, 255, 0.5);
}

button:active {
color: #000000;
background-color: rgba(0, 255, 255, 0.75);
}
</style>
</head>
<body>
<script src="../static/three.js-master/build/three.js"></script>
<script src="../static/three.js-master/examples/js/libs/tween.min.js"></script>
<script src="../static/three.js-master/examples/js/controls/TrackballControls.js"></script>
<script src="../static/three.js-master/examples/js/renderers/CSS3DRenderer.js"></script>

<div , 18, 7
];

var camera, scene, renderer;
var controls;

var objects = [];
var targets = {table: [], sphere: [], helix: [], grid: []};

init();
animate();

function init() {

camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 3000;

scene = new THREE.Scene();

// table

for (var i = 0; i < table.length; i += 5) {

var element = document.createElement('div');
element.className = 'element';
element.style.backgroundColor = 'rgba(0,127,127,' + (Math.random() * 0.5 + 0.25) + ')';

var number = document.createElement('div');
number.className = 'number';
number.textContent = (i / 5) + 1;
element.appendChild(number);

var symbol = document.createElement('div');
symbol.className = 'symbol';
symbol.textContent = table[i];
element.appendChild(symbol);

var details = document.createElement('div');
details.className = 'details';
details.innerHTML = table[i + 1] + '<br>' + table[i + 2];
element.appendChild(details);

var object = new THREE.CSS3DObject(element);
object.position.x = Math.random() * 4000 - 2000;
object.position.y = Math.random() * 4000 - 2000;
object.position.z = Math.random() * 4000 - 2000;
scene.add(object);

objects.push(object);

//

var object = new THREE.Object3D();
object.position.x = (table[i + 3] * 140) - 1330;
object.position.y = -(table[i + 4] * 180) + 990;

targets.table.push(object);

}

// sphere

var vector = new THREE.Vector3();

for (var i = 0, l = objects.length; i < l; i++) {

var phi = Math.acos(-1 + (2 * i) / l);
var theta = Math.sqrt(l * Math.PI) * phi;

var object = new THREE.Object3D();

object.position.setFromSphericalCoords(800, phi, theta);

vector.copy(object.position).multiplyScalar(2);

object.lookAt(vector);

targets.sphere.push(object);

}

// helix

var vector = new THREE.Vector3();

for (var i = 0, l = objects.length; i < l; i++) {

var theta = i * 0.175 + Math.PI;
var y = -(i * 8) + 450;

var object = new THREE.Object3D();

object.position.setFromCylindricalCoords(900, theta, y);

vector.x = object.position.x * 2;
vector.y = object.position.y;
vector.z = object.position.z * 2;

object.lookAt(vector);

targets.helix.push(object);

}

// grid

for (var i = 0; i < objects.length; i++) {

var object = new THREE.Object3D();

object.position.x = ((i % 5) * 400) - 800;
object.position.y = (-(Math.floor(i / 5) % 5) * 400) + 800;
object.position.z = (Math.floor(i / 25)) * 1000 - 2000;

targets.grid.push(object);

}

//

renderer = new THREE.CSS3DRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('container').appendChild(renderer.domElement);

//

controls = new THREE.TrackballControls(camera, renderer.domElement);
controls.minDistance = 500;
controls.maxDistance = 6000;
controls.addEventListener('change', render);

var button = document.getElementById('table');
button.addEventListener('click', function () {

transform(targets.table, 2000);

}, false);

var button = document.getElementById('sphere');
button.addEventListener('click', function () {

transform(targets.sphere, 2000);

}, false);

var button = document.getElementById('helix');
button.addEventListener('click', function () {

transform(targets.helix, 2000);

}, false);

var button = document.getElementById('grid');
button.addEventListener('click', function () {

transform(targets.grid, 2000);

}, false);

transform(targets.table, 2000);

//

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

}

function transform(targets, duration) {

TWEEN.removeAll();

for (var i = 0; i < objects.length; i++) {

var object = objects[i];
var target = targets[i];

new TWEEN.Tween(object.position)
.to({
x: target.position.x,
y: target.position.y,
z: target.position.z
}, Math.random() * duration + duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();

new TWEEN.Tween(object.rotation)
.to({
x: target.rotation.x,
y: target.rotation.y,
z: target.rotation.z
}, Math.random() * duration + duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();

}

new TWEEN.Tween(this)
.to({}, duration * 2)
.onUpdate(render)
.start();

}

function onWindowResize() {

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

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

render();

}

function animate() {

requestAnimationFrame(animate);

TWEEN.update();

controls.update();

}

function render() {

renderer.render(scene, camera);

}

</script>


</body>
</html>

body {
    margin: 0;
    background-color: #000;
    color: #fff;
    font-family: Monospace;
    font-size: 13px;
    line-height: 24px;
}

a {
    color: #ff0;
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}

button {
    cursor: pointer;
    text-transform: uppercase;
}

canvas {
    display: block;
}

#info {
    position: absolute;
    top: 0px;
     100%;
    padding: 10px;
    box-sizing: border-box;
    text-align: center;
    z-index: 1; /* TODO Solve this in HTML */
}

.dg.ac {
    z-index: 2 !important; /* TODO Solve this in HTML */
}
main.css

附带three.js代码,点击下载

附带tween.min.js,点击下载

附带TrackballControls.js,点击下载

附带CSS3DRenderer.js,点击下载

three.js之元素周期表