Three.jsの勉強の仕方

<!-- ============================================================== -->
# 概要
<!-- ============================================================== -->
Three.jsの勉強を始めて半年くらいが経過しました。
現在は、以下のようなアプリケーションを作成できるようになりました。

https://nemutas.github.io/r3f-normal-color/
![159666995-c4c9a119-f4a0-4d32-ba3d-3da4d2c899d4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358498/b167ccb5-dfbd-7875-40ab-d15edd093862.gif)

ここまでに至る過程を少しまとめられたらと思います。

<!-- ============================================================== -->
# React Three Fiber について
<!-- ============================================================== -->
私は主に、**React Three Fiber**（Three.jsをReact用にラッパーしたライブラリ｜以下、R3F）を使用して開発してます。
バニラのThree.jsを触る前に、つまりThree.jsの知識がゼロの状態のときからR3Fを使い始めました。
とてもよく設計されたライブラリで、ほんの数行でBoxを表示することができます。

ただし、よく設計されているということは、それほど抽象化されているということです。学び始めの頃は**自分が作りたいシーンを作るために、どのプロパティをいじればいいのかわからない**ということが頻発しました。

またR3Fのドキュメントは、（おそらく）Three.jsを知っていること前提で作られているため、Three.jsを知らない状態で読んでもチンプンカンプンになります。

:::note info
なにが言いたいかというと、
R3Fを使う場合でも結局はThree.jsの知識が必要で、まずThree.jsの学習から始めたほうがいいです。
:::

<!-- ============================================================== -->
# よーいどん
<!-- ============================================================== -->
スタートは、俯瞰的（網羅的）な学習がいいと思います。まずは、Three.jsで何ができるのかを知ることが重要です。
注意したいのが、Three.jsはとても活発なライブラリです。つまり、更新頻度が高く**1年前の情報はもう古い**というプログラミングあるあるを体現しています。
なので、学習教材もなるべく最新のものを選びましょう。

### おすすめ度★★★★★
https://threejs-journey.com/

Bruno Simon氏による**threejs journey**です。
私は色々な教材で学習をした後に、このコースを知りました。そのため受講はしていませんが、いまからでも受講しようか悩んでいるレベルでよくできたコースです。（目次の内容や、受講されている方のアウトプットを見る限り）
使用言語が英語で「うーん...」と思う方もいると思いますが、英語は慣れていきましょう。Three.jsを学習していく上で英語は避けて通れません。

### おすすめ度★★★☆☆
https://www.udemy.com/course/threejs-tutorials/

Sean Bradley氏による**Three.js and TypeScript**です。
Udemyのコースで、値引きされいる期間であれば1000～2000円程度で受講できます。（セールは頻繁にしているので、その時に買いましょう）
TypeScriptを使っているので少し人を選びますが、Three.jsを網羅的に学習できます。ただし、Shaderについては扱っていません。

### おすすめ度★☆☆☆☆
https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEThree-js-%E7%AC%AC2%E7%89%88-%E2%80%95WebGL%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEJavaScript-3D%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-Dirksen/dp/4873117704/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2VN1MUL49BUNR&keywords=threejs&qid=1648927444&sprefix=threejs%2Caps%2C165&sr=8-1

Jos Dirksen (著), あんどうやすし  (翻訳)の**初めてのThree.js 第2版 ―WebGLのためのJavaScript 3Dライブラリ**です。
あまりお勧めはしません。というのも、出版年数が5年以上前で内容的に古いです。ただし貴重な日本語の参考書なので、第3版が出たら買う価値はあるかもしれません。
内容は、そこそこ網羅的で軽くPostprocessingに触っている程度です。

<!-- ============================================================== -->
# 次のステップ
<!-- ============================================================== -->
網羅的に学習した後、「ではなにを作ろうか...」となるかもしれません。また、作りたいものを作ろうとしようにも、うまく表現できないと思います。
それは、コースに従って学習しただけだからです。つまり、知識はあっても何を使えばいいのかがわからない状態です。
次にすることは、**基礎に立ち返る**ことです。例えば、Boxを表示してみたり、ライティングしてみたり、アニメーションさせてみたりしましょう。わからない場合は、Three.jsのドキュメントを読むようにしましょう。

