A simple Three JS powered globe used in an activation in support of Metronomy's new album "Small World." Full dev blog here: https://medium.com/p/c870b93c6afc
A Pen by ✠ Aragua ✠ 🇧🇷 on CodePen.
A simple Three JS powered globe used in an activation in support of Metronomy's new album "Small World." Full dev blog here: https://medium.com/p/c870b93c6afc
A Pen by ✠ Aragua ✠ 🇧🇷 on CodePen.
<template> | |
<div> | |
<!-- Small World --> | |
</div> | |
</template> | |
<script> | |
export default{ | |
methods: { | |
initializeThree() { | |
// Base | |
// ---------- | |
// Initialize scene | |
const scene = new THREE.Scene() | |
// Initialize camera | |
const camera = new THREE.PerspectiveCamera(30, window.innerWidth / window.innerHeight, 0.1, 60) | |
// Reposition camera | |
camera.position.set(6, 0, 0) | |
// Initialize renderer | |
const renderer = new THREE.WebGLRenderer({ | |
alpha: true, | |
antialias: true | |
}) | |
// Set renderer size | |
renderer.setSize(window.innerWidth, window.innerHeight) | |
// Append renderer to body | |
document.body.appendChild(renderer.domElement) | |
// Initialize controls | |
const controls = new THREE.OrbitControls(camera, renderer.domElement) | |
// World | |
// ---------- | |
// Load world texture | |
const worldTexture = new THREE.TextureLoader().load("https://assets.codepen.io/141041/small-world.jpg") | |
// Initialize world geometry | |
const worldGeometry = new THREE.SphereGeometry(1, 40, 40) | |
// Initialize world material | |
const worldMaterial = new THREE.MeshBasicMaterial({ | |
map: worldTexture | |
}) | |
// Initialize world | |
const world = new THREE.Mesh(worldGeometry, worldMaterial) | |
// Add earth to scene | |
scene.add(world) | |
// Clouds | |
// ---------- | |
// Load clouds texture | |
const cloudTexture = new THREE.TextureLoader().load("https://assets.codepen.io/141041/small-world-clouds.png") | |
// Initialize clouds geometry | |
const cloudGeometry = new THREE.SphereGeometry(1.01, 40, 40) | |
// Initialize clouds material | |
const cloudMaterial = new THREE.MeshBasicMaterial({ | |
map: cloudTexture, | |
transparent: true | |
}) | |
// Initialize clouds | |
const clouds = new THREE.Mesh(cloudGeometry, cloudMaterial) | |
// Add clouds to scene | |
scene.add(clouds) | |
// Animation | |
// ---------- | |
// Prepare animation loop | |
function animate() { | |
// Request animation frame | |
requestAnimationFrame(animate) | |
// Rotate world | |
world.rotation.y += 0.0005 | |
// Rotate clouds | |
clouds.rotation.y -= 0.001 | |
// Render scene | |
renderer.render(scene, camera) | |
} | |
// Animate | |
animate() | |
// Resize | |
// ---------- | |
// Listen for window resizing | |
window.addEventListener('resize', () => { | |
// Update camera aspect | |
camera.aspect = window.innerWidth / window.innerHeight | |
// Update camera projection matrix | |
camera.updateProjectionMatrix() | |
// Resize renderer | |
renderer.setSize(window.innerWidth, window.innerHeight) | |
}) | |
} | |
}, | |
mounted() { | |
// Initialize three | |
this.initializeThree() | |
} | |
} | |
</script> | |
<style> | |
body{ | |
background: radial-gradient(circle at center, white, rgba(113,129,191,0.5) 50%); | |
} | |
</style> |
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> | |
<script src="https://assets.codepen.io/141041/OrbitControls.js"></script> |
cool