So erzielen Sie mit three.js einen dynamischen 3D-Texteffekt

So erzielen Sie mit three.js einen dynamischen 3D-Texteffekt

Vorwort

Hallo 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.

Vorbereitung

Das 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

  1. Laden Sie die Bitmap-Schriftdatei und konvertieren Sie sie in die für das Textobjekt erforderliche Form und das erforderliche Material
  2. Erstellen eines Textobjekts
  3. Erstellen Sie ein Renderziel, das als Leinwand in einer Leinwand verstanden werden kann, da wir als nächstes das Textobjekt selbst als Textur verwenden werden
  4. Erstellen Sie einen Container für die Schriftart und fügen Sie das Textobjekt als Textur ein.
  5. Animation

positiv

Das 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.

Zusammenfassen

Dies 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:
  • Three.js realisiert den dynamischen 3D-Logoeffekt von Facebook Metaverse
  • Detaillierter Prozess zum Zeichnen dreidimensionaler Pfeillinien mit three.js
  • Verwenden Sie three.js, um coole 3D-Seiteneffekte im Acid-Stil zu erzielen
  • Three.js-Beispielcode zur Implementierung des Tautropfen-Animationseffekts
  • Detaillierte Erläuterung der Verwendung und Leistungstests von Multithreading in three.js
  • Erste Erfahrungen mit der Texterstellung mit Javascript Three.js

<<:  MySQL 5.6.33 Installations- und Konfigurations-Tutorial unter Linux

>>:  Implementierung einer nicht geheimen SSH-Kommunikation in Linux

Artikel empfehlen

Detaillierte Erklärung zur Verwendung von Bild-Tags in HTML

In HTML wird das <img>-Tag verwendet, um ei...

Tiefgreifendes Verständnis der Vue-cli4-Routing-Konfiguration

Inhaltsverzeichnis Vorwort - Vue Routing 1. Die g...

Eine vollständige Aufzeichnung eines Mysql-Deadlock-Fehlerbehebungsprozesses

Vorwort Die Datenbank-Deadlocks, die ich zuvor er...

Zusammenfassung der englischen Namen chinesischer Schriftarten

Wenn Sie in CSS die Eigenschaft „font-family“ ver...

Vue implementiert eine gleitende Navigation oben links und rechts

Navigation und andere Dinge werden bei der täglic...

WeChat Mini-Programm Lotterienummerngenerator

In diesem Artikel wird der spezifische Code des W...

Fähigkeiten zur Erstellung von Webformularen

Tatsächlich haben die drei obigen Tabellen alle d...

Beispiel für die Validierung eines JavaScript-Formulars

HTML-Formulare werden häufig verwendet, um Benutz...

Detaillierte Einführung in den HTML-Head-Tag

Der HTML-Kopfteil enthält viele Tags und Elemente,...

Der Unterschied zwischen ID- und Name-Attributen von HTML-Elementen

Heute bin ich etwas verwirrt über <a href="...

Implementierung der Breakpoint-Wiederaufnahme im Vue-Video-Player

In einem aktuellen Projekt musste ich die Funktio...