0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Svelte で3D表示を行うライブラリ Threlte #4: シーンコントロールツールセット Theatre.js for Threlte

Last updated at Posted at 2024-01-28

シリーズ

Theatre.js for Threlte

シーンの中ではオブジェクトのエディットやマテリアルのエディットなども UI として提供したくなることもある。

こうした要求に対して、Theatre.js というものがある。
Threlte では、このツールセットを Svelte コンポーネントとして扱う事が出来量にするパッケージの提供があり、これを取り込むことによって簡単に Theatre.js の UI を展開することが出来る様になっている。

今回はこの Theatre の組み込み方や使い方に関して触れていく。

インストール

Theatre は別パッケージとして扱われているので、別途インストールする必要がある。

npm install @threlte/theatre @theatre/core @theatre/studio
  • @threlte/theatre
    • Theatre.js コンポーネントを Threlte(Svelte) コンポーネントとして扱える様にするパッケージ。
  • @theatre/core
    • Theatre.js 本体
  • @theatre/studio
    • Theatre.js のエディタ UI 部分を管理しているパッケージ。

基礎の組み込み

まずは、Theatre コンポーネントをアプリケーションに組み込む。
Scene の上流階層に入れるイメージ。

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

<Canvas>
	<Theatre>
		<Scene />
	</Theatre>
</Canvas>

すると、この時点で画像の様に Theatre.js の UI が追加される。(とてもサクっと!

image.png

パラメーターコントロールを可能にする

<SheetObject> の追加

コントロールを可能にするには、まず <SheetObject> で認識させたいオブジェクトをコンポーネント構造に組み込む必要がある。

key 要素は、その子コンポーネントとなるものをグループ化する目的で名前を付ける。
複数設定していくことは可能だが、key の値は「ID」としての認識を受けるので、内部でマテリアルパラメーターなどを同期させたい場合などの特殊な場合を省いて、基本はユニークにすべきだと思われる。

Scene.svelte
<script lang="ts">
    import { SheetObject } from '@threlte/theatre';
</script>

<!-- 省略 -->

<SheetObject key="Sphere">
    <T.Mesh position.y={1.2}>
        <T.SphereGeometry />
        <T.MeshStandardMaterial color="grey" roughness={0.0} />
    </T.Mesh>
</SheetObject>


<SheetObject key="Box">
	<T.Mesh position={[-1.5, 1.2, 0]}>
		<T.BoxGeometry />
		<T.MeshStandardMaterial color="grey" roughness={0.0}>
		</T.MeshStandardMaterial>
	</T.Mesh>
</SheetObject>

2024-01-28 10.37.20 localhost d5f3b73c807f.png

パラメーターコントロール

シーンオブジェクトのパラメーターをコントロールできるようにするには、以下の二つを設定する。

  • <SheetObject> への let:Sync の追加。
  • <Scyn> を、コントロールしたいコンポーネントの子コンポーネントとして追加。
Scene.svelte
+<SheetObject key="Sphere" let:Sync>
	<T.Mesh position.y={1.2}>
		<T.SphereGeometry />
		<T.MeshStandardMaterial color="white">
+			<Sync color roughness metalness />
		</T.MeshStandardMaterial>
	</T.Mesh>
</SheetObject>

output3.gif

上記の key の値を同値にして、同様の <Sync> を含む場合、それらのオブジェクトは先に宣言された方のパラメーター更新と同じ影響を受けてしまう。

Scene.svelte
<SheetObject key="Sphere" let:Sync>
	<T.Mesh position.y={1.2}>
		<T.SphereGeometry />
		<T.MeshStandardMaterial color="grey" roughness={0.0}>
			<Sync color roughness metalness />
		</T.MeshStandardMaterial>
	</T.Mesh>
</SheetObject>

<SheetObject key="Sphere" let:Sync>
	<T.Mesh position={[-1.5, 1.2, 0]}>
		<T.BoxGeometry />
		<T.MeshStandardMaterial color="grey" roughness={0.0}>
			<Sync color roughness metalness />
		</T.MeshStandardMaterial>
	</T.Mesh>
</SheetObject>

2024-01-28 10.34.57 localhost fc18d1723506.png

Transform コントロール

シーンオブジェクトの Transform をコントロールする場合は、以下の二つを設定する。

  • <SheetObject> への let:Transform の追加。
  • <Transform> をコントロールしたいコンポーネントの親コンポーネントとして追加。
Scene.svelte
+<SheetObject key="Sphere" let:Transform>
+	<Transform>
		<T.Mesh position.y={1.2}>
			<T.SphereGeometry />
			<T.MeshStandardMaterial color="grey" roughness={0.0} />
		</T.Mesh>
+	</Transform>
</SheetObject>

output2.gif

要素の一括適用

例えば透過処理設定を内包するコンポーネント全体に対して行いたい場合がある場合、<Declare> 要素を使用する。

Scene.svelte
<SheetObject let:Declare>
  <Declare
    props={{ transparent: false }}
    let:values
  >
    <T.MeshBasicMaterial transparent={values.transparent} />
  </Declare>
</SheetObject>

output5.gif

その他の特徴

パラメーターのローカル保存

Theatre.js では、パラメーターの変更等は基本的に local storage への保存が実行されている。
なので、ページ更新などを行っても変更履歴はローカル保存される。

output4.gif


:point_right:次のシリーズを読む
Svelte で3D表示を行うライブラリ Threlte #5: XR への対応

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?