それができたら、次は**Three.jsのサンプルで学習する**のがおすすめです。

https://threejs.org/examples/

Three.jsのドキュメントの素晴らしいところは、ものすごく多くのサンプルが用意されているところです。
上から舐めてみていき、「これ、作ってみたいな」って思うのがあれば、ソースコードを参考にしつつクローンを作ってみましょう。また、わからないコードは逐一ドキュメントで確認します。

中には、かなり煩雑なことをしているサンプルもあります。**まったくわからない場合は、一旦やめたほうが良い**です。ほかに色々作っていく内に知識が蓄積されて、2か月後には簡単に実装できることもあります。

<!-- ============================================================== -->
# Shader
<!-- ============================================================== -->
上記の基礎的なことができるようになると、Shaderに手を出したくなります。Shaderを扱えるようになれば、自分でPostprocessingを作成したり、メッシュの頂点を波打たせたり、この記事のgifのようなことが出来たりします。
Three.jsを使った**表現力が段違いになります。**

Shaderの何が難しいのか、それは資料が少ないところです。
私見ですが、Three.jsがそもそも煩雑なShaderを書かなくて済むように設計されたライブラリだからだと思います。Boxの描画も内部的にはShaderが使われていますが、Three.jsを使う人はそれを意識しないでJavascriptだけで表示することができます。

ただし、まったくないわけではないです。
例えば、Udemyには以下のコースがあります。このコースではShaderのすごく基礎的なことを学習できます。

https://www.udemy.com/course/learn-glsl-shaders-from-scratch

基礎的なことが理解できたら、**簡単なところから色々作ってみる**期間が必要です。
Noise、Texture、Matcap、Fresnel、InstancedMesh...など、ひとつにフォーカスしてShaderで遊ぶと理解が深まります。

<!-- ============================================================== -->
# 先進的なインプット
<!-- ============================================================== -->
Shaderを学習する上で、すごく参考にさせて頂いている方がいます。
YouTubeの**Yuri Artiukh**氏のチャンネルです。

https://www.youtube.com/user/flintyara

まず、題材がとても面白いです。そして、ほぼゼロの状態からライブコーディングをしていくので実装過程がわかります。
個人的に、Shaderは可読性が低いと思います。他の方が書いたコードは何をしているのかほぼわからない可能性が高く、コードを読んで理解するより**どういう工程で作られていったのか**が重要になります。
また、Yuriさんの動画の素晴らしいところは、参照先も示してくれているところです。その参照先から学べることもたくさんあります。

もう一つ、Three.jsのトップページにあるサンプルサイトから学べます。
これらのサイトは、企業やポートフォリオが多く完成度が非常に高いです。日本の方が作成されたサイトもいくつも掲載されています。
コードはない場合がほとんどですが、**Three.jsでどのような表現ができるのか**、インスピレーションを受けることができます。
「すげぇ～」と思うサイトは、独自のPostprocessingや、Shaderを使ったMeshを巧みに駆使している場合がほとんどです。Shaderを使っていることには変わりない（材料は揃っている）ので、**Shaderをどう使えばこの表現ができるのか？** を考えるきっかけになります。

<!-- ============================================================== -->
# React Three Fiberのサンプル
<!-- ============================================================== -->
R3Fにもものすごくたくさんのサンプルがあります。こちらも参考にしましょう。

https://docs.pmnd.rs/react-three-fiber/getting-started/examples

例えば、Postprocessingを自分で実装したい方は、以下のCodeSandboxが役に立ちます。

https://codesandbox.io/s/volumetric-light-w633u

コリジョンを扱いたいなら、これでしょう。

https://codesandbox.io/s/bestservedbold-christmas-baubles-zxpv7

https://codesandbox.io/s/ballpit-mvkqs



<!-- ============================================================== -->
# アウトプット
<!-- ============================================================== -->
作ったものは動画にして、Twitterで`#threejs`や`#webgl`タグをつけて投稿しましょう。このタグからも色んな情報を得ることができます。

<!-- ============================================================== -->
# まとめ
<!-- ============================================================== -->
英語、日本語関係なく得られる情報はすべて拾っていきましょう。
後は、手を動かして実験していきましょう。

何か質問があればTwitterで聞いてください。なんでも知ってるわけではないですが。