Slide 1

Slide 1 text

WebGLを触ってみよう 株式会社ラクーンホールディングス 木村宗吾

Slide 2

Slide 2 text

WebGLとは ● WebコンテンツでOpenGL ESのAPIを用いて、対応しているブラウザーではプラグイ ンを使わずに、2Dおよび3Dの描画をHTMLのcanvasにおいて行うことができる ● JSで記述する制御コードと、GPUで実行するGLSLで構成される

Slide 3

Slide 3 text

利用サイト ● https://www.nks.co.jp/recruitsite/ ○ 日本経済社の採用サイト ● https://www.techv.co.jp
 ○ 伊藤忠テクノロジーベンチャーズ – コーポレートサイト


Slide 4

Slide 4 text

まずはシェーダーから ● 3DCGオブジェクトの表面の質感や凹凸、陰影処理などの描画色を決定するプロ グラム ● GLSL ○ WebGLで動作するシェーダ言語 ○ C言語の構文をベースとしてる ○ ベクトルや、行列など数学が関わっている

Slide 5

Slide 5 text

もう難しそう...

Slide 6

Slide 6 text

今回はとりあえず動かしてみましょう

Slide 7

Slide 7 text

準備&実行! ● ソースコード準備 ○ wsl_ dockerを立ち上げる ○ workspaceフォルダに移動してください ○ git clone https://github.com/k1mu21/Web_GL_sample.git ○ cd WEB_GL_SAMPLE ○ docker compose up -d ● URL ○ http://localhost:8081/webgl_demo/index.html

Slide 8

Slide 8 text

実行結果

Slide 9

Slide 9 text

コード一部抜粋 webgl_demo/webgl-demo.js ● これがGLSL ○ Vertex shader: 頂点を描画するプ ログラム ○ Fragment shader: テクスチャから ピクセルの色を決定し,描画するた めのプログラム ● まあほぼC言語です

Slide 10

Slide 10 text

コード一部抜粋 webgl_demo/init-buffers.js ● このコードは立方体の頂点を定義している ● 頂点が24(1面につき4点)あるのでこんなに多 い ○ 3つでxyzを定義している

Slide 11

Slide 11 text

コード一部抜粋 webgl_demo/draw-scene.js ● ここが立方体を回転させているコード ● 上からZ軸、Y軸、X軸のに関するコー ド

Slide 12

Slide 12 text

軸の向きがおかしくない?

Slide 13

Slide 13 text

WebGLの座標系は実は違う 数学 WebGL

Slide 14

Slide 14 text

自分もこんなコードをバニラで書きた くはない →ライブラリを使いましょう!

Slide 15

Slide 15 text

今回はThree.jsを使います!

Slide 16

Slide 16 text

Three.jsとは ● WebGLのライブラリの一つ ● 他の3D ライブラリーと同様に、一般的な 3D 機能をより迅速に実装するためのヘル パー関数が組み込まれている

Slide 17

Slide 17 text

レンダラー ● レンダラーとは、ブラウザ上でシーンを正しく 表示するためのツール ● コードの内容 ○ 新しい WebGL レンダラーを作成 ○ 画面上の空き領域全体にフィットするようにサ イズを設定 ○ DOM 構造をページに追加 ○ antialias 引数は図形の縁をより滑らかにレンダ リングするためのもの ○ setClearColor() メソッドは、背景を既定値の黒 ではなく、明るい灰色に設定

Slide 18

Slide 18 text

シーン ● シーンは全てが起こる場所 ● 新たにオブジェクトを作るときは、 シーン内にそれを追加することで画 面に表示されるようになる ● Three.js ではシーンは Scene オブ ジェクトで表す

Slide 19

Slide 19 text

カメラ ● レンダリングされたシーンはあるが、作 品を見るためにカメラを追加する必要が ある ● z 位置は 50 単位で、カメラと z 軸上の シーンの中心との距離のこと ○ カメラを後ろに移動して、シーン内 のオブジェクトを見ることができる ようにしている

Slide 20

Slide 20 text

レンダリング ● レンダラーを作ったなら、全てをレンダリングし よう ● このコードは、全フレームで常にシーンがレン ダリングされるようになる ● 新しいフレームごとにrenderがsceneとcamera をレンダリングする

Slide 21

Slide 21 text

結果 ● ページを開いてみて下さい ○ 灰色の画面が表示されるはずです! ● URL ○ http://localhost:8081/threejs_demo/cube.html

Slide 22

Slide 22 text

3Dモデルを描画しましょう

Slide 23

Slide 23 text

ジオメトリ ● 定義済みのプリミティブを多数提供しており、 1 行のコードで即座に図形を作成することがで きる ● 10 x 10 x 10 の簡単な立方体が生成されます

Slide 24

Slide 24 text

素材 ● 素材とは、オブジェクトに応じた、その表面に ある色や質感を表すもの ● シンプルな青色を選んでボックスを塗装してい ます

Slide 25

Slide 25 text

メッシュ ● 素材を立方体のジオメトリーに適用させるに は、メッシュを使用 ● メッシュは、素材をシェイプの表面に適用してく れる

Slide 26

Slide 26 text

立方体をシーンに追加する ● カメラと同様にシーンに追加

Slide 27

Slide 27 text

立方体を少し回転させて表示 ● オブジェクトの良いところは、シーン内で移動 できること ● 例えば回転や拡大縮小を行ったり。立方体を 少し回転させることができる

Slide 28

Slide 28 text

結果 ● 画面に青い立方体がすこし回転して 表示されていれば成功です! ○ 表示されていなければ一度リ ロードしてみてください

Slide 29

Slide 29 text

もう少し深堀してみよう

Slide 30

Slide 30 text

図形や素材の追加 ● 立方体を左に移動させる ● フォンの素材で包まれたリングを追加 ○ フォンは基本素材よりも光沢があるように見 える ● 正十二面体を作成 ○ 引数 `DodecahedronGeometry()' はオブジェク トの大きさを定義 ○ ランバート素材を使用 ■ フォンより光沢が少ない

Slide 31

Slide 31 text

光源 ● 様々なタイプの光源が利用できます。 ○ 基本的なものは PointLight で、これは定義さ れた方向にスポットライトを照らすように動作 する

Slide 32

Slide 32 text

結果 ● 3つのオブジェクトが表示されていて ● 光源によって影が見える ● URL ○ http://localhost:8081/threejs_demo/sha pes.html

Slide 33

Slide 33 text

動きをつけよう!

Slide 34

Slide 34 text

回転 ● 各フレームで与えられた回転方向の値を追加 する ● 立方体がフレームごとにほんの少し回転し続 ける

Slide 35

Slide 35 text

拡大縮小 ● 経過時間をカウントするためのヘルパー変数 t を実装 ● Math.sin は周期的な関数なので、これはリン グを拡大縮小し、そのプロセスを繰り返す ● Math.abs でラップして、 0 以上の絶対値を渡 している

Slide 36

Slide 36 text

移動 ● 各フレームの y 軸に sin() 値を適用することに よって、正十二面体を上下に動かしている

Slide 37

Slide 37 text

結果 ● それぞれが動いて入れば成功! ○ 動いていなければリロードしてみてください

Slide 38

Slide 38 text

まとめ ● WebGLはJSで記述する制御コードと、GPUで実行するGLSLで構成 ○ GLSLに関してもっと知りたい方は自分で調べてみてください ● Three.jsはWebGLのライブラリ ○ これを使えば簡単に実装することができる ● 注意点 ○ WebGLは3Dモデルなどのオブジェクトを使う関係上 Webページの表示が遅く なるデメリットもあります。