Complexitatea Web-ului se schimbă zilnic, iar posibilitățile sale cresc la fel de repede; în special cu redarea 3D. WebGL (Web Graphics Library) este un API JavaScript pentru redarea graficelor interactive 3D și 2D. Three.js de Ricardo Cabello este o bibliotecă construită pe partea de sus a WebGL, asigurând că codul autorizat este compatibil între diferite browsere.
Trei.js este pentru WebGL ce jQuery este JavaScript, oferind sintaxa declarativa iubita de atat de multi si abstractizarea durerilor de cap pentru 3D in browser. Să o revedem, să obținem o prezentare generală a sintaxei și să vedem cum să începeți dacă sunteți nou în jocul 3D.
Aruncați o privire la următoarea demonstrație pe CodePen; utilizați cursorul mouse-ului pentru a glisa modelul în jurul acestuia, pentru a mări și a deplasa cu roata mouse-ului.
Vom lucra în CodePen din motive de ușurință; începeți prin conectarea la Three.js (CDN 126Kb) din fila JS.
Începem prin a crea o scenă, la fel cum începeți cu o pânză în Photoshop. O scenă este definită cu o variabilă înainte ca orice alt cod să fie scris. Deci, în panoul JS adăugați:
var scena = nouă TREI ();
Cu perdelele și pregătite pentru performanța noastră, vom avea nevoie de o modalitate de a vedea timpul nostru minunat de a introduce o cameră. Există o serie de camere pe care Three.js le include împreună, cum ar fi PerspectiveCamera
, StereoCamera
, OrthographicCamera
și CubeCamera
. În scopurile noastre vom folosi PerspectiveCamera
deoarece este proiectat să imite modul în care ochiul uman vede. Așa cum definim o scenă cu o variabilă, facem același lucru pentru a defini o cameră:
camera var = nouă Trial.PerspectiveCamera ();
PerspectiveCamera acceptă patru argumente: FOV
, aspect
, lângă
și departe
.
FOV
(câmpul vizual) este cât de mult puteți vedea în jurul centrului camerei. Gândiți-vă la un obiectiv cu unghi larg de pe o cameră foto față de o lentilă standard. aspect
este raportul dintre FOV
, sau cu alte cuvinte, lățimea până la înălțimea unui ecran (de exemplu, 4: 5, 16: 9). lângă
și departe
, sunt avioanele unui solid. Împreună, ele controlează dacă un obiect este redat pe baza distanței acestuia față de cameră. lângă
este cel mai apropiat un obiect sau o parte a unui obiect poate fi la aparatul foto în timp ce este încă redat, departe
este cel mai departe un obiect poate fi de la aparatul de fotografiat și încă să fie prestate. Împreună acestea definesc frustumul vizual al camerei.Iată un exemplu de PerspectiveCamera
argumente:
var camera = noua camera de pariuri THREE.Perspective (75, window.innerWidth / window.innerHeight, 0.1, 1000);
Nu este important să înțelegeți fiecare valoare în acest moment decât să cunoaștem valorile pe care le avem poate sa fi trecut. Continuând, va trebui să setăm poziția camerei.
camera.position.set (x, y, z);
Această linie este poziția locală a obiectului. Aceasta stabilește X, y și z coordonatele vectorului. Fără ea camera nu va vedea nimic.
Următorul ingredient important din rețeta noastră este crearea unui WebGLRenderer. Aceasta este piesa care este responsabilă pentru magia afișării creației voastre.
var renderer = nou THREE.WebGLRenderer ();
WebGLRenderer
poate accepta și proprietățile și valorile transmise ca obiect.
var renderer = nou THREE.WebGLRenderer (alpha: true // elimina panza 'bg color);
Sunt destul de puține Valoarea proprietății
perechi care pot fi folosite - ele sunt enumerate în docs ar trebui să vă decideți să se arunce mai adânc într-un punct mai târziu (ceva ce am încuraja foarte mult).
Cu randul definit putem stabili metode de personalizare a creației noastre, cum ar fi setSize
; o metodă pe care o veți folosi în aproape fiecare proiect Three.js.
// Efectuați redarea scenei dimensiunea ecranului renderer.setSize (window.innerWidth, window.innerHeight);
Există multe alte metode pe care le puteți utiliza, dar pentru scopurile noastre vom rămâne setSize ()
.
Acum că dimensiunea dorită este definită, vom avea nevoie de o modalitate de ao atașa DOM.
document.body.appendChild (renderer.domElement);
Acest DOMElement
proprietatea este locul în care redacția redă producția și va fi sub formă de a pânză
element. Deși eu folosesc document.body
ați putea adăuga sau prefixa pânză
element oriunde doriți. Depinde de dvs. unde vă doriți plasarea pe baza nevoilor specifice ale proiectului dvs..
Pentru următorul pas trebuie să creați un obiect - deoarece tot ceea ce am făcut până acum este să declare o scenă, o cameră și un renderer. Pentru scopuri demonstrative, să luăm un telefon mobil de la 3D Warehouse astfel încât să putem construi un previewer de produs pentru persoanele care achiziționează un iPhone online.
iPhone 6+ de Jeremie PDe obicei, puteți utiliza aplicații precum SketchUp sau chiar Blender pentru a desena obiectele 3D, cu toate acestea există o curbă de învățare înaltă pentru aplicațiile de desen 3D - o curbă care este cu siguranță în afara domeniului de aplicare al acestui articol.
Pentru a insera obiectul 3D pe scena, trebuie sa utilizam ColladaLoader
. Trebuie menționat că orice grafic pe care decideți să-l utilizați ar trebui în general să fie sub 1-2Mb și trebuie să fie un fișier Collada pentru a fi utilizat cu Three.js: acestea sunt fișiere care se termină cu .dae
extensie. Dacă deschideți un fișier Collada, veți vedea că este scris de fapt în XML.
Începem prin definirea ColladaLoader
folosind o variabilă și apelarea metodei împreună cu definirea unei alte variabile care să reprezinte graficul 3D pentru referire la un punct ulterior.
var dae, // încărcător grafic = nou THREE.ColladaLoader (); // încărcător
Acesta este un început minunat, dar trebuie să facem ceva mai mult de făcut pentru a afișa telefonul. Să facem o funcție care va face exact așa:
funcția loadCollada (collada) dae = collada.scene; scene.add (dae);
Pentru următorul pas vom folosi sarcină
, treceți adresa URL a fișierului nostru Collada și apoi apelați funcția noastră după nume ca al doilea argument:
loader.load ('http://myurl.com/file/iphone6.dae', loadCollada);
Dacă doriți să aflați mai multe despre ColladaLoader
puteți săpe prin codul sursă pe GitHub.
Cu încărcătorul și graficul în final, există un ultim pas; trebuie să creăm ceea ce se numește o "buclă de randare". Acest lucru se datorează faptului că nu mai dăm nimic încă.
Această "buclă de render" este ceea ce va determina redarea să deseneze scena de șaizeci de ori pe secundă. Următoarea funcție va face din creația noastră viu (cea mai bună parte a întregului proces).
funcția renderPhone () requestAnimationFrame (renderPhone); renderer.render (scenă, cameră); renderPhone ();
requestAnimationFrame
are o serie de avantaje. Cel mai important este că acesta se oprește când utilizatorul navighează către o altă filă de browser, în cele din urmă nu irosind puterea de procesare și durata de viață a bateriei.
Rezultatul acestei lucrări este o redare dulce a unui iPhone 3D pe care îl puteți roti, roti și măriți și plasa din:
Există încă câțiva biți care au intrat în creația finală, așa că vă încurajez să vă aruncați mai adânc în panoul JavaScript al demo-ului.
De exemplu; Iluminat (Lumină ambientală
, HemisphereLight
, PointLight
), TrackballControls
, AxisHelper
și un eveniment de redimensionare a ferestrelor. Unele dintre aceste elemente nu conțin documentație, cum ar fi TrackballControls
, dar puteți găsi toate proprietățile disponibile în fișierul JS de bază pe GitHub. Există și alte controale foarte reale pe care le puteți utiliza, care sunt, de asemenea, listate pe GitHub.
Uneori aveți nevoie de puțină inspirație pentru a obține creierul să ardă idei într-un ritm rapid. Următoarele sunt câteva dintre demosurile mele preferate, folosind Trei.js care transformă visele în realitate.
https://paperplanes.worldhttps://throughthedark.withgoogle.com (apucați-vă căștile)http://carvisualizer.plus360degrees.com/threejsRachel Smith a scris un articol extraordinar despre CodePen despre WebGL și recomand să-i citești când ai timp liber. Tutorialul este plin de limbaj simplu si este o explicatie minutioasa a lui Three.js despre scena, geometria, iluminarea, materialele si animatia pe care cu siguranta nu le-am putut acoperi in acest scurt post.
De asemenea, vă puteți bucura:
Acest articol nu ar fi fost posibil fără ajutorul generos din partea comunității Animation at Work Slack, așa că aș vrea să-i mulțumesc lui Stephen Shaw, Jeff Ayer, Louis Hoebregts, Neil Pullman, Eli Fitch și Chris Johnson.