JavaScript Three.js でテキストを作成する最初の経験

JavaScript Three.js でテキストを作成する最初の経験

効果

ここに画像の説明を挿入

まず、必要なコンポーネントを紹介します

'./build/three.js' をインポートします。
'./libs/js/controls/OrbitControls.js' をインポートします
'./libs/jsm/loaders/FontLoader.js' から FontLoader をインポートします。
'./libs/jsm/geometries/TextGeometry.js' から { TextGeometry } をインポートします。

次に、シーン、レンダラー、カメラ、コントローラーを初期化する必要があります。

		var レンダラー、シーン、カメラ、コントロール
		// シーンを初期化する function initScene() {
            シーン = 新しい THREE.Scene();
            //シーンに煙の効果を追加// パラメータ: 煙の色、煙の範囲 (近く)、煙の範囲 (遠く)
            scene.fog = 新しい THREE.Fog(0x000000, 0, 3000)
            // シーンに軸を追加します var axes = new THREE.AxesHelper(100)
            シーン.add(軸)
        }
        // レンダラー関数を初期化する initRenderer() {
            // アンチエイリアスがオンかどうか renderer = new THREE.WebGLRenderer({ antialias: true })
            レンダラー.setSize(window.innerWidth, window.innerHeight)
            レンダラー.setClearColor(0xeeeeee)
            document.body.appendChild(レンダラー.domElement);
        }
        // カメラを初期化する関数 initCamera() {
            カメラ = 新しい THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
            カメラの位置x = 50
            カメラの位置 y = 50
            カメラの位置z = 50
        }
        // コントローラを初期化する関数 initControls() {
            コントロール = 新しい THREE.OrbitControls(カメラ、レンダラー.domElement)
            controls.enableZoom = false; //ズームを有効にするかどうか;
            controls.minPolarAngle = Math.PI / 2.5; // 垂直方向の最小回転角度を正の Y 軸上で 0 度に制限します。controls.maxPolarAngle = Math.PI / 2.5; // 垂直方向の最大回転角度を正の Y 軸上で 0 度に制限します。}

光源を初期化する

		// 光源を初期化する function initLight() {
        // 白色光、光強度 1
            var pointLight = new THREE.PointLight(0xffffff, 1);
            ポイントライトの位置を0, 100, 100に設定します。
            シーンにポイントライトを追加します。
            var pointLight = new THREE.PointLight(0xffffff, 1);
            ポイントライトの位置を0, 100, -100に設定します。
            シーンにポイントライトを追加します。
        }

テキストの作成を開始する

まずフォントローダーを作成する

var ローダー = 新しい FontLoader();

フォントライブラリを読み込む

フォントライブラリリソースの読み込みに成功すると、フォントライブラリがコールバック関数に渡されます。

loader.load(src、コールバック)

フォント ライブラリ リソースは、typeface.json を通じて目的の ttf フォント ファイルを選択し、それを json ファイルに変換してから、コールバック関数でフォント ジオメトリを作成できます。

loader.load('./fonts/FZKaTong-M19S_Regular.json', 関数(レスポンス) {
               // ここでテキストを作成します})

テキストジオメトリの作成

				// テキスト バッファー ジオメトリを作成する var textGeometry = new TextGeometry('狗托吴嘉豪', {
                	// フォントタイプ font: response,
                    // フォントサイズ: 15,
                    // フォントの太さ 高さ: 1,
                    // テキスト曲線上のポイントの数。数値が大きいほど、フォント曲線は滑らかになります。curveSegments: 12,
                    // ベベル(エッジとコーナーの滑らかな遷移)をオンにするかどうか
                    ベベル有効: false、
                    // テキストのベベルの深さ bevelThickness: 0.1,
                    // ベベルと元のテキストアウトライン間の延長距離(ベベルサイズ)
                    ベベルサイズ: 0.1,
                    // ベベルセグメント数 bevelSegments: 3
                })
				//テキストマテリアル //マテリアル配列を使用 var textMaterial = [
                    // 最初の項目はテキストの前面と背面を変更します new THREE.MeshPhongMaterial( { color: 0x00ff00, flatShading: true } ), // 前面
                    // 2番目の項目はテキストの側(上と下)を変更します
					new THREE.MeshPhongMaterial( { color: 0x0000ff, flatShading: true } ) // サイド
                    // Phong メッシュ マテリアルは、鏡面反射ハイライトのある光沢のある表面 (塗装された木材など) をシミュレートできます。
				] 
				// テキストを作成する var text = new THREE.Mesh(textGeometry, textMaterial)

テキストジオメトリの境界矩形を計算する

