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

HTML-Bildlaufleisten-Textbereichsattributeinstellung

1. Überlaufinhalt-Überlaufeinstellungen (festlegen...

Sehr praktische Methode zur Implementierung des Tomcat-Startskripts

Vorwort Es gibt ein Szenario, in dem das Unterneh...

Detaillierte Erklärung zur Verwendung von CSS3 RGB und RGBA (transparente Farbe)

Ich glaube, jeder Mensch ist sehr sensibel für Fa...

Lösen Sie das MySQL 5.7.9 Version sql_mode=only_full_group_by Problem

MySQL 5.7.9 Version sql_mode=only_full_group_by P...

Zwei Möglichkeiten zum Beenden von Bash im Docker-Container unter Linux

Wenn Sie Bash beenden möchten, haben Sie zwei Mög...

Die beste Erklärung zu HTTPS

Guten Morgen allerseits, ich habe meinen Artikel ...