In diesem Artikel wird hauptsächlich die Verwendung des Technologie-Stacks React+three.js zum Laden von 3D-Modellen, Hinzufügen von 3D-Text, Erhöhen der Animation, Klicken der Interaktion usw. und zum Zusammenarbeiten mit dem Stildesign vorgestellt, um eine designreiche Seite im 🤢`Acid-Stil zu erstellen. Hintergrund Ich habe mir vor Kurzem einige Grundkenntnisse zu Grundlagen Säure-Design Der Begriff Kurz gesagt, die Kombination aus Ergebnisse erzielenOnline-Vorschau: https://tricell.fun erreichen3D-ModellSzeneninitialisierung Szene = neue DREI.Szene(); Kamera = neue DREI.Perspektivkamera (70, Fenster.innereBreite / Fenster.innereHöhe, 0,1, 1000); // Kameraposition einstellen camera.position.set(600, 20, -200); // Die Kamera fokussiert auf die Bildschirmmitte camera.lookAt(new THREE.Vector3(0, 0, 0));
Licht = neues THREE.HemisphereLight(0xffffff, 0x444444); Licht.Position.Set(0, 20, 0); Szene.Hinzufügen(Licht); Licht = neues DREI.Richtungslicht(0xffffff); Licht.Position.Set(0, 20, 10); Licht.castShadow = wahr; Szene.Hinzufügen(Licht); Fügen Sie var ambiColor = "#0C0C0C"; var ambientLight = neues THREE.AmbientLight(ambiColor); Szene.Hinzufügen(Umgebungslicht); Eingabehilfen hinzufügen (optional)
var grid = neu THREE.GridHelper(1000, 100, 0x000000, 0x000000); Gitter.Material.Deckkraft = 0,1; Gitter.Material.transparent = wahr; Rasterposition.set(0, -240, 0); Szene.Hinzufügen(Raster); Mit der Kamerasteuerung Steuerungen = neue THREE.OrbitControls(Kamera, Renderer.domElement); steuert.Ziel.set(0, 0, 0); steuert.update(); Statistiken = neue Statistiken(); Container.Untergeordnetes Anhängen(stats.dom); Laden des Modells Das in diesem Artikel verwendete Laden Sie Sie müssen // var loader = neuer THREE.FBXLoader(); var loader = neuer THREE.OBJLoader(); loader.load(Modell, Funktion (Objekt) { Objekt.traverse(Funktion (Kind) { wenn (Kind.istMesh) { Kind.castShadow = wahr; Kind.receiveShadow = wahr; } }); Objekt.Rotation.y = Math.PI / 2; Objekt.Position.Set(0, -200, 0); Objekt.Skalierung.Satz (0,32, 0,32, 0,32); Modell = Objekt; Szene.Hinzufügen(Objekt); }); GLTF-Modell wird geladen var loader = neuer THREE.GLTFLoader(); loader.load(Modell, Funktion (Objekt) { Objekt.Szene.Traverse(Funktion (Kind) { wenn (Kind.istMesh) { Kind.castShadow = wahr; Kind.receiveShadow = wahr; } }); Objekt.Szene.Rotation.y = Math.PI / 2; Objekt.Szene.Position.Set(0, -240, 0); Objekt.Szene.Skalierung.Satz (0,33, 0,33, 0,33); Modell = Objekt.Szene; Szene.Hinzufügen(Objekt.Szene); }); Der Effekt nach dem Hinzufügen des Netzes und dem Laden des Modells wird in der folgenden Abbildung dargestellt. Drehscheibenanimation hinzufügen Fügen Sie den Drehscheiben-Animationseffekt hinzu, indem Sie die Seite mit Funktion animieren () { requestAnimationFrame(animieren); // Während die Seite neu gezeichnet wird, wird rotation.y der Szene kontinuierlich geändert, um eine Rotation zu erreichen scene.rotation.y -= 0.015; renderer.render(Szene, Kamera); } Hinzufügen von Klickinteraktionen Wenn wir in der
Die grundlegenden Schritte der Codeimplementierung sind: Koordinaten der Maus auf dem Bildschirm abrufen //Raycaster- und Mausvariablen deklarieren var raycaster = new THREE.Raycaster(); var Maus = neuer DREI.Vektor2(); beiMausklick = Ereignis => { //Konvertieren Sie die Bildschirmkoordinaten der Mausklickposition in Standardkoordinaten in Threejs, 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 der Schnittpunkte zwischen der Raycaster-Linie und allen Modellen. let intersects = raycaster.intersectObjects(scene.children); wenn (Schnittpunkt.Länge > 0) { Alarm('HALLO WELT') // Durch Klicken auf die verschiedenen Meshes können durch Durchqueren unterschiedliche Interaktionen ausgelöst werden, wie zum Beispiel: Lassen Sie selectedObj = intersects[0].object; wenn (selectedObj.name === 'Auto') { Alarm('Auto 🚗') } } } window.addEventListener('click', beiMausklick, false); 3D-Text hinzufügen Verwenden Sie
var loader = neuer THREE.FontLoader(); loader.load('gentilis_regular.typeface.json', Funktion (Schriftart) { var textGeo = new THREE.TextGeometry('HALLO WELT', { Schriftart: Schriftart, Größe: .8, Höhe: .8, Kurvensegmente: .05, AbschrägungDicke: .05, AbschrägungGröße: .05, bevelEnabled: wahr }); var textMaterial = neues THREE.MeshPhongMaterial({ Farbe: 0x03c03c }); var mesh = neues THREE.Mesh(textGeo, textMaterial); mesh.position.set(0, 3.8, 0); Szene.Hinzufügen(Netz); }); Optimierung Jetzt ist das Laden des Modells im Wesentlichen abgeschlossen, aber das Volumen der Installieren
Kopieren Sie das Obj-Modell in das folgende Verzeichnis
Transkodierungsanweisungen ausführen
Wie in der Abbildung gezeigt, wird der obige Inhalt angezeigt und die Transkodierung ist abgeschlossen. Vergleicht man die Dateigrößen vor und nach der Konvertierung, beträgt in diesem Beispiel die ursprüngliche Dateigröße von Vollständiger Code var Modell = erforderlich('@/assets/models/kas.gltf'); Var-Container, Statistiken, Steuerelemente; var Kamera, Szene, Renderer, Licht, Modell; Klasse Kas erweitert React.Component { rendern () { zurückkehren ( <div id="kas"></div> ) } componentDidMount() { dies.initThree(); } initDrei () { init(); animieren(); Funktion init () { Container = Dokument.getElementById('kas'); Szene = neue DREI.Szene(); Szene.Nebel = neuer THREE.Nebel(0xa0a0a0, 200, 1000); // Perspektivkamera: Sichtfeld, Seitenverhältnis, Nahebene- und Fernebene-Kamera = neue THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0,1, 1000); Kamera.Position.eingestellt(600, 20, -200); Kamera.lookAt(neu DREI.Vektor3(0, 0, 0)); // Halbkugel-Lichtquelle: Erstellen Sie eine natürlichere Lichtquelle für Außeneffekte light = new THREE.HemisphereLight(0xffffff, 0x444444); Licht.Position.Set(0, 20, 0); Szene.Hinzufügen(Licht); Licht = neues THREE.DirectionalLight(0xffffff); Licht.Position.Set(0, 20, 10); Licht.castShadow = wahr; Szene.Hinzufügen(Licht); // Umgebungslicht var ambiColor = '#0C0C0C'; var ambientLight = neues THREE.AmbientLight(ambiColor); Szene.Hinzufügen(Umgebungslicht); // Raster var grid = new THREE.GridHelper(1000, 100, 0x000000, 0x000000); Gitter.Material.Deckkraft = 0,1; Gitter.Material.transparent = wahr; Rasterposition.set(0, -240, 0); Szene.Hinzufügen(Raster); // GLTF-Modell laden var loader = new THREE.GLTFLoader(); loader.load(Modell, Funktion (Objekt) { Objekt.Szene.Traverse(Funktion (Kind) { wenn (Kind.istMesh) { Kind.castShadow = wahr; Kind.receiveShadow = wahr; } }); Objekt.Szene.Rotation.y = Math.PI / 2; Objekt.Szene.Position.Set(0, -240, 0); Objekt.Szene.Skalierung.Satz (0,33, 0,33, 0,33); Modell = Objekt.Szene; Szene.Hinzufügen(Objekt.Szene); }); Renderer = neuer THREE.WebGLRenderer({ Antialiasing: true, Alpha: true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(Fenster.innereBreite, Fenster.innereHöhe); renderer.setClearAlpha(0); renderer.shadowMap.enabled = true; container.anhängenUntergeordnetesElement(renderer.domElement); window.addEventListener('Größe ändern', () => { Kamera.Aspekt = Fenster.Innenbreite / Fenster.Innenhöhe; Kamera.updateProjectionMatrix(); renderer.setSize(Fenster.innereBreite, Fenster.innereHöhe); }, FALSCH); Statistiken = neue Statistiken(); Container.Untergeordnetes Anhängen(stats.dom); } Funktion animieren () { var Uhr = neue DREI.Uhr() requestAnimationFrame(animieren); var delta = clock.getDelta(); Szene.Rotation.y -= 0,015; renderer.render(Szene, Kamera); statistiken.update(); } // Klickereignis hinzufügen // 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 durch die Mausklickposition, 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 der Schnittpunkte zwischen der Raycaster-Linie und allen Modellen var intersects = raycaster.intersectObjects(scene.children); wenn (Schnittpunkt.Länge > 0) { Alarm('HALLO WELT') } } window.addEventListener('click', beiMausklick, false); } } Andere Designelemente In diesem Artikel wird hauptsächlich das Laden von Flüssiger Hintergrund
Informationen zu Acid-Effekt-Schriftarten wie Metall-, Neon- und Glitch-Effekten finden Sie in meinem anderen Artikel „Erzielen Sie visuelle Effekte im Stil von Cyberpunk 2077 mit nur wenigen CSS-Schritten“ oder Sie können die Designgenerierung verwenden. Aus Zeitgründen werden der Metalleffekt-Text in diesem Projekt und der Text in der Bannerüberschrift dieses Artikels alle mithilfe einer Website zur Generierung von Online-Kunstschriftarten generiert. Interessierte Schüler können versuchen, ihn selbst zu entwerfen. Weitere Optimierungen in der Zukunft
Abschließend möchte ich Ihnen einige tolle GitHub-Homepage: kodeclubs: Ein Low-Polygon Sneaker-Anzeige: Dynamische Sandskulpturentanz: Sandskulpturen-Tänzertiere. Zenly-Software: Chinesische Homepage Verweise three.js: https://threejs.org obj2gltf: https://github.com/CesiumGS/obj2gltf Über 200 Seiten mit kostenlosen 3D-Modellen https://www.turbosquid.com Kostenlose 3D-Statuen: https://threedscans.com Kostenlose 3D-Modelle: https://free3d.com Online-Generierung künstlerischer Schriftarten: https://cooltext.com Was ist Acid Design: https://www.shejipi.com/361258.html Autor: dragonir Artikel-URL: https://www.cnblogs.com/dragonir/p/15350537.html Dies ist das Ende dieses Artikels über die Verwendung von three.js zur Implementierung einer coolen 3D-Seite im Acid-Stil. Weitere verwandte Inhalte zu 3D-Seiten im Acid-Stil von three.js finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Erfahren Sie mehr über den Hyperlink A-Tag
>>: Zusammenfassung des Wissens zu MySQL-Sperren
Bei der Verwendung von Docker wurden mehrere Prob...
Inhaltsverzeichnis Vom Vater zum Sohn: Sohn zum V...
Vorwort Wenn wir von Linux-Systemen sprechen, mei...
Frage Die feste CSS-Positionierung position:fixed...
Inhaltsverzeichnis Installieren Komponenten impor...
Das Jahr ist zu Ende und es gibt weniger Aufgaben...
Vorwort: Wenn wir eine Tabelle löschen möchten, v...
Das Anwendungsszenario ist: Die Iframe-Seite hat k...
Inhaltsverzeichnis 1. Einführung in grundlegende ...
In diesem Artikel finden Sie das grafische Tutori...
Die Unterschiede zwischen „execute“, „executeUpda...
Es gibt zwei Möglichkeiten, mit Nginx mehrere Pro...
1 Herunterladen Die Adresse lautet: https://dev.m...
Ich habe einmal versprochen, dass ich so lange wei...
Inhaltsverzeichnis 1. Verwendung 2. Lösen Sie das...