Svelte で3D表示を行うライブラリ Threlte #1: パッケージの作成とライブラリ概要

# はじめに

真っ新な状態で書くのであれば、3D ライブラリのパッケージとして Three.js がある。

そして、例えば、React の場合は [react-three-fiber](https://docs.pmnd.rs/react-three-fiber/getting-started/introduction) がある。
こういったライブラリは、Three.js の生の状態を書き溜めていくのではなく、React や Svelte の様なコンポーネント運用を前提にライブラリ設計してくれているので、Web アプリとして作っていきたい時やスケールする開発にはとてもありがたい機構だ。

では、Svelte には？という事を調べたとき、いくつか出てくるが、どうやら [sveltethree](https://svelthree.dev) というものがある。だが、これは[しばらく更新が止まっている様子](https://github.com/vatro/svelthree)だ。

そこでさらに探してみるところ、[Threlte](https://threlte.xyz) というライブラリに行き当たった。
幾つか出てくる中では導入の面構えもよく、かつ、レポジトリを見てみると現時点でも結構活発に更新が入っているようだ。これは今のところ一番よさそうだ。
ということで、これをしばらく試してみたので、基本的な使い方から応用編まで備忘録としてまとめてみる。

## 環境

* Svelte: 4.2.7
* Threlte(Core): 7.0.12

## シリーズ

後日順次展開予定。

### Main

* Svelte で 3D 表示を行うライブラリ Threlte #1: パッケージの作成とライブラリ概要
* [Svelte で 3D 表示を行うライブラリ Threlte #2: エクストラパッケージを使用する](https://qiita.com/takavfx/items/e71db089198bba1b122b)
* [Svelte で 3D 表示を行うライブラリ Threlte #3: glTF シーンを扱う](https://qiita.com/takavfx/items/aa05a313ef9e450b3731)
* [Svelte で 3D 表示を行うライブラリ Threlte #4: シーンコントロールツールセット Theatre.js for Threlte](https://qiita.com/takavfx/items/b91ba3c47e5137723a5f)
* [Svelte で3D表示を行うライブラリ Threlte #5: XR への対応](https://qiita.com/takavfx/items/6a499286c8a125c7b65d)

### Extra

* [Svelte で 3D 表示を行うライブラリ Threlte Ex1: Svelte5 対応を試す](https://qiita.com/takavfx/items/13feec35d60fe629eb26)

# テンプレートからパッケージを作る

## パッケージの作成

プロジェクトの作成方法は、npm create コマンドとして用意されている。

```bash
npm create threlte
```

これだけでテンプレートからライブラリが作成される。

途中 Select Threlte Packages という事で、いくつかの外部パッケージを選択させられるが、とりあえず `@threlte/extras` だけチェックを入れておけばいいと思う。
（詳しくは後ほど）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/99ba062b-dc0c-da79-dea6-f2dba059a249.png)

もろもろプロンプトに従って実行していくとパッケージが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/cc066948-45a3-f9ad-adb1-761a5a1153ca.png)

## 開発環境の立ち上げ

パッケージ作成処理が終わったら、いつもの用に開発環境を立ち上げる。

```bash
npm run dev
```

URL 先を立ち上げると、次の用にカメラが回転している状態でのサンプルシーンが作成される。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/be9b2d40-8373-aaf2-a5a6-5a828858504d.gif)

# ライブラリ概要

## シーンの構成

Threlte での3Dシーン構成の根幹は、以下の二つの要素から始まる。

* `<Canvas>`
* `<T>`

## `<Canvas>`

`<Canvas>` は、Canvas を構成する一番ベースになる要素。
特にここで特別なことをする必要はないが、必ず必要になるので忘れず定義づけておく。

```svelte:App.svelte
<script lang="ts">
  import { Canvas } from '@threlte/core'
  import Scene from './Scene.svelte'
</script>

<Canvas>
  <Scene />
</Canvas>
```

https://threlte.xyz/docs/reference/core/canvas

## `<T>`

`<T>` は、Three.js のあらゆる export 設定されているコンポーネントを Svelte コンポーネントとして扱う。

```svelte:Scene.svelte
<script lang="ts">
  import { T } from '@threlte/core'
</script>

<!-- パースペクティブカメラを設定 -->
<T.PerspectiveCamera
  makeDefault
  position={[-10, 10, 10]}
  fov={15}
/>

<!-- ディレクショナルライトを設定 -->
<T.DirectionalLight
  intensity={0.8}
  position.x={5}
  position.y={10}
/>

<!-- アンビエントライトを設定 -->
<T.AmbientLight intensity={0.2} />

<!-- メッシュのトランスフォーム（入れもの）を設定 -->
<T.Mesh
position.y={1.2}
position.z={-0.75}
>
  <!-- ボックスジオメトリを設定 -->
  <T.BoxGeometry />
  <!-- マテリアルを設定 -->
  <T.MeshStandardMaterial color="#0059BA" />
</T.Mesh>
```

この `<T.(Three.js コンポーネント)>` は、例えば `<T.Mesh>` の場合以下のようにも書ける。

```svelte
<T is={Mesh}>
</T>
```

こう書くときもままあるが、基本的にはドットアノテーションを使った方が分かりやすいので、まずはそちらベースで書いていくのがいいだろう。

https://threlte.xyz/docs/reference/core/t


# @threlte/core

@threlte/core は、Threlte のフレームワーク基盤を構成するパッケージ。
Threlte を使用する際には、まずはこれをインストールすることから始まる。

https://threlte.xyz/docs/reference/core/getting-started

また、Threlte が隠蔽している Three.js の機能機能 **Render** や **Camera**、**ToneMapping** 等も、ここから提供される hooks を利用してアクセスする。

例えば、**Tome Mapping** をいじる場合、`useThrelte()` hooks を使用して次の様にアクセスする。

```svelte:Scene.svelte
<script lang="ts">
    import { useThrelte } from "@threlte/core"
    import THREE from "three"

    const { toneMapping } = useThrelte()
    toneMapping.set(THREE.LinearToneMapping)
</script>
```

まぁ、最初のうちはこの core 昨日の深堀をする必要はなく、とりあえず `<Canvas>` と `<T>` から Threlte の利用は始まると終えて置けばよいが、より高度に Three.js の機能にアクセスしたり、拡張していく際にはこのパッケージが提供する機能に触れていくことになる、と覚えておけば良いだろう。

# まとめ

Threlte の利用は `<Canvas>` と `<T>` から始まる。

---

:point_right:次のシリーズを読む
[Svelte で 3D 表示を行うライブラリ Threlte #2: エクストラパッケージを使用する](https://qiita.com/takavfx/items/e71db089198bba1b122b)