VorwortHallo zusammen, hier ist der CSS-Assistent – alphardex. Als ich zuvor auf ausländischen Websites gesurft habe, stellte ich fest, dass die Texte einiger Websites in 3D-Grafiken eingraviert waren und sich auf den Grafiken bewegen ließen. Der visuelle Effekt war ziemlich gut, deshalb wollte ich auch three.js verwenden, um zu versuchen, diesen Effekt zu reproduzieren. Das obige Bild ist nur einer von vielen Effekten. Lasst uns anfangen. VorbereitungDas von mir selbst gepackte three.js Template: Three.js Starter Leser können auf die untere rechte Ecke klicken, um eine Kopie zu erstellen, bevor sie mit diesem Projekt beginnen Für dieses Projekt sind Bitmap-Schriftarten erforderlich. Sie können den Schriftcode direkt in das HTML der Demo kopieren. Eine Anmerkung: Die three-bmfont-text-Bibliothek hängt von der globalen three.js ab, daher müssen Sie three.js noch einmal in JS importieren, wie unten gezeigt Umsetzungsideen
positivDas Gerüst aufbauen <div Klasse="relativer W-Bildschirm H-Bildschirm"> <div Klasse="kinetischer-text w-voll h-voll bg-blau-1"></div> <div Klasse="Schriftart"> <Schriftart> Eine Reihe von Schriftcodes aus dem Demo-Lebenslauf</font> </div> </div> :Wurzel { --Blaufarbe-1: #2c3e50; } .bg-blau-1 { Hintergrund: var(--blue-color-1); } importiere createGeometry von „https://cdn.skypack.dev/[email protected]“; importiere MSDFShader von „https://cdn.skypack.dev/[email protected]/shaders/msdf“; importiere parseBmfontXml von „https://cdn.skypack.dev/[email protected]“; const font = parseBmfontXml(document.querySelector(".font").innerHTML); const fontAtlas = "https://i.loli.net/2021/02/20/DcEhuYNjxCgeU42.png"; const kineticTextTorusKnotVertexShader = `(Vertex-Shader-Code, derzeit leer, Einzelheiten siehe unten)`; const kineticTextTorusKnotFragmentShader = `(Fragment-Shader-Code, derzeit leer, Einzelheiten siehe unten)`; Klasse KineticText erweitert Base { Konstruktor(sel: string, debug: boolean) { super(sel, debug); this.cameraPosition = neuer DREI.Vektor3(0, 0, 4); diese.Uhr = neue DREI.Uhr(); diese.meshConfig = { Torusknoten: vertexShader: kinetischerTextTorusKnotVertexShader, fragmentShader: kinetischerTextTorusKnotFragmentShader, Geometrie: neu THREE.TorusKnotGeometry(9, 3, 768, 3, 4, 3) } }; this.meshNames = Objekt.keys(this.meshConfig); diese.params = { Netzname: "Torusknoten", Geschwindigkeit: 0,5, Schatten: 5, Farbe: "#000000", Frequenz: 0,5, Text: "ALPHARDEX", KameraZ: 2,5 }; } // Asynchron initialisieren init() { dies.createScene(); dies.createPerspectiveCamera(); dies.createRenderer(true); warte auf this.createKineticText(this.params.text); dies.createLight(); dies.createOrbitControls(); dies.addListeners(); dies.setLoop(); } // Dynamischen Text erstellen async createKineticText(text: string) { warte auf dies.createFontText(text); dies.createRenderTarget(); dies.createTextContainer(); } } Laden und Erstellen von Schriftarten Laden Sie zunächst die Schriftdatei und legen Sie Form und Material fest. Mit diesen beiden können Sie ein Schriftobjekt erstellen. Klasse KineticText erweitert Base { loadFontText(text: Zeichenfolge): beliebig { returniere neues Promise((auflösen) => { const fontGeo = createGeometry({ Schriftart, Text }); const loader = neues THREE.TextureLoader(); loader.load(fontAtlas, (Textur) => { const fontMat = neues THREE.RawShaderMaterial( MSDFShader({ Karte: Textur, Seite: DREI.Doppelseite, transparent: wahr, negieren: falsch, Farbe: 0xffffff }) ); lösen({ fontGeo, fontMat }); }); }); } asynchron createFontText(text: string) { const { fontGeo, fontMat } = warte auf dies.loadFontText(text); const textMesh = this.createMesh({ Geometrie: fontGeo, Material: Schriftmatte }); textMesh.position.set(-0.965, -0.525, 0); textMesh.rotation.set(ky.deg2rad(180), 0, 0); textMesh.scale.set(0.008, 0.025, 1); dies.textMesh = textMesh; } } Shader Vertex-Shader Universelle Vorlage, verwenden Sie einfach CV variierender Veränderlicher Vektor 2 vUv; variierender Vektor 3 vPosition; void main(){ vec4 Modellposition = Modellmatrix * vec4 (Position, 1.); vec4 Ansichtsposition = Ansichtsmatrix * Modellposition; vec4 projiziertePosition=Projektionsmatrix*Ansichtsposition; gl_Position = projizierte Position; vUv=uv; vPosition=Position; } Fragment-Shader Verwenden Sie die Fract-Funktion, um eine wiederholte Textur zu erstellen, fügen Sie eine Verschiebung hinzu, damit sich die Textur im Laufe der Zeit bewegt, und verwenden Sie dann die Clamp-Funktion, um den Bereich des Schattens entsprechend der Größe der Z-Achse zu begrenzen. Dies bedeutet, dass der Schatten umso stärker ist, je weiter Sie vom Bildschirm entfernt sind, und umgekehrt, dass der Schatten umso heller ist, je näher Sie am Bildschirm sind. einheitlicher Sampler2D uTexture; einheitlicher Gleitkommawert uTime; gleichmäßiger Gleitkommawert uVelocity; gleichmäßiger Float uShadow; variierender Veränderlicher Vektor 2 vUv; variierender Vektor 3 vPosition; void main(){ vec2 Wiederholung = vec2(12.,3.); vec2 wiederholtUv=vUv*Wiederholung; vec2-Verschiebung=vec2(uTime*uVelocity,0.); vec2 uv=Bruch(wiederholtes UV+Verschiebung); vec3 Textur = Textur2D (uTexture, uv).rgb; // Textur*=vec3(uv.x,uv.y,1.); float shadow = clamp (vPosition.z / uShadow, 0., 1.); // weiter dunkler (auf 0). vec3 Farbe = vec3(Textur*Schatten); gl_FragColor = vec4(Farbe,1.); } Der Text wird nun auf dem Bildschirm angezeigt Erstellen eines Renderziels Um das Schriftobjekt selbst als Textur zu verwenden, wird ein Renderziel erstellt Klasse KineticText erweitert Base { erstelleRenderTarget() { const rt = neues THREE.WebGLRenderTarget( Fenster.innereBreite, Fenster.innereHöhe ); dies.rt = rt; const rtCamera = neue THREE.PerspectiveCamera(45, 1, 0,1, 1000); rtCamera.position.z = this.params.cameraZ; diese.rtCamera = rtCamera; const rtScene = neue DREI.Szene(); rtScene.add(dieses.textMesh); diese.rtScene = rtScene; } } Erstellen eines Schriftartcontainers Erstellen Sie einen Container, fügen Sie das Schriftobjekt selbst als Textur an und wenden Sie dann die Animation an, um es fertigzustellen. Klasse KineticText erweitert Base { erstelleTextContainer() { wenn (dieses.mesh) { diese.Szene.entfernen(dieses.Netz); dieses.mesh = null; dieses.Material!.entsorgen(); dieses.material = null; } this.rtScene.background = neue DREI.Farbe(this.params.color); const meshConfig = diese.meshConfig[diese.params.meshName]; Konstante Geometrie = MeshConfig.Geometrie; const material = neues DREI.ShaderMaterial({ vertexShader: meshConfig.vertexShader, fragmentShader: meshConfig.fragmentShader, Uniformen: uZeit: { Wert: 0 }, uGeschwindigkeit: Wert: this.params.velocity }, uTextur: { Wert: this.rt.texture }, uShadow: Wert: this.params.shadow }, uFrequenz: { Wert: this.params.frequency } } }); dieses.material = material; const mesh = dies.createMesh({ Geometrie, Material }); dies.mesh = Mesh; } aktualisieren() { wenn (diese.rtScene) { dies.renderer.setRenderTarget(dieses.rt); dieser.Renderer.render(diese.rtSzene, diese.rtKamera); this.renderer.setRenderTarget(null); } const elapsedTime = this.clock.getElapsedTime(); wenn (dieses.Material) { this.material.uniforms.uTime.value = verstrichene Zeit; } } } Vergessen Sie nicht, die Kamera weiter weg zu bewegen this.cameraPosition = neuer DREI.Vektor3(0, 0, 40); Der kokette dynamische Text erscheint :) Projektgalerie Kinetischer Text Die Demo enthält mehr Formen als die, die in diesem Artikel erstellt wurden. Probieren Sie ruhig ein bisschen damit aus. ZusammenfassenDies ist das Ende dieses Artikels darüber, wie Sie mit three.js dynamische 3D-Texteffekte erzielen. Weitere verwandte 3D-Dynamiktextinhalte mit 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:
|
<<: MySQL 5.6.33 Installations- und Konfigurations-Tutorial unter Linux
>>: Implementierung einer nicht geheimen SSH-Kommunikation in Linux
Vorwort Wer schon einmal mit MySQL gespielt hat, ...
In HTML wird das <img>-Tag verwendet, um ei...
Inhaltsverzeichnis Vorwort - Vue Routing 1. Die g...
Vorwort Die Datenbank-Deadlocks, die ich zuvor er...
Wenn Sie in CSS die Eigenschaft „font-family“ ver...
Navigation und andere Dinge werden bei der täglic...
In diesem Artikel wird der spezifische Code des W...
Tatsächlich haben die drei obigen Tabellen alle d...
Hier ist eine kurze Zusammenfassung der Installat...
Das Computersystem wurde neu installiert und die ...
Vorwort Wir alle wissen, dass der Import und Expo...
HTML-Formulare werden häufig verwendet, um Benutz...
Der HTML-Kopfteil enthält viele Tags und Elemente,...
Heute bin ich etwas verwirrt über <a href="...
In einem aktuellen Projekt musste ich die Funktio...