幾何学的ボディは目に見えない長方形の立方体コンテナに格納されており、このコンテナのデフォルトの位置は原点であり、x 軸と z 軸の正の方向に沿って外側に伸びているため、テキストは視野の中央にないと考えられます。
この時点で、ジオメトリの外側の境界矩形を計算し、ジオメトリの位置を設定して、ジオメトリがどれだけ長くなっても常に視野の中央に配置されるように、ジオメトリの長さの半分を反対方向に移動することができます。

				// computeBoundingBox() は、現在のジオメトリの外側の境界矩形を計算します。textGeometry.computeBoundingBox();
                // console.log(textGeometry.boundingBox); 外側の境界四角形の頂点の位置を確認します // テキストの位置をテキストの長さの半分だけ左に移動します var centerOffset = -0.5*(textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x)
                text.position.x = 中心オフセット
                テキスト位置z = 0  
                シーンにテキストを追加します。

ミラーテキストを作成する

				// テキストミラーを作成する var mirror = new THREE.Mesh(textGeometry, textMaterial)
                // 180度反転 mirror.rotation.x = Math.PI
                mirror.position.x = 中心オフセット
                ミラー位置 y = -8
                シーン.add(ミラー)

半透明の平面を作成する

				// テキストミラーを作成する var mirror = new THREE.Mesh(textGeometry, textMaterial)
                // 180度反転 mirror.rotation.x = Math.PI
                mirror.position.x = 中心オフセット
                ミラー位置 y = -8
                シーン.add(ミラー)

レンダリング

		関数レンダリング() {
            レンダラー.レンダリング(シーン、カメラ);
            アニメーションフレームをリクエスト(レンダリング)
        }
        関数開始() {
            レンダラーの初期化()
            シーンを初期化します。
            カメラを初期化します。
            コントロールの初期化()
            ライトの初期化()
            初期化テキスト()
            与える()
        }
        始める()

テキストコンストラクタパラメータについて

曲線セグメントを低く設定すると、テキストがそれほど滑らかではないことがわかります。

// テキスト曲線上の点の数。点が高いほど曲線は滑らかになります。curveSegments: 1,

ここに画像の説明を挿入

ベベルをオンにすると、フォントの端が丸くなり、鋭くなくなることがわかります。

// ベベル(エッジとコーナーの滑らかな遷移)をオンにするかどうか
ベベル有効: true、

ここに画像の説明を挿入

ベベルパラメータの設定

// テキストのベベルの深さ bevelThickness: 0.1,
// ベベルと元のテキストアウトライン間の延長距離(ベベルサイズ)
ベベルサイズ: .1,
// ベベルセグメント数 bevelSegments: 3

完全なコード

<スクリプトタイプ="モジュール">
        './build/three.js' をインポートします。
        './libs/js/controls/OrbitControls.js' をインポートします
        './libs/jsm/loaders/FontLoader.js' から FontLoader をインポートします。
        './libs/jsm/geometries/TextGeometry.js' から { TextGeometry } をインポートします。
        var レンダラー、シーン、カメラ、コントロール
        // レンダラー関数を初期化する initRenderer() {
            // アンチエイリアスがオンかどうか renderer = new THREE.WebGLRenderer({ antialias: true })
            レンダラー.setSize(window.innerWidth, window.innerHeight)
            レンダラー.setClearColor(0xeeeeee)
            document.body.appendChild(レンダラー.domElement);
        }
        // シーンを初期化する function initScene() {
            シーン = 新しい THREE.Scene();
            //シーンに煙の効果を追加// パラメータ: 煙の色、煙の範囲 (近く)、煙の範囲 (遠く)
            scene.fog = 新しい THREE.Fog(0x000000, 0, 3000)
            // シーンに軸を追加します var axes = new THREE.AxesHelper(100)
            シーン.add(軸)
        }
        // カメラを初期化する関数 initCamera() {
            カメラ = 新しい THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
            カメラの位置x = 50
            カメラの位置 y = 50
            カメラの位置.z = 50
        }
        // コントローラを初期化する関数 initControls() {
            コントロール = 新しい THREE.OrbitControls(カメラ、レンダラー.domElement)
        }
        // 光源を初期化する function initLight() {
            var pointLight = new THREE.PointLight(0xffffff, 1);
            ポイントライトの位置を0, 100, 100に設定します。
            シーンにポイントライトを追加します。
            var pointLight = new THREE.PointLight(0xffffff, 1);
            ポイントライトの位置を0, 100, -100に設定します。
            シーンにポイントライトを追加します。
        }
        関数initText() {
            var ローダー = 新しい FontLoader();
            loader.load('./fonts/FZKaTong-M19S_Regular.json', 関数(レスポンス) {
                // テキストジオメトリを作成する var textGeometry = new TextGeometry('狗托吴嘉豪', {
                    フォント: 応答、
                    // フォントサイズ: 15,
                    // フォントの太さ 高さ: 4,
                    // テキスト曲線上の点の数。点が高いほど曲線は滑らかになります。curveSegments: 12、
                    // ベベル(エッジとコーナーの滑らかな遷移)をオンにするかどうか
                    ベベル有効: true、
                    // テキストのベベルの深さ bevelThickness: 0.1,
                    // ベベルと元のテキストアウトライン間の延長距離(ベベルサイズ)
                    ベベルサイズ: .1,
                    // ベベルセグメント数 bevelSegments: 3
                })
                //テキストマテリアル //マテリアル配列を使用 var textMaterial = [
                    // 最初の項目はテキストの前面と背面を変更します new THREE.MeshPhongMaterial( { color: 0x00ff00, flatShading: true } ), // 前面
                    // 2番目の項目はテキスト側(上と下)を変更します
					new THREE.MeshPhongMaterial( { color: 0x0000ff, flatShading: true } ) // サイド
                    // Phong メッシュ マテリアルは、鏡面反射ハイライトのある光沢のある表面 (塗装された木材など) をシミュレートできます。
				] 
                var テキスト = 新しい THREE.Mesh(textGeometry, textMaterial)
                // computeBoundingBox() は現在のジオメトリの境界矩形を計算します textGeometry.computeBoundingBox();
                // console.log(textGeometry.boundingBox);
                var centerOffset = -0.5*(textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x)
                text.position.x = 中心オフセット
                テキスト位置z = 0  
                シーンにテキストを追加します。
                // テキストミラーを作成する var mirror = new THREE.Mesh(textGeometry, textMaterial)
                ミラー回転x = Math.PI
                mirror.position.x = 中心オフセット
                ミラー位置 y = -8
                シーン.add(ミラー)
                // 半透明の平面を作成します。var plane = new THREE.Mesh(new THREE.PlaneBufferGeometry(200,200),new THREE.MeshBasicMaterial({color:0xffffff,opacity:.5,transparent:true}))
                平面回転x = -Math.PI / 2
                平面の位置 y = -3
                シーン.追加(平面)
            })
        }
        関数レンダリング() {
            レンダラー.レンダリング(シーン、カメラ);
            アニメーションフレームをリクエスト(レンダリング)
        }
        関数開始() {
            レンダラーの初期化()
            シーンを初期化します。
            カメラを初期化します。
            コントロールの初期化()
            ライトの初期化()
            初期化テキスト()
            与える()
        }
        始める()
    </スクリプト>

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Three.js が Facebook Metaverse 3D ダイナミック ロゴ効果を実現
  • three.js を使って立体的な矢印線を描く詳細な手順
  • three.js を使用してクールなアシッドスタイルの 3D ページ効果を実現します
  • three.js で 3D ダイナミック テキスト効果を実現する方法
  • 露滴アニメーション効果を実装するための Three.js サンプル コード
  • three.js でのマルチスレッドの使用とパフォーマンステストの詳細な説明

