Frontend Development 16 min read

Creating Meta’s 3D Dynamic Logo with Three.js and Blender

This tutorial explains how to recreate Meta’s animated 3D logo by combining Three.js geometry, Blender modeling, FBX loading, custom materials, animation mixers, raycasting for interaction, and progress tracking, providing a complete step‑by‑step guide for web‑based 3D development.

Rare Earth Juejin Tech Community
Rare Earth Juejin Tech Community
Rare Earth Juejin Tech Community
Creating Meta’s 3D Dynamic Logo with Three.js and Blender

Background : Meta (formerly Facebook) has rebranded and entered the Metaverse, and this article demonstrates how to reproduce Meta’s flashy 3D dynamic logo using a Three.js + Blender workflow.

What is the Metaverse : The term originates from Neal Stephenson’s 1992 novel Snow Crash and describes a persistent, shared 3D virtual space that converges with the physical world, powered by technologies such as 5G/6G, Web 3.0, AI, VR/AR/MR, and game engines.

Implementation Effect : An online preview (https://dragonir.github.io/3d-meta-logo) showcases the animated logo; a GIF illustrates the final result.

Development Implementation – Trial 1: THREE.TorusGeometry : Creates a donut‑shaped torus. Key parameters are radius (default 1), tube (default 0.4), radialSegments (default 8), tubularSegments (default 6), and arc (default 2 × π). Example usage: THREE.TorusGeometry(radius, tube, radialSegments, tubularSegments, arc);

Trial 2: THREE.TorusKnotGeometry : Generates a torus knot. Important parameters include radius , tube , radialSegments , tubularSegments , p (twist count), and q (loop count). Example: THREE.TorusKnotGeometry(radius, tube, radialSegments, tubularSegments, p, q);

Trial 3: THREE.TubeGeometry : Extrudes a tube along a 3D spline. Parameters are path (THREE.SplineCurve3), segments , radius , radiusSegments , and closed . Example: new THREE.TubeGeometry(path, segments, radius, radiusSegments, closed);

Trial 4: Blender + Three.js : Because pure geometry could not achieve a perfectly smooth twisted ring, the author modeled the logo in Blender, exported it as an FBX with baked animation, and imported it into the Three.js scene.

Modeling Tutorial : Use Blender to create the logo, export as .fbx with the “Bake Animation” option enabled.

Loading Dependencies : Include the required scripts: <script src="./assets/libs/three.js"></script> <script src="./assets/libs/loaders/FBXLoader.js"></script> <script src="./assets/libs/inflate.min.js"></script> <script src="./assets/libs/OrbitControls.js"></script> <script src="./assets/libs/stats.js"></script>

Scene Initialization : Create container, scene, camera, lights (HemisphereLight, DirectionalLight, AmbientLight), grid helper, WebGLRenderer (antialias, alpha, sRGBEncoding), OrbitControls, and Stats. Example snippet: var container = document.createElement('div'); document.body.appendChild(container); scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight, 0.1, 1000); renderer = new THREE.WebGLRenderer({antialias:true, alpha:true}); renderer.setSize(window.innerWidth, window.innerHeight); container.appendChild(renderer.domElement); controls = new THREE.OrbitControls(camera, renderer.domElement); stats = new Stats(); container.appendChild(stats.dom);

Loading the Logo Model : Use THREE.FBXLoader to load meta.fbx , set its rotation, position, and scale, and add it to the scene. var loader = new THREE.FBXLoader(); loader.load('assets/models/meta.fbx', function(mesh){ mesh.rotation.y = Math.PI/2; mesh.position.set(0,1,0); mesh.scale.set(0.05,0.05,0.05); scene.add(mesh); });

Adding Material : Apply a MeshPhysicalMaterial with a metal texture loaded via THREE.TextureLoader for realistic PBR rendering. var texLoader = new THREE.TextureLoader(); child.material = new THREE.MeshPhysicalMaterial({ map: texLoader.load('./assets/images/metal.png'), metalness: 0.2, roughness: 0.1, exposure: 0.4 });

Adding Animation : For each animation clip in the FBX, create an AnimationMixer , set the clip duration, and play it. Update mixers inside the render loop. loader.load('assets/models/meta.fbx', function(mesh){ mesh.animations.forEach(item => { let mixer = new THREE.AnimationMixer(mesh); let clip = item; clip.duration = 8; mixer.clipAction(clip).play(); mixerArr.push(mixer); }); }); function animate(){ renderer.render(scene,camera); let delta = clock.getDelta(); mixerArr.forEach(m=> m && m.update(delta)); stats.update(); requestAnimationFrame(animate); }

Displaying Loading Progress : Provide a simple HTML overlay with a #progress span and update it in the FBXLoader’s onProgress callback. loader.load('assets/models/meta.fbx', mesh=>{}, res=>{ let progress = (res.loaded/res.total*100).toFixed(0); document.getElementById('progress').innerText = progress + '%'; if(progress=== '100') document.getElementById('loading').style.display='none'; }, err=> console.error(err));

Click to Change Material : Use a THREE.Raycaster to detect clicked objects, then replace their material with a randomly colored MeshStandardMaterial . var raycaster = new THREE.Raycaster(); var mouse = new THREE.Vector2(); function onMouseClick(event){ mouse.x = (event.clientX/window.innerWidth)*2-1; mouse.y = -(event.clientY/window.innerHeight)*2+1; raycaster.setFromCamera(mouse,camera); let intersects = raycaster.intersectObjects(clickableObjects); if(intersects.length>0){ let obj = intersects[0].object; obj.material = new THREE.MeshStandardMaterial({ color: `#${Math.random().toString(16).slice(-6)}`, metalness: Math.random(), roughness: Math.random() }); } } window.addEventListener('click', onMouseClick, false);

Loading a Character Model : The same FBX loading process is used for a Mixamo character, with its own AnimationMixer and progress handling.

Summary of Key Points : THREE.TorusGeometry – creates a torus (ring). THREE.TorusKnotGeometry – creates a torus knot. THREE.TubeGeometry – extrudes a tube along a spline. Blender – used for detailed modeling and FBX export. FBXLoader – loads models and provides progress callbacks. TextureLoader – loads material textures. THREE.AnimationMixer – plays model animations. THREE.Raycaster – enables click interaction.

References : Using three.js to create a cool acid‑style 3D page. Three.js material guide. Three.js animation basics. What is the Metaverse? Full source code: https://github.com/dragonir/3d-meta-logo

animation3D modelingThree.jsWebGLBlenderFBXLoaderRaycaster
Rare Earth Juejin Tech Community
Written by

Rare Earth Juejin Tech Community

Juejin, a tech community that helps developers grow.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.