[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Three.jsで3DCGを作ろう!〜テキストを3D空間に配置する〜

Three.jsで3DCGを作ろう!〜テキストを3D空間に配置する〜

Yuya Nishizawa

Yuya Nishizawa

新卒ブログとは?
2024年4月に新卒入社したLIGメンバーが、日々の学びや気づきを綴るブログです。彼らがふだんどんなことを学んでいるのか、気軽にのぞいてみてください。

こんにちは、新米エンジニアのにっしーです。

Webサイトでの表現の幅を広げたいと思い、Webブラウザ上で3DCGを制作することができるJavaScriptのライブラリ「Three.js」を勉強しています。

今回の連載では、Three.jsを使った制作物を紹介していきたいと思います(サボり癖があるので、サボらないようにという自戒の意味合いも込めて……)。

同じようにThree.jsの勉強をされている、みなさんの参考になれば幸いです!

※導入方法などは端折らせていただきますので、あらかじめご了承ください。

完成系

さっそくですが、今回作成したものがこちらです!

実装方法

1. シーン、カメラ等もろもろを準備

これは、Three.jsを作る上である程度お作法のようなものなので、深掘りすることはせず準備していきます。

気になる方はこちらのブログで細かく紹介されているので、ご覧ください。

javascript

// canvasを取得
const canvas = document.getElementById(“canvas”) as HTMLCanvasElement;
if (!canvas) return;

// シーン

const scene = new THREE.Scene();

// サイズ

const sizes = {
width: window.innerWidth,
height: window.innerHeight,
};

// カメラ

const camera = new THREE.PerspectiveCamera(
75,
sizes.width / sizes.height,
0.1,
3000
);
camera.position.set(0, 0, 100);
scene.add(camera);

// レンダラー

const renderer = new THREE.WebGLRenderer({
canvas: canvas,
antialias: true,
});
renderer.setSize(sizes.width, sizes.height);
renderer.setPixelRatio(window.devicePixelRatio);

// コントローラー

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;

//メッシュ
// 2で作成。

// ブラウザのリサイズ処理

const => {
sizes.width = window.innerWidth;
sizes.height = window.innerHeight;
camera.aspect = sizes.width / sizes.height;
camera.updateProjectionMatrix();
renderer.setSize(sizes.width, sizes.height);
renderer.setPixelRatio(window.devicePixelRatio);
};
window.addEventListener(“resize”, onWindowResize);

// クリーンアップ関数

return () => {
window.removeEventListener(“resize”, onWindowResize);
renderer.dispose();
};

2. メッシュを用意

ここから実際に画面に映る、文字とその周りに散らばるボックスを作成していきます。

2-1. 文字の作成

最初に文字をtextGeometryを使い、作成していきます。

javascript

// 表示させたい文字

const text = “NISSY”;

// Fonts

const fontLoader = new FontLoader();
fontLoader.load(“fonts/helvetiker_bold.typeface.json”, (font) => {
const textGeometry = new TextGeometry(text, {
font: font,
size: 10,
height: 5,
curveSegments: 12,
bevelEnabled: true,
bevelThickness: 0.04,
bevelSize: 0.02,
bevelOffset: 0,
bevelSegments: 5,
});
textGeometry.center();

// material

const textMaterial = new THREE.MeshNormalMaterial();

// mesh

const textMesh = new THREE.Mesh(textGeometry, textMaterial);

// シーンにテキストを追加

scene.add(textMesh);
});

2-2. 文字の周りに散らばるボックスを用意

次に、周りに散らばっているボックスをboxGeometryを使用して作成していきます。

先ほどのコードに追加してきます!

javascript

// 表示させたい文字

const text = “NISSY”;

// Fonts

const fontLoader = new FontLoader();
fontLoader.load(“fonts/helvetiker_bold.typeface.json”, (font) => {
const textGeometry = new TextGeometry(text, {
font: font,
size: 10,
height: 5,
curveSegments: 12,
bevelEnabled: true,
bevelThickness: 0.04,
bevelSize: 0.02,
bevelOffset: 0,
bevelSegments: 5,
});
textGeometry.center();

// material

const textMaterial = new THREE.MeshNormalMaterial();

// mesh

const textMesh = new THREE.Mesh(textGeometry, textMaterial);

// シーンにテキストを追加

scene.add(textMesh);

// ここから追加。
// ボックスを用意

const boxGeometry = new THREE.BoxGeometry(10, 10, 10);
const material = new THREE.MeshNormalMaterial();

// ボックスをランダムに配置

for (let i = 0; i < 100; i++) { const box = new THREE.Mesh(boxGeometry, material);

// 座標の計算

box.position.x = (Math.random() – 0.5) * 200; box.position.y = (Math.random() – 0.5) * 150; box.position.z = (Math.random() – 0.5) * 100;

// 回転の計算

box.rotation.x = Math.random() * Math.PI; box.rotation.y = Math.random() * Math.PI;

// 大きさの計算

const scale = Math.random(); box.scale.set(scale, scale, scale);

//シーンに追加

scene.add(box); } });

3. レンダリング(描画)

javascript

// レンダリング

const animate = () => {
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();

完成!

まとめ

今回「Three.jsで3DCGを作ろう!」の1回目として自分の名前をデコデコにしてみました!

実装前はハードルが高いと感じていたのですが、実際作ってみるとThree.jsが基本的な機能を使いやすい形で提供してくれているおかげで、初心者でも比較的スムーズに楽しく進めることができました。また、パーツを組み合わせていくのがプラモを作るみたいで面白かったです。

引き続きThree.js勉強をしていこうと思いますので、第2回「Three.jsで3DCGを作ろう!」でお会いしましょう!

にっしーでした。

新卒採用募集中!
LIGは、Webデザインからグローバルなシステム開発まで、幅広い分野のコンサルティングから制作、運用までおこなう企業です。

  • 日本・フィリピン・ベトナムでの活躍チャンス
  • 最先端技術と多言語環境での成長
  • 有識者による月1回の勉強会

現在、海外拠点(フィリピン、ベトナム)に関われるエンジニアを募集しています。日本だけじゃなく世界で活躍することに興味のある方は、以下よりぜひご応募ください!

新卒採用ページへ

この記事のシェア数

フロントエンドエンジニアとして主に大手メーカーのWebサイト制作・保守業務を担当。JS、React、Nextのフレームワークに関しての深い知見を持つ。中学時代からIT分野に興味を持ち、高校でWebプログラミングの基礎を学ぶ。専門学校卒業を経て2024年に新卒入社。

このメンバーの記事をもっと読む
LIG新卒ブログ【2024】 | 12 articles
10年以上の開発実績があるLIGが、最適な開発体制や見積もりをご提案します
相談する サービス概要を見る