Instructables Universe in Three.js (8 / 13 stap)

Stap 8: Three.js: een andere helderheid voor elke ster: WebGL Shaders


Sterren zijn niet uniform. Ze zijn verschillende kleuren, verschillende maten en verschillende helderheden. Mijn truc met het hebben van zes voorwerpen uit voordat leek niet om hier van toepassing: ik wilde echt elke ster uniek te zijn, en om na te denken van het relatieve belang van het project. Kortom, de projecten die de "helderste sterren" moeten schijnen. Elk hoekpunt uniek maken is een perfect gebruiken voor WebGL shaders. Herinner me de code van de arcering uit voor:

 Galaxy.Utilities.projectData = parsedData; Galaxy.Datasource = parsedData; var instructableIds = _.keys(parsedData); // create geometries for each of the six rings, so the particle systems can move independently var particleGeometries = []; _.each(window.Galaxy.Settings.categories,function(){ particleGeometries.push(new THREE.Geometry()); attributes = { size: { type: 'f', value: [] }, ca: { type: 'c', value: [] }, alpha: { type: 'f', value: [] } }; uniforms = { color: { type: "c", value: new THREE.Color( 0xffffff ) }, texture: { type: "t", value: THREE.ImageUtils.loadTexture("images/particle4B.png")} }; shaderMaterialsArray.push(new THREE.ShaderMaterial( { uniforms: uniforms, attributes: attributes, vertexShader: document.getElementById( 'vertexshader' ).textContent, fragmentShader: document.getElementById( 'fragmentshader' ).textContent, blending: THREE.AdditiveBlending, depthTest: false, transparent: true })); }); _.each(instructableIds,function(id){ var pX = parsedData[id].x - window.Galaxy.Settings.width/2, pY = parsedData[id].y - window.Galaxy.Settings.height/2, pZ = Galaxy.Utilities.random(0,10), particle = new THREE.Vector3(pX, pY, pZ); // add each particle to the correct geometry (ring) so it will end up in an associated particle system later var ring = indexForCategory(parsedData[id].category); if (ring !== -1) { particleGeometries[ring].vertices.push(particle); var appearance = Galaxy.Utilities.vertexAppearanceByViews(parsedData[id].views); shaderMaterialsArray[ring].attributes.size.value.push(appearance.size); shaderMaterialsArray[ring].attributes.ca.value.push(appearance.ca); shaderMaterialsArray[ring].attributes.alpha.value.push(appearance.alpha); // we need to keep references both directions. User clicks particle, we need to look up details by id // Also, if we want to highlight related instructables, we'll need fast easy access to vertices with referenced ids. particle.instructableId = id; parsedData[id].particleMaterial = shaderMaterialsArray[ring]; parsedData[id].vertexNumber = particleGeometries[ring].vertices.length-1; } }); // main scene, for all regular galaxy appearances var scene = new THREE.Scene(); Galaxy.Scene = scene; // create the particle system _.each(particleGeometries,function(particleGeometry, index){ particleGeometry.applyMatrix( new THREE.Matrix4().makeTranslation( Math.random()*50, Math.random()*50, 0 ) ); var system = new THREE.ParticleSystem( particleGeometry, shaderMaterialsArray[index] ); particleSystemsArray.push(system); scene.add(system); }); 

Deze arceringen werken hand in hand met deze ThreeJS-code:

