En Noobs guide til Three.js

Webens kompleksitet skifter daglig og dets muligheter vokser like raskt; spesielt med 3D-rendering. WebGL (Web Graphics Library) er en JavaScript API for å gjengi interaktiv 3D og 2D grafikk. Three.js av Ricardo Cabello er et bibliotek bygget på toppen av WebGL, noe som sikrer at forfatterkode er kompatibel over ulike nettlesere. 

Three.js er for WebGL hva jQuery er for JavaScript, og tilbyr declarative syntax elsket av så mange, og abstraherer hodepine for 3D i nettleseren. La oss se gjennom det, få en generell oversikt over syntaks og se hvordan du kommer i gang hvis du er ny i spillet 3D.

Hva jobber vi med

Ta en titt på følgende demonstrasjon på CodePen; bruk musepekeren til å dra modellen rundt, zoome inn og ut med mushjulet.

1. Stille inn scenen

Vi skal jobbe i CodePen for enkelhets skyld. begynn med å koble til Three.js (CDN 126Kb) fra JS-fanen din.

Vi begynner med å lage en scene, akkurat som du starter med et lerret i Photoshop. En scene er definert med en variabel før noen ytterligere kode er skrevet. Så, legg til i JS-panelet ditt:

var scene = nytt THREE.Scene ();

Kamera!

Med gardinene oppe og klare for vår ytelse, trenger vi en måte å se vår awesomeness-tid for å introdusere et kamera. Det finnes en rekke kameraer som Three.js kommer med, for eksempel PerspectiveCamera, StereoCamera, OrthographicCamera og CubeCamera. For våre formål bruker vi PerspectiveCamera som den er designet for å etterligne måten det menneskelige øye ser. Akkurat som vi definerer en scene med en variabel, gjør vi det samme for å definere et kamera:

var kamera = nytt THREE.PerspectiveCamera ();

Vår PerspectiveCamera godtar fire argumenter: FOV, aspektet, nær og langt

  • De FOV (synsfelt) er hvor mye du kan se rundt kameraets senter. Tenk på en vidvinkelobjektiv på et kamera i forhold til en standard linse. 
  • De aspektet er forholdet mellom FOV, eller med andre ord bredden til høyden på en skjerm (for eksempel 4: 5, 16: 9). 
  • De to siste, nær og langt, er planetene av et solidt. Sammen kontrollerer de om et objekt blir gjengitt basert på avstanden fra kameraet. nær er det nærmeste et objekt eller en del av et objekt kan være til kameraet mens det fremdeles blir gjort, langt er det lengste som en gjenstand kan være fra kameraet og fortsatt bli gjengitt. Sammen definerer disse kameraets visningsfrø.
Ser frustum

Her er et eksempel på PerspectiveCamera argumenter:

var kamera = nytt THREE.PerspectiveCamera (75, window.innerWidth / window.innerHeight, 0,1, 1000);

Det er ikke viktig å forstå hver verdi på dette punktet, bortsett fra å være klar over verdiene som kan bli bestått. Ved å fortsette må vi sette kameraets posisjon.

camera.position.set (x, y, z);

Denne linjen er objektets lokale posisjon. Dette setter x, y og z koordinatene til vektoren. Uten det vil kameraet ikke se noe.

2. WebGLRenderer

Den neste viktige ingrediensen i oppskriften vår er å skape en WebGLRenderer. Dette er stykket som er ansvarlig for magien til å vise skapelsen.

var renderer = nytt THREE.WebGLRenderer ();

De WebGLRenderer kan også akseptere egenskaper og verdier som er sendt inn som et objekt.

