3D på nettet med Three.js: en koselig krok i én HTML-fil
Legg ekte 3D-modeller på en nettside med noen få linjer JavaScript. En nybegynnervennlig Three.js-veiledning med fullstendig kode.
På denne siden
En roterende 3D-modell på en landingsside fanger oppmerksomheten på en måte et flatt bilde ikke kan. Den gode nyheten: GLB er det opprinnelige formatet i 3D-verdenen på nettet, så det krever overraskende lite kode å vise modellene våre i en nettleser.
I denne veiledningen bygger vi en liten interaktiv scene med Three.js: en lesekrok med Lenestol i tre, Bordlampe i keramikk, Nattbord i eik og Fiolinfiken i kurv.
Dette trenger du
GLB-filene til modellene, lagt i en models-mappe ved siden av HTML-filen.
En lokal webserver. Nettlesere blokkerer innlasting av filer direkte fra disken, så kjør for eksempel npx serve eller Live Server-utvidelsen i VS Code.
Ingen byggeverktøy: Vi laster Three.js fra et CDN ved hjelp av et import map.
Hele koden
Opprett index.html med dette innholdet:
<!doctype html>
<html>
<head>
<style>body { margin: 0; background: #f3efe8; }</style>
<script type="importmap">
{ "imports": {
"three": "https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/"
} }
</script>
</head>
<body>
<script type="module">
import * as THREE from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(innerWidth, innerHeight);
renderer.setPixelRatio(devicePixelRatio);
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
scene.background = new THREE.Color('#f3efe8');
const pmrem = new THREE.PMREMGenerator(renderer);
scene.environment = pmrem.fromScene(new RoomEnvironment()).texture;
const camera = new THREE.PerspectiveCamera(40, innerWidth / innerHeight, 0.1, 100);
camera.position.set(2.5, 1.6, 3);
const controls = new OrbitControls(camera, renderer.domElement);
controls.target.set(0, 0.6, 0);
controls.enableDamping = true;
const loader = new GLTFLoader();
const place = (file, x, z, rotY = 0) =>
loader.load('models/' + file, (gltf) => {
gltf.scene.position.set(x, 0, z);
gltf.scene.rotation.y = rotY;
scene.add(gltf.scene);
});
place('wooden-armchair.glb', 0, 0, 0.4);
place('oak-bedside-table.glb', 0.9, -0.2);
place('ceramic-table-lamp.glb', 0.9, -0.2);
place('fiddle-leaf-fig.glb', -0.9, -0.4);
renderer.setAnimationLoop(() => { controls.update(); renderer.render(scene, camera); });
addEventListener('resize', () => {
camera.aspect = innerWidth / innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
});
</script>
</body>
</html>
Gi de nedlastede filene nytt navn slik at de samsvarer med navnene i koden, eller endre navnene i koden. Start den lokale serveren og åpne siden. Du kan rotere scenen med musen og zoome med rullehjulet.
Hva koden gjør
Renderer og scene. Vi lager en WebGL-renderer som fyller vinduet, og en scene med varm bakgrunnsfarge.
Miljølys. RoomEnvironment genererer et mykt, studiolignende lysmiljø. PBR-materialer trenger et miljø å reflektere, og denne ene linjen gir modellene våre troverdige refleksjoner uten å laste inn en HDRI.
Kamera og kontroller. Et perspektivkamera ser mot kroken, og OrbitControls lar besøkende rotere og zoome. Demping (damping) gjør bevegelsen myk.
Innlasting av modeller. GLTFLoader leser hver GLB-fil, inkludert materialer og teksturer, og gir oss et sceneobjekt vi kan plassere og rotere. Modellene våre bruker virkelig skala i meter og har origo i bunnen, så å plassere dem på gulvet er bare y = 0.
Tips til plassering
Stable objekter. Lampen må stå oppå bordet. Hev den med bordets høyde: Erstatt 0 med bordhøyden i posisjonslinjen, eller beregn den med new THREE.Box3().setFromObject(table).
Rotasjon. rotation.y er i radianer: Math.PI / 2 snur en modell 90 grader.
Skala. Alle modellene våre har samme skala, så du skal ikke trenge å skalere noe.
Gjør den klar for produksjon
Skygger. Legg til et DirectionalLight med castShadow = true og sett castShadow på modellenes nett, så står objektene støtt på bakken.
Lasteskjerm. Bruk THREE.LoadingManager til å vise fremdriften mens modellene lastes ned.
Komprimering. For store scener kan verktøy som gltf-transform komprimere geometri og teksturer ytterligere. Å konvertere filer til ditt eget prosjekt er tillatt etter lisensen vår.
Enklere alternativ. Trenger du bare én modell med rotering og zoom, viser Googles webkomponent model-viewer en GLB-fil med én enkelt HTML-tagg.
Din tur
Bytt ut lesekroken med et kjøkken, et lekerom eller en bitteliten landsby. Hver modell i butikken er en GLB-fil som fungerer med akkurat denne koden.
Modeller fra denne artikkelen
Alle modeller →Les videre
Håndplukkede artikler fra samme tema.
Polygonantall: hvor mange trekanter trenger du egentlig?
5 000 trekanter eller 60 000? En praktisk guide til å lese polygonantall og velge modeller som passer budsjettet i prosjektet ditt.
LesBruk 3dpolyx-modeller i Unity og Unreal Engine
GLB er ikke bare for Blender og nettet. Slik henter du modellene våre inn i de to største spillmotorene.
LesImporter en GLB-fil i Blender på to minutter
Fra nedlasting til første render: slik henter du en GLB-modell inn i Blender, sjekker at alt er på plass og begynner å bygge scenen din.
Les