Galaxy.Utilities.projectData = parsedData; Galaxy.Datasource = parsedData; var instructableIds = _.keys(parsedData); geometrieën maken voor elk van de zes ringen, zodat de particle systemen kunnen gaan zelfstandig var particleGeometries = []; _.each (venster. Galaxy.Settings.categories,function() {particleGeometries.push (nieuwe drie. Geometry()); kenmerken = {grootte: {type: 'f', waarde: []}, ca: {type: 'c', waarde: []}, alpha: {type: 'f', waarde: []}}; uniformen = {kleur: {type: "c", waarde: nieuwe drie. Kleur (0xffffff)}, textuur: {type: "t", waarde: drie. ImageUtils.loadTexture("images/particle4B.png")}}; shaderMaterialsArray.push (nieuwe drie. ShaderMaterial ({uniformen: uniformen, kenmerken: kenmerken, vertexShader: document.getElementById ('vertexshader') .textContent, fragmentShader: document.getElementById ('fragmentshader') .textContent, mengen: drie. AdditiveBlending, depthTest: valse, transparante: true})); }); _.each(instructableIds,function(id) {var pX = parsedData [id] .x - venster. Galaxy.Settings.width/2, pY = parsedData [id] .y - venster. Galaxy.Settings.height/2, pZ = Galaxy.Utilities.random(0,10), particle = nieuwe drie. Vector3 (pX, pY, pZ); toevoegen van elk deeltje aan de juiste geometrie (ring) dus het zal eindigen in een bijbehorende particle systeem later var ring = indexForCategory(parsedData[id].category); Als (ring! == -1) {particleGeometries[ring].vertices.push(particle); vertexAppearanceByViews : function(viewcount){ var prominence = (Math.pow(Math.log(viewcount),3))/(1000); return { size: prominence*9, ca: Galaxy.Utilities.whiteColor, alpha: Math.min(0.15 + 0.3*prominence,0.9) } } We moeten zorgen dat verwijzingen blijven beide richtingen. Gebruiker deeltje, moeten we opzoeken details met id / / ook, als we Markeer verwante instructables willen, moeten we snel gemakkelijk toegang tot de hoekpunten met waarnaar wordt verwezen-id. particle.instructableId = id; .particleMaterial parsedData [id] = shaderMaterialsArray [ring]; parsedData [id] .vertexNumber particleGeometries [ring].vertices.length =-1; } }); belangrijkste scène, voor alle optredens van de reguliere galaxy var particle = new THREE.Vector3(pX, pY, pZ); ... particleGeometries[ring].vertices.push(particle); 

Hier is wat er gebeurt in plain Engels:

1. mij troep opwaarts een drie. ShaderMaterial voor elke drie. ParticleSystem. Terughalen uit de vorige stap zijn er zes ParticleSystems, één voor elke categorie van Instructables, en dat elke ParticleSystem moet twee dingen te worden geïnstantieerd: een geometrie en een materiaal. (Zie ThreeJS: aan de slag hierboven)

2. elke drie. ShaderMaterial is in wezen hetzelfde op dit punt: ze zijn ingesteld op gebruik van het fragment en vertex shaders geladen in het bovenstaande script-tags. Ze omvatten uniformen en attributen doorgegeven van de JavaScript. Dit zijn twee van de drie typen variabelen die kunt u naar WebGL. Zo goed uitgelegd op html5rocks.com:

-Uniformen wijzigen niet binnen een bepaald frame. Ze worden verzonden naar zowel fragment en vertex shaders. In dit geval, geldt de kleur en de textuur afbeelding (de mooi gloeiende ster-achtig beeld) voor elke ster.
-Kenmerken van toepassing op afzonderlijke hoekpunten. Ze worden verzonden naar Vertexshaders alleen. In dit geval zijn de kenmerken die door star variëren kunnen kleur, grootte, en alpha.
-Varyings kunnen de Vertexshaders geschiedde waarden in de arcering fragment.

3. met de lege drie. ShaderMaterials gedefinieerd, mijn volgende stappen van het blok over elke Instructable die wordt weergegeven op het scherm. Het geeft de Instructable aan een helper functie die hoe de ster worden weergegeven bepaalt, gebaseerd op het aantal weergaven voor dat Instructable:

 var appearance = Galaxy.Utilities.vertexAppearanceByViews(parsedData[id].views); shaderMaterialsArray[ring].attributes.size.value.push(appearance.size); shaderMaterialsArray[ring].attributes.ca.value.push(appearance.ca); shaderMaterialsArray[ring].attributes.alpha.value.push(appearance.alpha); 

In de definitieve versie van het Wetboek variëren niet ik eigenlijk de kleur van de sterren! Alpha doet dat voor mij, want elke ster op de top van een gekleurde achtergrond staat.