var renderer = nytt THREE.WebGLRenderer (ala: true // fjern lerret 'bg farge);

Det er ganske mange Eiendomsverdi par som kan brukes - de er oppført i dokumentene, bør du bestemme deg for å dykke dypere på et senere tidspunkt (noe jeg oppfordrer sterkt).

Med gjengivelsen definert kan vi sette metoder for å tilpasse vår opprettelse som for eksempel setSize; en metode du vil bruke i nesten hvert Three.js prosjekt.

// Lag scene renderer størrelsen på skjermen renderer.setSize (window.innerWidth, window.innerHeight);

Det er mange flere metoder du kan bruke, men for vårt formål vil vi holde oss til setSize ()

3. DOM

Nå som vår ønskede størrelse er definert, trenger vi en måte å knytte den til DOM.

document.body.appendChild (renderer.domElement);

Dette domElement eiendom er hvor rendereren trekker sin produksjon og vil være i form av a lerret element. Selv om jeg bruker document.body du kan legge til eller prepend den lerret element hvor du vil. Det er virkelig opp til deg hvor du ønsker plasseringen basert på dine spesifikke prosjektbehov.

Opprette et objekt

For neste trinn må vi lage et objekt - siden alt vi har gjort opp til dette punktet, erklærer en scene, et kamera og en renderer. For demoformål tar vi en mobiltelefon fra 3D Warehouse, slik at vi kan bygge en produktforhåndsvisning for folk som kjøper en iPhone på nettet.

iPhone 6 + av Jeremie P

Vanligvis kan du bruke programmer som SketchUp eller Blender til å tegne 3D-objekter, men det er en høy læringskurve for 3D tegneapplikasjoner - en kurve som absolutt er utenfor rammen av denne artikkelen..

Hvis du liker Piña Collada

For å sette inn vårt 3D-objekt til scenen må vi bruke ColladaLoader. Det skal nevnes at en grafikk du bestemmer deg for å bruke, skal generelt være under 1-2Mb og må være en Collada-fil for å kunne brukes med Three.js: disse er filer som slutter med .dae forlengelse. Hvis du åpner en Collada-fil, ser du at den faktisk er skrevet i XML.

Vi starter med å definere ColladaLoader bruker en variabel og kaller metoden sammen med å definere en annen variabel for å representere 3D-grafikken for referanse på et senere tidspunkt.

var dager, // grafisk laster = nytt THREE.ColladaLoader (); // loader

Dette er en god start, men vi har litt mer arbeid å gjøre for at vi skal kunne vise telefonen. La oss lage en funksjon som vil gjøre nettopp det:

funksjon loadCollada (collada) dager = collada.scene; scene.add (dae); 

For neste trinn bruker vi laste metode, send URL til vår Collada-fil, og ring deretter vår funksjon etter navn som det andre argumentet:

loader.load ('http://myurl.com/file/iphone6.dae', loadCollada);

Hvis du vil vite mer om ColladaLoader Du kan grave gjennom kildekoden på GitHub.

4. Render Loop

Med vår laster og grafikk endelig på plass er det et siste skritt; vi trenger å lage det som kalles en "render loop". Dette skyldes at vi ikke faktisk gjør noe enda.

Denne "render loop" er det som vil føre til at rendereren trekker scenen seksti ganger per sekund. Følgende funksjon vil gjøre vår etablering levende (den beste delen av hele prosessen).

funksjon renderPhone () requestAnimationFrame (renderPhone); renderer.render (scene, kamera);  renderPhone ();

requestAnimationFrame har en rekke fordeler. Det viktigste er at det pause når brukeren navigerer til en annen nettleserfane, og slipper ikke å bruke prosessorkraft og batterilevetid.

Sluttprodukt

Resultatet av alt dette arbeidet er en søt gjengivelse av en 3D iPhone som du kan snurre, rotere og zoome inn og ut av:

Det er noen flere biter som gikk inn i den endelige opprettelsen, så jeg oppfordrer deg til å dykke dypere inn i JavaScript-panelet i demoen.

For eksempel; Belysning (Omgivelseslys, HemisphereLight, PointLight), TrackballControlsAxisHelper og et vindu for omforming av vinduer. Noen av disse nevnte elementer inneholder ikke dokumentasjon som TrackballControls, men du finner alle egenskapene som er tilgjengelige i kjernen JS-filen på GitHub. Det finnes andre veldig kule kontroller du kan bruke, som også er oppført på GitHub.

Inspirasjon

Noen ganger trenger du litt inspirasjon for å få "ol hjernen til å brenne ideer i et raskt tempo. Følgende er noen av mine favorittdemoer ved hjelp av Three.js som gjør drømmer til virkelighet. 

https://paperplanes.worldhttps://throughthedark.withgoogle.com (ta tak i hodetelefonene dine)http://carvisualizer.plus360degrees.com/threejs

Videre lesning

Rachel Smith skrev en god artikkel om CodePen om WebGL, og jeg anbefaler på det sterkeste å gi det en lesning når du har fritid. Opplæringen er fylt med enkelt språk og er en grundig forklaring på Three.js som diskuterer scene, geometri, belysning, materialer og animasjon som jeg sikkert ikke kunne dekke i dette korte innlegget..

Du kan også nyte:

  • WebGL med THREE.js teksturer og partikler
  • THREE.js for spillutvikling
  • WebGL med THREE.js Grunnleggende

studiepoeng

Denne artikkelen ville ikke vært mulig uten den sjenerøse hjelpen fra Animation at Work Slack Community, så jeg vil gjerne takke (i ingen bestemt rekkefølge) Stephen Shaw, Jeff Ayer, Louis Hoebregts, Neil Pullman, Eli Fitch og Chris Johnson.