チクタクバンバンのようなゲームをつくるでつくったゲームをブラウザ上でも遊べるようにします。Three.jsをつかって疑似3D仕様にします。
今回はBlenderをつかってチクタクバンバンに出てきそうな時計をつくりました。参考にした動画はこれです。
動画を貼り付けたあとで気がついたのですが、この動画は他のサイトでは再生できない設定にしているようです。ただしクリックすれば視聴可能です。
この動画が作成されたときは「Blender歴38日目」とのことですが、私はBlenderははじめてなのでヘンテコな時計しかつくれませんでした。自分でつくった時計は下の動画にあるものです。いろいろ痛々しいですが、まあはじめてならこんなものでしょう。今度修正して完成度の高いものにしていきます。
完成したらエクスポートします。ファイル名はclock.daeにしました。これをThree.jsで使うためにはどうすればよいでしょうか?
まずThreeJSを書いてindex.htmlをダブルクリック・・・しても表示されません。Three.jsでは画像ファイルもそうですが、外部のファイルをつかうためにはサーバー上でないと動いてくれません。しかし毎回毎回アップロードするのは面倒です。そこでWeb アプリケーションの開発環境をローカルに簡単に構築できる XAMPPを使います。MySQLやPHPがうまく動くかどうかも検証できるので便利です。
以下はBlenderで作成してエクスポートしたdaeファイルを表示させるためのコードです。daeファイルの場合を読み込むにはColladaLoader.jsファイルが必要です。また文字盤の文字はテキストオブジェクトなのですが、うまく読み込めないので同じような物をpngファイルでつくり、ここからテクスチャを生成して描画しています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | <html> <head> <meta charset="utf-8" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script> <script src="./ColladaLoader.js"></script> <title>サンプル</title> </head> <body> <canvas id="canvas"></canvas> <script>     let model = null;     window.addEventListener('load', init);     function init() {         const width = 500;         const height = 400;         const renderer = new THREE.WebGLRenderer({             canvas: document.querySelector('#canvas')         });         renderer.setPixelRatio(window.devicePixelRatio);         renderer.setSize(width, height);         renderer.gammaInput = true;         renderer.gammaOutput = true;         const scene = new THREE.Scene();         const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 10000);         // カメラの初期座標を設定         camera.position.set(0, 2.5, 5);         camera.lookAt(new THREE.Vector3(0, 0, 0));         // 平行光源を作成         const directionalLight = new THREE.DirectionalLight(0xffffff);         directionalLight.position.set(0, 1, 0);         scene.add(directionalLight);         // 環境光を追加         const ambientLight = new THREE.AmbientLight(0x333333);         scene.add(ambientLight);         // 3DS形式のモデルデータを読み込む         const loader = new THREE.ColladaLoader();         loader.load('./clock.dae', collada => {             // 読み込み後に3D空間に追加             model = collada.scene;             // 文字盤がうまく読み込めないのでpngファイルでテクスチャを生成して描画する             for(let i=0; i<model.children.length; i++) {                 if(model.children[i].material != null) {                     if(model.children[i].material.name == "material_clock_face") {                         const loader = new THREE.TextureLoader();                         let texture = loader.load('face.png');                         // マテリアルを作成                         const material = new THREE.MeshStandardMaterial({map: texture });                         model.children[i].material = material;                     }                 }             }             scene.add(model);         });         tick();         let ang = 0;         // 毎フレーム時に実行されるループイベントです         function tick() {             // レンダリング             if(model != null) {                 ang += 0.01;                 model.rotation.z = ang;             }             renderer.render(scene, camera);             requestAnimationFrame(tick);         }     } </script> </body> </html> | 
次回からは線路プレートのうえを走らせてみることにします。