4. binnen deze lus, wordt elk deeltje geduwd in een array van de hoekpunten in de meetkunde:

 // for each item in the particleGeometries array: var system = new THREE.ParticleSystem( particleGeometry, shaderMaterialsArray[index] ); ... scene.add(system); 

en een bijbehorende verzameling "kenmerken" waarden wordt geduwd in de overeenkomstige ShaderMaterial:

 ... } else if (object instanceof THREE.ParticleSystem) { //See: <a href="https://github.com/mrdoob/three.js/issues/3492"> <a href="https://github.com/mrdoob/three.js/issues/3492"> https://github.com/mrdoob/three.js/issues/3492 </a> </a> var vertices = object.geometry.vertices; var point, distance, intersect, threshold = 3; var localMatrix = new THREE.Matrix4(); var localtempRay = raycaster.ray.clone(); var localOrigin = localtempRay.origin; var localDirection = localtempRay.direction; localMatrix.getInverse(object.matrixWorld); localOrigin.applyMatrix4(localMatrix); localDirection.transformDirection(localMatrix); for ( var i = 0; i < vertices.length; i ++ ) { point = vertices[ i ]; distance = localtempRay.distanceToPoint(point); if ( distance > threshold ) { continue; } intersect = { distance: distance, point: point, face: null, object: object, vertex: i }; intersects.push(intersect); } } else if ... 

Tot slot, met een array van deeltje geometrieën en bijbehorende matrix van deeltje materialen, de twee worden samengevoegd in één array van ParticleSystems, en elke ParticleSystem is toegevoegd aan de scène:

 -Get (x,y) of user's click -Turn this into a THREE.Vector3() -un-project the vector based on the camera position -Set up a raycaster with the camera position and unprojected vector -run ray.intersectObjects() -do something with the results 

Gerelateerde Artikelen

The Instructables University Game

The Instructables University Game

Ik had niet gepland op het invoeren van de "How to play wedstrijd" want ik niet echt een gameconsole ben. Na het nadenken, kwam ik met The Instructables Universiteit Game. Ik heb geprobeerd om mijn volwassen zoon aan bij de pret hier, maar zijn
Verleden projecten/Pre Instructables...

Verleden projecten/Pre Instructables...

I wish I would have found Instructables two or three years ago. Ik kon een deurklink van een veel meer hebben bijgedragen. Met mijn recente verplaatsen onvermijdelijk dat heb ik besloten om enkele foto's van eerdere projecten in mijn huidige huis ver
Jus te gaan met een gebraden

Jus te gaan met een gebraden

hoewel dit dom eenvoudig is, ik ben voortdurend verbaasd over het aantal mensen die geïntimideerd, zijn wanneer het gaat om het maken van een simpele jus te gaan met een gebraden. Deze jus werkt ruim aardappelen, besprenkeld over het vlees of de volg
Gedetailleerde geweven Duct Tape portefeuilles Instructable

Gedetailleerde geweven Duct Tape portefeuilles Instructable

Ja, ja, het is een ander Duct Tape wallet instructable.Hoe saai, juiste?De reden dat ik dit doe is dat ik proberen zal te doen samenballen van kennis over het bouwen van allerlei soorten Duct Tape portefeuilles en ingaan op veel aspecten zodat u zal
Steven Universe jurk

Steven Universe jurk

Een goede vriend van mij houdt Steven Universe, dus ik haar deze jurk als een gift van de verjaardag maakte. Ik denk dat dit is een echt mooie jurk, en zou een geweldig cosplay of Halloween kostuum!Ik maakte haar ook een volledige set van kat vinger
TestrBot: De $300 Universal testmachine

TestrBot: De $300 Universal testmachine

UPDATE 9-2-15: ik vrijgegeven een batch van testresultaten die aantonen dat mijn beweegredenen voor terwijl "infill"-ontwerp is de beste!* Wat is TestrBot?TestrBot is een $300 Universal Test Machine (UTM) en kan worden gebruikt voor het uitvoere
Steven Universe lumi inkodye ondergoed met crystal gem Garnet

Steven Universe lumi inkodye ondergoed met crystal gem Garnet

Een van de dingen die mijn geld kan niet kopen is prima super held/favoriet karakter ondergoed (of elke merch echt) voor dames. Elke vorm van boksers schijnt beschikbaar te zijn, en soms heb ik geprobeerd kopen sommige "jongens" grootte ondergoe
SUMO&nbsp;:&nbsp;&nbsp;Slimme&nbsp;/*&nbsp;*&nbsp;Smart&nbsp;Pulse&nbsp;Monitor&nbsp;*&nbsp;Author&nbsp;:&nbsp;Geeve&nbsp;George&nbsp;*&nbsp;Instructables&nbsp;:&nbsp;*/&nbsp;#include&nbsp;const&nbsp;int&nbsp;analo

SUMO&nbsp;:&nbsp;<youtube&nbsp;id="lDKM7UKUL5A"></youtube>&nbsp;Slimme&nbsp;/*&nbsp;*&nbsp;Smart&nbsp;Pulse&nbsp;Monitor&nbsp;*&nbsp;Author&nbsp;:&nbsp;Geeve&nbsp;George&nbsp;*&nbsp;Instructables&nbsp;:&nbsp;*/&nbsp;#include&nbsp;const&nbsp;int&nbsp;analo

src = "HalloIedereen,Ik benGeeveGeorgeeen15jaaroudeMaker/elektronicaHobbyist.IliefdeComputerVisie,AndroïdeOntwikkelingenAlgoritmeDesign.Iamop dit momentin11eRangComputerWetenschapStudentbijWeinigRockIndischeSchool.:)Zoekenmeerovermebij:href = "h
DIY zelf geactiveerd PRIVATE UNIVERSE

DIY zelf geactiveerd PRIVATE UNIVERSE

dit is mijn allereerste ooit Instructables uploaden dus, wees voorzichtig met mij.Ik maakte dit voor een kleine galerie ruimte in een ARI genoemd Constance in Hobart, Tasmanië, Australië, en is speciaal ontworpen om te worden geactiveerd wanneer mens
Knex verstek zagen instructies

Knex verstek zagen instructies

het is teruggekeerd! Ja, na 3 jaar, heb ik eindelijk besloten om te posten van instructies van mijn verstek zaag. Deze zaag is net als de oude is, behalve een paar kleine kleurwijzigingen te geven een meer consistent kleurenschema. Voor degenen onder
Pimp mijn PSP hoofdstuk 1 uw one-stop Instructable voor al uw PSP behoeften!

Pimp mijn PSP hoofdstuk 1 uw one-stop Instructable voor al uw PSP behoeften!

Dit instructable leert u sommige unieke dingen die uw PSP in een Multi-Media beest transformeren zal.Dit instructable zal u tonen hoe te:1. update uw PSP (officiële Firmware, niet Custom Firmware)2. video's toevoegen aan uw PSP (hoofdstuk 2)3. foto's
Met de Switch()-instructie als Sequencing Control

Met de Switch()-instructie als Sequencing Control

In dit Instructable, zal wij gaan over de "switch()"-instructie en het gebruik in de programmering. De instructie switch is een krachtig hulpmiddel voor het organiseren van uw programma, gemakkelijk kunt u complexe stroomdiagrammen doorlopen.In
Overleven in het wild-het meest unieke instructable tot nu toe

Overleven in het wild-het meest unieke instructable tot nu toe

u hebben net wakker om jezelf te vinden op de grond in het wild.  Vóór het opstaan vanuit je liggende positie realiseert je je dat, naast het feit dat niet in uw eigen warme comfortabele bed, u hebben gewekt in het kreupelhout onder het bladerdak van
Stalen Python Knex achtbaan - instructies

Stalen Python Knex achtbaan - instructies

is terug iedereen-staal Python!Dit model is de recreatie van mijn oudere ontwerp, met een paar kleine wijzigingen, aangezien ik nooit had specifieke foto's van het origineel. Dit ontwerp heeft natuurlijk zijn gebreken, zodat u wellicht om te knoeien