マジカルミライプログラミングコンテストで拙作「グリグリリック」が入選しました。本記事ではグリグリリックの作り方についてブレイクダウンして解説していきたいと思います。
このブログでも何回か取り扱っていますが、マジカルミライ2020に合わせてクリプトンと産総研で共同開催されたマジカルミライ初のプログラミングコンテストです。
クリエイティビティ
Webアプリケーションの演出が楽曲と同期して魅力的に見えるか
イノベーション
Webアプリケーションを支えるアイデアがユニークで、未来の創作文化を予感させるものであるか
完成度
Webアプリケーションが一般的なWebブラウザで正常に動作するか、実装が技術的に優れているか
グリグリリックという3D弾幕アプリケーションを作りました
今すぐプレイ:
https://magicalmirai.com/2020/procon/entry/entry09
ソースコードも公開しています:
WebフロントエンドはWebGLで、フレームワークはPlayCanvasを利用しています。
https://playcanvas.jp
Web向けの3Dゲームエンジンです。
JavaScriptで動作するゲームエンジンとそれを簡単に扱えるWebエディターがセットになっています。
物理エンジンやフォントレンダリングなども機能として入っているので今回はすべてPlayCanvasべったりで開発しています。
また、マルチプラットフォームなアプリが作れる前提のエンジンなのですが、今回のコンテストでは結構評価ポイントでマルチプラットフォームな点が評価されたのは、完全にPlayCanvasのおかげです。
シーン一つで構築しています
model viewer starterkit
をそのまま転用しています公式機能のEXTERNAL SCRIPTSで実現しています
ますTextAliveApp APIではデフォルトでスモールウィンドウで連携されたYouTube動画が挿入される仕様になっています。
今回はPVに合わせた画作りをするため、背景すべてに広げ、リリックオブジェクト以外はPlayCanvasのcanvasを透過させるような仕組みにしました。
PlayCanvasの透過キャンバス作成は以下の方法で簡単にできます
https://qiita.com/sutobu000/items/6ea88a88583cc26bb7b1
デフォルトではiframeで挿入されるYouTube動画のサイズが小さいためスクリプトのイニシャライズで以下のCSSを挿入します
let sty = document.createElement("style");
sty.innerHTML = "iframe {position:absolute} #application-canvas {z-index:1000;}";
document.body.appendChild(sty);
歌詞はPlayCanvasのelement componentでシンプルに実装しています
var pos = this.entity.getPosition();
var vec;
if(sabi){
vec = this.app.root.findByName("Camera").getLocalPosition().clone().scale(0.5);
}else{
vec = new pc.Vec3(0-pos.x*2,0-pos.y*2,0-pos.z*2);
}
if(this.entity.rigidbody){
this.entity.rigidbody.applyForce(vec);
}
また、歌詞はビルボード表示されており、常にカメラを見続けるような処理にしています
Lookatfor.prototype.update = function(dt) {
this.entity.lookAt(this.app.root.findByName("Camera").getPosition());
};
・テンポに合わせてもう少し動きをつけたかった
ビートに合わせて歌詞が波打ったり、盛り上がり・盛り下がりを検出して何か表現できたらやりたかったです。
TextAliveAppAPIではきっとそういった要素も取れるかと思うのですが、いかんせん自分の音楽関連知識が不足していて専門用語がよくわからず断念しました。
・画作りしたかった
自分は絵も3Dも作れないプログラマーなので、今回はPVの上にコンテンツを乗せる形で実装しました。次回はなにか画作りからできるような形で作りたいです
・インタラクティブ性をもっと出したかった
せっかく動画じゃなくてアプリケーションなので、だれが実行しても同じ結果になるアプリは作りたくないなあと思っていました。物理エンジンは決定性がないので、放置していてもランダムのようにふるまうのですが、今回は自由カメラ視点によってさらにインタラクティブ性が出せた気がしたのですが、最後までやりたいと思えるようなレベルまでは今一つだったかなと思います。ゲーム要素とか入っている他作品を見て、やられた!と思いました。
ということでありがたいことにマジカルミライ プログラミングコンテストで入選しました。
今回評価されたインタラクティブ性やマルチプラットフォームで問題なく動く完成度はPlayCanvasの力がとても大きいです。
リリックアプリの開発は初挑戦でしたが、動画作品も案外作れるなあという印象でした。ただ見るだけの動画と体験可能なアプリで大きく表現力が変わるはずなので、アプリにしかできない表現を探すのは楽しそうだなと思いました。
次回あればぜひまた参加したいです。