<<:  CSS でフロートとマージンを混合するサンプルコード

>>:  タオバオモールのホームページ上の大きな画像のデザイン構造に関する分析と意見(写真)

推薦する

HTML におけるメタの役割について (インターネットから収集および分類)

W3Cschoolではこのように説明しています<meta> 要素は、検索エンジン向けの説...

ウェブデザイナーのための超便利なツール 50 選

ウェブデザイナーになるのは簡単ではありません。デザインやアーキテクチャを考慮するだけでなく、さまざま...

CSSはグラデーションを巧みに利用して高度な背景光アニメーションを実現します

成し遂げるこの効果は CSS を使用して完全に再現することは困難です。 CSS でシミュレートされた...

CSS 兄弟要素フローティング分析の概要

float:左/右/なし; 1. 同じレベルフローティング(1)ブロックレベル要素を同じ行に表示する...

Mysql 主キー UUID と自動増分主キーの違いと利点と欠点

導入私はしばらくの間、postgresql データベースを使用していました。クラウドに移行した後、自...

便利で使いやすいウェブアプリケーションを設計するための 10 のヒント

より使いやすい Web アプリケーションを設計するための 10 のヒントをご紹介します。ヒント1: ...

vmware16 仮想マシンに共有フォルダを設定する方法

1. 仮想マシンに共有フォルダを設定します。 1. 処理する仮想マシンを選択し、右クリックして設定...

CentOS に MySQL 8.0 をインストールして設定するための詳細な手順

序文CentOS に MySQL をインストールして設定する手順は次のとおりです。文章yumソースか...

テーブルを開く際のMySQLスレッドの問題の解決方法

問題の説明最近、MySQL5.6.21サーバーがありました。アプリケーションがリリースされた後、同時...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

MySQLでテーブルを接続するいくつかの方法

MySQL テーブルでの接続方法は実は非常に簡単なので、ここではその特徴を簡単にリストします。テーブ...

Linux のメモリ管理とアドレス指定の詳細な紹介

目次1. コンセプトメモリ管理モード住所種別分類例: 2. ページ管理x86 アーキテクチャ 32 ...

JS 正規マッチングの落とし穴の記録

最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か...

MySQLのユーザー権限の確認と管理方法の詳細な説明

この記事では、例を使用して、MySQL ユーザー権限を確認および管理する方法を説明します。ご参考まで...

Ubuntu 20.04 に Xrdp サーバー (リモート デスクトップ) をインストールする方法

Xrdp は、グラフィカル インターフェイスを通じてリモート システムを制御できる Microsof...