表示言語の切り替え

Topics

憧れの3D表現(WebGL)に挑んでいたあの頃 ― Three.jsとBlenderで遊んでみた話

  • column

昔、いろんなWebサイトを眺めては、ファーストビューでグルッと動くオブジェクトや、奥行き感のあるアニメーションに「すごー!」と心を奪われていました。当時は「自分でもこんなの作ってみたい!」と思い立って、Three.jsBlenderに手を出してみた時期がありました。

そんな憧れで入社したリベロジックですが、結果から言うと…… 最近は業務系アプリやヘッドレスCMS構築など、もう少し堅実な実装ばかりの日々ですね(笑)別にディスってないですよ〜!

はや4年目に突入したいま、当時の“動くWeb”への憧れを思い出しながら、WebGLまわりの基本を軽く振り返ってみたいと思います。

WebGLとは

WebGLとは、3DグラフィックスをWebサイト上で表示する技術で、ChromeやFirefox、Safariなど、主要なブラウザすべてで動作が可能です。

大昔はFlash Playerといったプラグインが主流でしたが、スマートフォンでは動かしにくいという問題がありました。

その点、WebGLはネイティブ対応しているため、次に訪れたモバイル時代の3D表現を切り開いた技術とも言えます。

実際にやってみた

Three.jsでブラウザに3Dを表示してみる

Three.jsはJavaScriptを用いて手軽に3Dコンテンツを作成できる、商標利用可能なライブラリです。

まずWebGLの概念として、Renderer、Scene、Cameraが必要となります。

RendererはThree.js のメイン オブジェクトです。 と SceneCameraに渡すと、カメラの錐台Renderer内にある 3D Sceneの部分が2D 画像としてキャンバスにレンダリング (描画) されます。

WebGLの概念、Renderer、Scene、Cameraの関係性
const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(
  1000, // 視野角
  window.innerWidth / window.innerHeight, // 側面
  75, // 近く
  1000 // 遠い
);
camera.position.set(0, 0, 400);

//マウスで制御
const controls = new OrbitControls(camera, document.body);

//html側の<canvas id="myCanvas"></canvas>を取得
const renderer = new THREE.WebGLRenderer({
  canvas: document.querySelector("#myCanvas"),
  antialias: true,
});

//setSize()メソッドでサイズを設定
renderer.setSize(window.innerWidth, window.innerHeight);
//背景色も変更可能
renderer.setClearColor("#000")

//htmlの<canvas id="myCanvas"></canvas>へ流し込み
document.body.appendChild(renderer.domElement);

そして3D立方体部分はメッシュという表示オブジェクトを使用して作成します。 メッシュを作るには、ジオメトリ(形状)とマテリアル(素材)を用意する必要があります。

//ジオメトリ(立方体)
const geometry = new THREE.BoxGeometry(100, 100, 100)

//マテリアル(色)
const material = new THREE.MeshNormalMaterial
const box = new THREE.Mesh(geometry, material);
//Sceneに追加
scene.add(box);

//ライト
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1);
//Sceneに追加
scene.add(light);

最後にアニメーションをつけます。

周りのパーティクル実装について今回は割愛します!

function animate() {
  requestAnimationFrame(animate);

  box.rotation.x += 0.005;
  box.rotation.y += 0.005;
  renderer.render(scene, camera);
}

animate()

設定したcameraとgeometry、material、lightを入れたsceneをレンダリングするとブラウザに描画されます。

Blenderで3Dモデリングを作成してみる

Blenderは3Dモデリング、アニメーション、レンダリング、ゲーム開発、動画編集まで、3D制作の全工程を無料でカバーするオープンソースの統合型ソフトウェアです。Blender単体ではWebGLサイトは作れません。

BlenderもThree.jsの概念と同じでメッシュオブジェクトで形状を作成し、マテリアルで色や物質の質感をつけます。そしてライトで光の当て方、影の出し方を調整し、カメラの位置や方向を調整しレンダリングを行います。

面や線、点を調整しながらメッシュオブジェクトを整形していきます。
マテリアル・ノードでカラーやテクスチャーをつけていきます。

グラデーションにしたり、金属っぽくしたり、発光させたり、ノードを組み合わせることで本物のような質感を作っていくことができます。

参考:https://www.youtube.com/watch?v=DsNZzUZPhw4

Blenderで作成した3DモデリングをThree.jsでブラウザに表示してみる

Blenderで作成した3Dを.glbファイルに書き出し、Three.jsに組み込みます。

OrbitControlsGLTFLoaderDRACOLoaderの各機能をThree.jsライブラリからインポートします。

OrbitControlsは、カメラをマウスで制御するためのユーティリティであり、GLTFLoaderDRACOLoaderは、それぞれGLTF形式の3Dモデルと、その圧縮バージョンであるDRACO形式の3Dモデルを読み込むためのユーティリティです。

ブラウザにモデリングしたりんごを表示させました!

ただ、Blenderで作成したモデルをThree.jsでブラウザに表示した際、レンダリング環境の違いとマテリアルの互換性により色味やテクスチャーが異なって見えてしまいます。思った通りの見た目にするには少し調整が必要です。

日々の案件はCMS連携や業務アプリのフロントエンド設計 / 構築ばかりで、私自身の業務としては、あまり3D表現に触れることは少なくなりました。

でも、こうして遊んでみると、「やっぱり面白いな」と改めて感じます。

あの頃の動くWebへの憧れがあったからこそ、モダンな技術にも自然と惹かれていったのかもしれません。

さぁ、今日もNextだNuxtだ!

現場に戻って、また別のかたちで動くWebを作っていきます。 🚀

この記事を書いた人

マークアップを中心に、JavaScriptやReact、Next.jsを使ってフロントエンドの開発をやっています。自分が関わったサイトが無事に公開されると嬉しかったりします!趣味はギターを弾くこと。コードは書くのも弾くのもどっちも楽しいです!

ひらっち

フロントエンドエンジニア / 2022年入社

このスタッフの記事を見る

安心のチーム体制とスピードのある対応力が自慢

リベロジックでは、ベテランスタッフが積極的にプロジェクトを推進するため、お客様から高く評価されています。
プロジェクトマネージャー、ディレクターをきちんとアサインし、プロジェクト全体をスムーズに進行することを心掛けています。 不必要なフルコミットでのコスト増加を防ぎ、適材適所にリソースを配分するスタイルで、業務内容の把握から見積作成/提出の速さにも定評があります。

当社はSES的な常駐業務等は積極的に行っておりませんので予めご了承ください。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webexなど、ほぼすべての主要なプロジェクト管理ツールやチャットツールをご利用いただけます。

Webのお悩みご相談ください。

ケーススタディ