WebGl. , som er bredt støttet på alle moderne browsere, gør det muligt for dig at arbejde med hardware-accelereret 3D-grafik i JavaScript. , åbner et stort udvalg af muligheder for browserbaserede apps og spil - bare tjek disse 20 fantastiske eksempler på Webgl i aktion , for bevis.
WebGL selv er ret lavt niveau, og det er usandsynligt, at du vil arbejde med det i sin vanilleform. Der er en række biblioteker og endda spilmotorer til rådighed for at levere højere niveau funktionalitet.
I denne tutorial skal jeg vise dig Sådan laver du en app eller websted, der bruger Webgl i kombination med tre.js. , som er et gratis open source bibliotek, der giver abstraktion af Webgl.
Du bliver nødt til at starte med at få fat i tre.js. . Når du har den nyeste bygning, skal du placere tre.js i din projektmappe. Vi tilføjer derefter det som et script til vores side som et andet JavaScript-bibliotek. Vi placerer vores egen kode i en separat JavaScript-fil.
& lt;! DOCTYPE HTML & GT;
& lt; html & gt;
& lt; hoved & gt;
& lt; meta charset = utf-8 & gt;
& lt; titel & gt; Kom godt i gang med tre.js & lt; / titel & gt;
& lt; / Head & GT;
& lt; body style = "margin: 0;" & gt;
& lt; script src = "three.js" & gt; & lt; / script & gt;
& lt; script src = "demo.js" & gt; & lt; / script & gt;
& lt; / body & gt;
& lt; / HTML & GT;
Vi har brug for tre ting at komme i gang med WebGL: en scene, et kamera og en renderer. En scene er, hvor vi placerer objekter, der skal vises af tre.js. Et kamera er det synspunkt, hvorfra vi vil se dem. Den renderer bringer de to sammen og trækker skærmen i overensstemmelse hermed. Når vi har disse oprettet, tilføjer vi rendereren til dokumentet.
Var bredde = vindue.innerwidth;
Var Højde = Vinduet.innerheight;
Var Viewangle = 45;
Var nærclipping = 0,1;
var farclipping = 9999;
var scene = ny tre.Scene ();
VAR kamera = ny tre.Perspectivecamera (viewangle, bredde / højde, nærclipping, farclipping);
var renderer = ny tre.webgrenderer ();
renderer.setsize (bredde, højde);
dokument.body.appendchild (renderer.domelement);
Dernæst skal vi skabe en loop til faktisk at gøre vores scene. Vi gør dette ved hjælp af renderer.render () funktion, men nøgleparten er at rekursivt bruge RequestanimationFrame () , som er en indbygget funktion, der gør det muligt for browseren at anmode om en anden ramme, når den er klar til at tegne en. Ved brug af RequestanimationFrame () er lettere og resulterer i glattere animation end at forsøge at tegne rammer selv.
Funktion ANIMATE () {
requestanimationframe (animere);
renderer.render (scene, kamera);
}
animere ();
Nu kan vi begynde at tilføje nogle genstande til vores scene. Vi kan gøre dette ved at oprette mesh genstande og tilføje dem til det. Et net er sammensat af geometri (formen af objektet) og et materiale (farven eller teksturen til at male den). Vi opretter nogle grundlæggende objekter ved at definere tre forskellige geometrier og tildele forskellige farvematerialer til dem.
var cubegeometri = ny tre.boxgeometri (1, 1, 1);
var cubemateriale = ny tre.meshlambertmaterial ({farve: 0xff0000});
Var Cube = Ny Tre.Mesh (Cubeegeometri, Cubeaterial);
Var COUTEGEOMETRY = NEW TREE.CONEGEOMETRY (0,5, 1, 4);
var conemateriale = ny tre.meshlambertmaterial ({farve: 0x00ff00});
Var Cone = Nye tre.Mesh (ConteGeometry, Connemateriale);
var spfestometri = ny tre.spheregeometri (0,5, 8, 8);
var spheremateriale = ny tre.meshlambertmaterial ({farve: 0x0000ff});
Var sfære = ny tre.mesh (sumgingometri, spfæremateriale);
Som standard tilføjes objekter på oprindelsen (x = 0, y = 0, z = 0) af scenen, som også er hvor vores kamera er, så vi skal også angive en position for dem. Vi er så klar til at tilføje maskerne til vores scene, hvilket betyder, at de automatisk gengives i animere () loop.
Cube.position.x = -2
cube.position.z = -5;
cone.position.z = -5;
sfære.position.z = -5;
sfære.position.x = 2;
cube.position.z = -5;
scene.add (kube);
scene.add (kegle);
scene.add (kugle);
Hvis du ser din side nu, finder du ting ser lidt fladt ud. Der er ingen belysning anvendt på objekterne, så de er solide primære farver og ser todimensionale. For at rette dette skal vi skifte fra Meshbasicmaterial. til et materiale, der understøtter belysning; Vi bruger Meshlambertmaterial. . Vi skal også tilføje en lyskilde til scenen.
Var Light = New Three.Pointlight (0xFFFFFF);
lys.position.x = 0;
lys.position.y = 10;
lys.position.z = 0;
scene.add (lys);
Nu kommer vi derhen! Du bør se, hvad der er helt åbenbart tredimensionale objekter på din side. Hvad vi endnu ikke har gjort, tages fuld fordel af animere () fungere. Lad os lave et par ændringer for at få vores lyskilde flytte rundt i en cirkulær bevægelse over objekterne.
Var Lightangle = 0;
funktion animate () {
Lightangle + = 5;
Hvis (Lightangle & GT; 360) {Lightangle = 0;};
light.position.x = 5 * math.cos (Lightangle * math.pi / 180);
lys.position.z = 5 * math.sin (lysangel * math.pi / 180);
requestanimationframe (animere);
renderer.render (scene, kamera); }
I praksis vil vi sandsynligvis ikke have vores genstande til at være flade farver. Det ville være mere typisk at anvende nogle teksturer til dem fra en fil. Vi kan gøre dette ved hjælp af Tre.textureloader () . Lad os ændre, hvordan vores kegleobjekt er oprettet for at udnytte en tekstur, vi har lagt fra en fil. Funktionen kaldes, når filen er indlæst.
Var textureloader = ny tre.textureloader ();
textureloader.load ("./ græs_texture.jpg", tekstur = & gt; {
Var COUTEGEOMETRY = NEW TREE.CONEGEOMETRY (0,5, 1, 4);
Var Conemateriale = Ny Tre.MeshLambertmaterial ({Map: Texture});
Var Cone = Nye tre.Mesh (ConteGeometry, Connemateriale);
cone.position.z = -5;
scene.add (kegle);
},
);
Ting ser bedre ud, men noget er stadig ikke helt naturligt. Teksturen ser meget flad ud og reagerer ikke på belysningen. Vi kan løse dette ved brug af Bump Mapping, som gør det muligt for os at bruge lyse og mørke dele af et billede til at simulere teksturering på overfladen af et objekt. Lad os prøve det ud med en anden tekstur på kuglen. Vi skifter materialet til Mhphongmaterial. , som giver os mulighed for at angive en bumpmap. attribut.
Var textureloader = ny tre.textureloader ();
textureloader.load ("./ bump_map.jpg", tekstur = & gt; {
var spfestometri = ny tre.spheregeometri (0,5, 8, 8);
var sfæremateriale = ny tre.mhphongmaterial ({farve: 0x0000ff, bumpmap: tekstur, bumpscale: 1.0});
Var sfære = ny tre.mesh (sumgingometri, spfæremateriale);
sfære.position.z = -5;
sfære.position.x = 2;
scene.add (kugle);
},
);
Som en endelig berøring, giv brugeren en lille kontrol over scenen. For at tilføje evnen til at panorere rundt, er der et ekstra bibliotek, der sender med tre.js, der gør det utroligt nemt at gøre netop det. Sørg for at udtrække orbitcontrols.js fra tre.js-pakken til din projektmappe og inkludere det på din side. Dette er en af flere kontrolbiblioteker, der skibes med tre.js for at opfylde fælles stilarter af kameramikring.
& lt; script src = "orbitcontrols.js" & gt; & lt; / script & gt;
Nu er alt, hvad vi skal gøre, at skabe en Tre.orbitcontrols. objekt og anvende det på vores kamera. Biblioteket vil tage sig af resten for dig: Du behøver ikke at lytte til klik, musbevægelser og så videre. Du vil måske også flytte dine objekter tilbage til oprindelsespunktet, og kompensere kameraet i stedet for, at det kan panoreres pænt omkring objekterne.
Med det er vi færdige med vores introduktion. Du skal have tre genstande med varierende stilarter af tekstur, nogle dynamiske belysning og et brugerstyret kamera til at spille med.
kamera. Position.z = 10;
VAR Controls = nye tre.orbitcontrols (kamera);
Denne artikel fremhævet i udstedelse 268 af Web Designer, Creative Web Design Magazine - tilbyder ekspert tutorials, banebrydende trends og gratis ressourcer. Abonner på webdesigner nu.
Kunne lide dette? Prøv disse:
(Billedkredit: sonny flanaghan) At lære at rengøre malingbrushes korrekt er en vigtig færdighed. Som det siger sig..
At lære at lave en fotokollage i Photoshop vil komme til nytte i mange forskellige situationer. Individuelle fotos fanger enkeltmomenter i tide, men påberåber en collage, og du vil kunne i..
Vi har set mange nye API'er, der tilføjes på internettet i løbet af de sidste par år, der virkelig har gjort det muligt for webindholdet at have den samme slags funktionalitet, så mange ..
CSS-specifikationen er evigt udviklet. Processen til implementering af nye funktioner i CSS er kompliceret, men den forenklede ve..
I virkelige fotografering er lysstråler på deres mest synlige, når de har en overflade for at hoppe ud, såsom støv, pollen e..
Alle kunstnere har deres egen unikke arbejdsgang, når de skaber 3D-kunst i Zbbrush. Denne workflow kan betyde en masse teknikker..
Westerns er noget, jeg altid har elsket. I denne vejledning opretter jeg et billede i den typiske manga-stil, men ligger i en vil..
Denne vejledning vil se på, hvordan du kan lave en flydende stænk eller kroneffekt, og kan bruges til at skubbe ud af vand, mæ..