In diesem Artikel wird hauptsächlich beschrieben, wie Sie mit dem Technologie-Stack Three.js + Blender das coole dynamische 3D-Logo von Meta realisieren, einschließlich grundlegender Modellringe, Torusknoten, Pipelines und Modellgenerierung, Modellladen, Hinzufügen von Animationen, Hinzufügen von Klickereignissen, Ändern von Materialien usw. Hintergrund Was ist das Metaverse? Der Begriff Metaverse stammt aus Neal Stephensons Die Konnotation des Metaversums hat die Errungenschaften der Informationsrevolution Ergebnisse erzielenKommen wir zur Sache und schauen uns die Implementierungswirkung des Beispiels in diesem Artikel an. Entwicklung und Implementierung Werfen wir vor der Entwicklung einen Blick auf Versuch 1: DREI.TorusGeometry Die von
Syntaxbeispiel:
Versuch 2: DREI.TorusKnotGeometry
Syntaxbeispiel:
Versuch 3: THREE.TubeGeometry
Codebeispiel // ... var Steuerelemente = neue Funktion () { //Punktkoordinaten this.deafultpoints = [ [0, 0,4, -0,4], [0,4, 0, 0], [0,4, 0,8, 0,4], [0, 0,4, 0,4], [-0,4, 0, 0], [-0,4, 0,8, -0,4], [0, 0,4, -0,4] ] diese.Segmente = 64; dieser.radius = 1; dies.radiusSegments = 8; dies.geschlossen = wahr; diese.punkte = []; diese.neuePunkte = Funktion () { var Punkte = []; für (var i = 0; i < controls.deafultpoints.length; i++) { var _x = Steuerelemente.Standardpunkte[i][0] * 22; var _y = Steuerelemente.Standardpunkte[i][1] * 22; var _z = Steuerelemente.Standardpunkte[i][2] * 22; Punkte.push(neu DREI.Vektor3(_x, _y, _z)); } Kontrollen.Punkte = Punkte; steuert.neuzeichnen(); }; dies.redraw = Funktion () { redrawGeometryAndUpdateUI(gui, Szene, Steuerung, Funktion() { returniere generatePoints(Steuerelemente.Punkte, Steuerelemente.Segmente, Steuerelemente.Radius, Steuerelemente.RadiusSegmente, Kontrollen.geschlossen); }); }; }; steuert.neuePunkte(); Funktion generatePoints(Punkte, Segmente, Radius, RadiusSegmente, geschlossen) { wenn (spGroup) Szene.entfernen(spGroup); spGroup = neues THREE.Object3D(); var material = neues THREE.MeshBasicMaterial({ Farbe: 0xff0000, transparent: false }); Punkte.fürJeden(Funktion (Punkt) { var spGeom = neues THREE.SphereGeometry(0.1); var spMesh = neues THREE.Mesh(spGeom, Material); spMesh.position.copy(Punkt); spGroup.add(spMesh); }); Szene.Hinzufügen(spGroup); gibt neue THREE.TubeGeometry zurück (neue THREE.CatmullRomCurve3 (Punkte), Segmente, Radius, RadiusSegmente, geschlossen); } // ... Testversion 4: Blender + Three.js Obwohl dies mit
Modellierungs-Tutorial Als ich in Modellieren mit Blender Verwenden Sie Abhängigkeiten laden <script src="./assets/libs/three.js"></script> <script src="./assets/libs/loaders/FBXLoader.js"></script> <script src="./assets/libs/inflate.min.js"></script> <script src="./assets/libs/OrbitControls.js"></script> <script src="./assets/libs/stats.js"></script> Szeneninitialisierung var Container, Statistiken, Steuerungen, Erstellen, Kamera, Szene, Renderer, Licht, anklickbare Objekte = [], Mixer, MixerArr = [], manMixer; var Uhr = neue DREI.Uhr(); init(); animieren(); Funktion init() { Container = Dokument.ErstellenElement('div'); Dokument.Body.AnhängenUntergeordnetesElement(Container); // Szene Szene = neue THREE.Scene(); Szene.transparent = wahr; Szene.Nebel = neuer THREE.Nebel(0xa0a0a0, 200, 1000); // Perspektivkamera: Sichtfeld, Seitenverhältnis, Nahebene- und Fernebene-Kamera = neue THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0,1, 1000); Kamera.Position.einstellen(0, 4, 16); Kamera.lookAt(neu DREI.Vektor3(0, 0, 0)); // Halbkugel-Lichtquelle: Erstellen Sie eine natürlichere Lichtquelle für Außeneffekte light = new THREE.HemisphereLight(0xefefef); Licht.Position.Set(0, 20, 0); Szene.Hinzufügen(Licht); // Gerichtetes Licht light = new THREE.DirectionalLight(0x2d2d2d); Licht.Position.Set(0, 20, 10); Licht.castShadow = wahr; Szene.Hinzufügen(Licht); // Umgebungslicht var ambientLight = new THREE.AmbientLight(0xffffff, .5); Szene.Hinzufügen(Umgebungslicht); // Raster var grid = new THREE.GridHelper(100, 100, 0xffffff, 0xffffff); Rasterposition.set(0, -10, 0); Gitter.Material.Deckkraft = 0,3; Gitter.Material.transparent = wahr; Szene.Hinzufügen(Raster); Renderer = neuer THREE.WebGLRenderer({ Antialiasing: true, Alpha: true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.outputEncoding = DREI.sRGBEncoding; renderer.setSize(Fenster.innereBreite, Fenster.innereHöhe); //Setze die Hintergrundfarbe auf transparentrenderer.setClearAlpha(0); // Shadowrenderer aktivieren.shadowMap.enabled = true; container.anhängenUntergeordnetesElement(renderer.domElement); // Objektiv-Controller-Steuerelemente hinzufügen = neues THREE.OrbitControls(Kamera, Renderer.domElement); steuert.Ziel.set(0, 0, 0); steuert.update(); window.addEventListener('Größe ändern', beiFenstergröße ändern, false); // Leistungs-Plugin initialisieren stats = new Stats(); Container.Untergeordnetes Anhängen(stats.dom); } // Bildschirmzoomfunktion onWindowResize() { Kamera.Aspekt = Fenster.Innenbreite / Fenster.Innenhöhe; Kamera.updateProjectionMatrix(); renderer.setSize(Fenster.innereBreite, Fenster.innereHöhe); }
Logomodell wird geladen Verwenden Sie var loader = neuer THREE.FBXLoader(); loader.load('assets/models/meta.fbx', Funktion (Netz) { mesh.traverse(Funktion (Kind) { wenn (Kind.istMesh) { Kind.castShadow = wahr; Kind.receiveShadow = wahr; } }); Netz.Rotation.y = Math.PI / 2; mesh.position.set(0, 1, 0); Mesh.Scale.Set (0,05, 0,05, 0,05); Szene.Hinzufügen(Netz); }); Materialien hinzufügen var texLoader = new THREE.TextureLoader(); loader.load('assets/models/meta.fbx', Funktion (Netz) { mesh.traverse(Funktion (Kind) { wenn (Kind.istMesh) { if (child.name === 'Bézier-Kreis') { untergeordnetes Material = neues THREE.MeshPhysicalMaterial({ Karte: texLoader.load("./assets/images/metal.png"), Metallgehalt: .2, Rauheit: 0,1, Belichtung: 0,4 }); } } }); }) Animation hinzufügen
loader.load('assets/models/meta.fbx', Funktion (Netz) { mesh.animations.map(Element => { mesh.traverse(Kind => { // Da das Modell mehrere Objekte enthält und jedes eine andere Animation hat, fügt dieses Beispiel nur dem Bezier-Kreisnetz eine Animation hinzu, wenn (child.name === 'Bezier-Kreis') { let mixer = neues THREE.AnimationMixer(Kind); mixerArr.push(Mixer); lass animationClip = Element; animationClip.Dauer = 8; let clipAction = mixer.clipAction(animationClip).play(); animationClip = clipAction.getClip(); } }) }) }); Vergessen Sie nach dem Hinzufügen der Animation nicht, die Animation in Funktion animieren() { renderer.render(Szene, Kamera); // Zeitintervall zwischen zwei Ausführungen dieser Methode abrufen let time = clock.getDelta(); // Logoanimation aktualisieren mixerArr.map(mixer => { Mixer && Mixer.update(Zeit); }); // Charakteranimation aktualisieren manMixer && manMixer.update(time); statistiken.update(); requestAnimationFrame(animieren); } Ladefortschritt anzeigen <div Klasse="wird geladen" id="wird geladen"> <p class="text">Ladefortschritt<span id="progress">0 %</span></p> <div> var loader = neuer THREE.FBXLoader(); loader.load('assets/models/meta.fbx', mesh => { }, res => { // Ladefortschritt let progress = (res.loaded / res.total * 100).toFixed(0); document.getElementById('progress').innerText = Fortschritt; wenn (Fortschritt === 100) { document.getElementById('wird geladen').style.display = 'keine'; } }, err => { // Laden fehlgeschlagen console.log(err) }); Ergebnisse erzielen Klicken Sie hier, um das Material zu ändern Hören Sie auf das Klickereignis der Seite und holen Sie sich das aktuelle Klickobjekt über //Raycaster- und Mausvariablen deklarieren var raycaster = new THREE.Raycaster(); var Maus = neuer DREI.Vektor2(); Funktion beiMausklick(Ereignis) { // Berechnen Sie die Position des vom Raycaster benötigten Punkts basierend auf der Position des Mausklicks, mit der Bildschirmmitte als Ursprung und einem Wertebereich von -1 bis 1. mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = - (event.clientY / window.innerHeight) * 2 + 1; // Berechnen Sie den Raycaster basierend auf der Position des Mauszeigers und der aktuellen Kameramatrix raycaster.setFromCamera(Maus, Kamera); // Holen Sie sich die Array-Sammlung, wo sich die Raycaster-Linie mit allen Modellen schneidet. let intersects = raycaster.intersectObjects(clickableObjects); wenn (Schnittpunkt.Länge > 0) { Konsole.log(schneidet[0].Objekt) Lassen Sie selectedObj = intersects[0].object; selectedObj.material = neues THREE.MeshStandardMaterial({ Farbe: `#${Math.random().toString(16).slice(-6)}`, Metallhaftigkeit: Math.random(), Rauheit: Math.random() }) } } window.addEventListener('click', beiMausklick, false); Charaktermodell wird geladen Der Ladevorgang für das Charaktermodell ist derselbe wie für das loader.load('assets/models/man.fbx', Funktion (Mesh) { mesh.traverse(Funktion (Kind) { wenn (Kind.istMesh) { Kind.castShadow = wahr; Kind.receiveShadow = wahr; } }); mesh.rotation.y = Math.PI / 2; Mesh.Position.Set(-14, -8.4, -3); Mesh.Scale.Set (0,085, 0,085, 0,085); Szene.Hinzufügen(Netz); manMixer = neues THREE.AnimationMixer(mesh); let animationClip = mesh.animations[0]; : let clipAction = manMixer.clipAction(animationClip).play(); animationClip = clipAction.getClip(); }, res => { lass Fortschritt = (res.geladen / res.total * 100).toFixed(0); document.getElementById('Fortschritt').innerText = Fortschritt + '%'; wenn (Zahl(Fortschritt) === 100) { document.getElementById('wird geladen').style.display = 'keine'; } }, err => { console.log(fehler) }); Die Beispiel-Charaktermodelle in diesem Artikel stammen von mixamo.com, wo es Hunderte von Charakteren und Tausende von Aktionen gibt, die frei kombiniert und ZusammenfassenZu den wichtigsten Wissenspunkten in diesem Artikel gehören:
Verweise[1]. Mit three.js eine coole 3D-Seite im Acid-Stil erstellen [2]. Materialien in ThreeJs verstehen [3]. Erster Eindruck von Threes Animation [4]. Was ist das Metaverse? Autor: dragonir Artikel-URL: https://www.cnblogs.com/dragonir/p/15574412.html Dies ist das Ende dieses Artikels über die Implementierung des dynamischen 3D-Logos von Facebook Metaverse mit Three.js. Weitere verwandte Inhalte zum dynamischen 3D-Logo von Three.js finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Zusammenfassung der Probleme mit der Mysql-connector-java-Treiberversion
>>: Unicode-Signatur-BOM-Problem (Byte Order Mark) für UTF-8-Dateien
Inhaltsverzeichnis 1. Beispiel: Hiermit können Da...
Problem 1: Baidu Map verwendet gekachelte Bilder ...
Inhaltsverzeichnis Serverplanung 1. Systemkompone...
Schnelles Lesen Warum müssen wir SQL-Anweisungen ...
In diesem Artikelbeispiel wird der spezifische Co...
Vorwort Im Linux-Betriebssystem sind Gerätedateie...
Der spezifische Code lautet wie folgt: <Stil&g...
Der Spread-Operator ermöglicht die Erweiterung ei...
Auf vielen Websites wird im Eingabefeld Hinweiste...
1. Überwachungsarchitekturdiagramm 2. Umsetzungsi...
Inhaltsverzeichnis Übersicht zur Umgebungseinrich...
Seien Sie nicht überrascht, wenn Sie im Bild eine ...
In diesem Artikelbeispiel wird der spezifische Co...
/****************** * Zeitverwaltung des Linux-Ke...
Inhaltsverzeichnis Vorwort Browser kompilierte Ve...