LoginSignup
0
0

Three.js図解2: ジオメトリの比較

Last updated at Posted at 2023-12-25

はじめに

現在、Three.jsの勉強中です。その際に、詳細を調べていると、色々な描画スタイルが見つかります。この記事では、各スタイルを実際に比較して違いを理解していきたいと思います。

ジオメトリの比較

今回の記事ではジオメトリの比較をしていきます。この記事にて、単純な立方体のアニメーションを描画しました。Three.jsでは立方体の他に様々な形状が用意されています。ここでは、1シーンで3つのジオメトリを比較していきます。

ソースコードのひな形

次のソースコードを使用します。

index.html

index.html
<!DOCTYPE html>
<html lang="ja">

  <head>
    <meta charset="utf-8">
    <title>Three.jsの図解2</title>
    <style>
      body {
        margin: 0;
      }
    </style>

    <!-- CDNからThree.jsのインポート -->
    <script type="importmap">
      {
        "imports": {
          "three": "https://unpkg.com/three@v0.159.0/build/three.module.js",
          "three/addons/": "https://unpkg.com/three@v0.159.0/examples/jsm/"
        }
      }
    </script>
  </head>

  <body>
    <!-- three.jsを使ったシーンのインポート -->
    <script type="module" src="./main.js"></script>
  </body>

</html>

main.js

描画オブジェクトの実装 に注目してください。
geometries 配列の宣言にある new THREE.ジオメトリ()ジオメトリ という箇所を変更します。ライトの実装 については後日に改めてしっかりとまとめたいと思います。

main.js (ひな形)
import * as THREE from 'three';

/* シーンの実装 */
const scene = new THREE.Scene();

/* カメラの実装 */
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);

/* レンダラーの実装 */
const renderer = new THREE.WebGLRenderer();               // インスタンスの生成
renderer.setSize(window.innerWidth, window.innerHeight);  // サイズの設定
document.body.appendChild(renderer.domElement);           // HTMLへの追加

/* ライトの実装 */
const color = 0xFFFFFF;                                     // 光の色
const intensity = 3;                                        // 光の強度
const light = new THREE.DirectionalLight(color, intensity); // ライトの生成
light.position.set(0, 0, 5);                                // ライトの配置
scene.add(light);                                           // シーンへの追加

/* 描画オブジェクトの実装 */
const geometries = [
  new THREE.ジオメトリ(),
  new THREE.ジオメトリ(),
  new THREE.ジオメトリ()
];
const material = new THREE.MeshLambertMaterial({ color: 0x00ff00 });  // マテリアルの生成
let obejects = [];

for (let i = 0; i < geometries.length; i++) {
  obejects.push(new THREE.Mesh(geometries[i], material)); // メッシュの生成
  scene.add(obejects[i]);                               // シーンへの追加
}

obejects[0].position.x = -3;
obejects[1].position.x = 0;
obejects[2].position.x = +3;

/* カメラの移動 */
camera.position.z = 5;

/* アニメーション関数の定義 */
function animate() {
  requestAnimationFrame(animate); // 定期的な関数呼び出し

  /* 回転するアニメーション処理 */
  for (let i = 0; i < geometries.length; i++) {
    obejects[i].rotation.x += 0.01;  // x軸方向
    obejects[i].rotation.y += 0.01;  // y軸方向
  }

  /* 再レンダリング */
  renderer.render(scene, camera);
}

animate(); // アニメーション関数の実行

比較1

次の動画にて、左に BoxGeometry 、中央に CapsuleGeometry 、右に CircleGeometry を示します。

1.gif

BoxGeometry

直方体を構成するジオメトリです。次に構文を示します。ポリゴンを区切る線のことをセグメントといいます。

const ジオメトリ = new THREE.BoxGeometry(
  横幅,
  高さ,
  深さ,
  横幅セグメント,
  高さセグメント,
  深さセグメント
);
引数 内容 デフォルト値
横幅 X軸と平行な辺の長さ 1
高さ Y軸と平行な辺の長さ 1
深さ Z軸と平行な辺の長さ 1
横幅セグメント X軸と平行な面のセグメント数 1
高さセグメント Y軸と平行な面のセグメント数 1
深さセグメント Z軸と平行な面のセグメント数 1

CapsuleGeometry

カプセル型の立体図形を構成するジオメトリです。次に構文を示します。

const ジオメトリ = new THREE.CapsuleGeometry(
  半径,
  長さ,
  キャップセグメント,
  放射状セグメント
);
引数 内容 デフォルト値
半径 カプセルの半径 1
長さ 中央にある多角柱の長さ 1
キャップセグメント カプセルの曲面の滑らかさ 4
放射状セグメント 中央にある多角柱の頂点数 8

CircleGeometry

円(多角形)の平面図形を構成するジオメトリです。次に構文を示します。

const ジオメトリ = new THREE.CircleGeometry(
  半径,
  セグメント,
  始点角度,
  角度量
);
引数 内容 デフォルト値
半径 円の半径 1
セグメント 円を構成するセグメント数(最小値: 3) 32
始点角度 円を描画し始める角度 0
角度量 描画する角度の量(円の中心角) 2*PI

比較2

次の動画にて、左に ConeGeometry 、中央に CylinderGeometry 、右に DodecahedronGeometry を示します。

2.gif

ConeGeometry

円錐(多角錐)の立体図形を構成するジオメトリです。次に構文を示します。

const ジオメトリ = new THREE.ConeGeometry(
  半径,
  高さ,
  放射状セグメント, 
  高さセグメント,
  開封するか否か,
  始点角度,
  角度量
);
引数 内容 デフォルト値
半径 底面の半径 1
高さ 円錐の高さ 1
放射状セグメント 中央にある多角柱の頂点数 32
高さセグメント Y軸と平行な面のセグメント数 1
開封するか否か 底面を描画するか否か false
始点角度 円を描画し始める角度 0
角度量 描画する角度の量(円の中心角) 2*PI

CylinderGeometry

円柱(多角柱)の立体図形を構成するジオメトリです。次に構文を示します。

const ジオメトリ = new THREE.CylinderGeometry(
  上面の半径,
  下面の半径,
  高さ,
  放射状セグメント, 
  高さセグメント,
  開封するか否か,
  始点角度,
  角度量
);
引数 内容 デフォルト値
上面の半径 円柱の上面の半径 1
下面の半径 円柱の下面の半径 1
高さ 円柱の高さ 1
放射状セグメント 中央にある多角柱の頂点数 32
高さセグメント Y軸と平行な面のセグメント数 1
開封するか否か 上面と底面を描画するか否か false
始点角度 円を描画し始める角度 0
角度量 描画する角度の量(円の中心角) 2*PI

DodecahedronGeometry

12面体の立体図形を構成するジオメトリです。次に構文を示します。

const ジオメトリ = new THREE.DodecahedronGeometry(
  半径,
  詳細
);
引数 内容 デフォルト値
半径 立体の半径 1
詳細 デフォルト値から増やすと12面体でなくなる 0

参考

  • シーンの作成

  • BoxGeometry

  • CapsuleGeometry

  • CircleGeometry

-ConeGeometry

  • CylinderGeometry

  • DodecahedronGeometry

0
0
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
0
0