2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Three.jsについての超初歩的な基本を備忘録として書いてみます。

Three.jsとは?

Three.jsは、Webブラウザ上で3Dコンテンツを制作できるJavaScriptライブラリです。通常、GLSL(シェーダー言語)を使って3Dを実装するのは大変ですが、Three.jsを利用することで、より簡単に3D空間を構築できます。

ざっくりのイメージ

3D空間を作るにはシーンと、カメラと、レンダラーが必須。

  • シーン(Scene): 3D空間そのもの。
  • カメラ(Camera): シーンを撮影するための視点。
  • レンダラー(Renderer): カメラで撮影したシーンをブラウザに表示する。

シーン(空間)上に、カメラを配置して、レンダラーが出力する。
図にするとこんなイメージ。
img-1024x590.png

これらの要素を組み合わせて3D空間を作ります。

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 0, 500); // カメラの位置を設定

const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight); // レンダラーのサイズを設定

document.body.appendChild(renderer.domElement); // レンダラーをDOMに追加

できました!

See the Pen Untitled by e2saeki (@e2saeki) on CodePen.

…空間の準備が整いますが、まだ何も配置されていないので「空の3D空間」が映し出されただけの状態です。

オブジェクトを配置する

ここになにかを配置していきます。
ひとまず基本の箱でも置いてみます。

基本のオブジェクト構造

オブジェクトを配置するには、以下の3つが必要です:

  • ジオメトリ(Geometry): オブジェクトの形状
  • マテリアル(Material): オブジェクトの見た目(色や質感など)
  • メッシュ(Mesh): ジオメトリとマテリアルを組み合わせたもの
const geometry = new THREE.BoxGeometry(100, 100, 100); // 箱のサイズ
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 緑色のマテリアル
const box = new THREE.Mesh(geometry, material); // メッシュに形状と素材を指定

scene.add(box); // シーンに追加

照明を追加する

現実世界と同じように、3D空間にも光源が必要です。光を追加しないと、真っ暗な空間にオブジェクトが配置されているだけになります。

const light = new THREE.DirectionalLight(0xffffff); // 白色の平行光源
light.position.set(1, 1, 1); // ライトの位置を設定
scene.add(light); // シーンに追加

これで箱が照らされるようになります。

シーンの描画

最後に、作成したシーンをブラウザに描画します。

 renderer.render(scene, camera);

3Dの空間に箱が置かれたものを作ることができました!

See the Pen Untitled by e2saeki (@e2saeki) on CodePen.

アニメーションを追加

ここでひとつ重大な事実…ここのカメラってビデオではないのです。
つまり一枚の静止画しか映し出されません。

でもせっかく3Dだし?色々動かしたいですよね。

基本的なアニメーション

Three.jsではrequestAnimationFrameを使用して、フレームごとにシーンを更新します。

function animate() {
  requestAnimationFrame(animate); // 毎フレーム自身を呼び出す
  
  box.rotation.x += 0.01; // 箱を回転
  box.rotation.y += 0.01;

  renderer.render(scene, camera); // シーンを描画
}

animate();

GSAPでアニメーション

より高度なアニメーションには、GSAPライブラリを使用するのがおすすめです。たとえば、以下のコードで箱を回転させ続けることができます。

gsap.to(box.rotation, { duration: 10, y: Math.PI * 2, x: Math.PI * 2, repeat: -1 });

See the Pen sample02 by e2saeki (@e2saeki) on CodePen.

おまけ:スクロール連動のアニメーション

GSAPを使えば、スクロールトリガーを設定して、スクロールに連動した3Dアニメーションも実現できます。

gsap.registerPlugin(ScrollTrigger);

ScrollTrigger.create({
 trigger: box,
 start: 'top center',
 end: 'bottom center',
 onUpdate: (self) => {
   box.rotation.y = self.progress * Math.PI * 2; // スクロール量に応じて回転
 },
});

See the Pen sample03 by e2saeki (@e2saeki) on CodePen.

まとめ

Three.jsを使うことで、意外と簡単に3D空間を作ることができます。基本的な流れとしては:

  • シーン、カメラ、レンダラーを作成する
  • オブジェクトやライトを追加する
  • アニメーションやインタラクションを実装する

初歩的なまとめですがなにかの参考になれば

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?