📌☺スマイルマシーン制作記
TODO: 概要をまとめる
もともとはデザインフェスタ用の仮面だ
接客が苦手だから作った
TODO: 系譜をまとめる
0号 1号
https://gyazo.com/4e4a3092b7fb65b152606b693c59a37a
試作モデル
Mk.2~Mk.5
Mk.2
https://gyazo.com/97fda9dc558cf3d349408a7a42d63c34
https://gyazo.com/3483944b9ff7eb2c8606a6c65c21e970
最初の実用モデル
2012
No.6~No.7
No.8(制作中)
TODO: 作業履歴をなるべくまとめる
目的
ディスプレイ越しに視界を確保したい
これまではディスプレイを迂回するようにミラーを配置して視界を確保していたが、限界がある
透過ディスプレイにすれば視界を確保できるのでは?
IPSディスプレイを買ってみた
バラしてみた
一応透過していることは確認できた
透過率が低くて不向きかも
ここにIPSは透過率が低いという知見があった
TNディスプレイをいくつか買ってみた
バラしてみた
反射部分がないとディスプレイが発光できない
構造の観察
ガラス - フィルター数枚 - *1拡散用白色フィルム - *2金属製バックパネル
*1ここを差し替える
*2 これを差し替えないと透過できないが、完全に取り除くと強度が不安になる
穿孔してみて様子を見る <- いまここ
大丈夫そうならいっぱい穴を開ける
穿孔してみた
だめそう!!!!!!!!!!!!!!!
ピンチ
アイデア1
ハーフミラーを仕込む
拡散ではなく反射なので、うまく発光しないかもしれない
だめそう!!!!!!!!!!!!!!!
アイデア2
グリッドを仕込む
網戸越しの視界になる
拡散量は減るだろうという予想がある
だめそう!!!!!!!!!!!!!!!
潜望鏡形式にするか…
TODO: 使用した機材をなるべくまとめる
TNモニター
ghost face 仕様設計
stage
mc_face[]
mc_face_default[]
mc_face_smile[]
mc_face_happy[]
mc_face_sadly[]
mc_face_angry[]
機能
faceはタイムラインを持つ
faceは初期で非表示になっている
faceは初期で1フレーム目でstop()している
faceは仮想的な中心点を緩やかに追いかける
仮想的な中心点 mc_face_target
stageは以下の要素を持つ
mc_face[]
mc_face_target
faceは以下の要素を持つ
mc_eye_l, mc_eye_r, mc_eye_c, mc_mouth_1, mc_mouth_2
これらは仮想的な中心点を緩やかに追いかける
仮想的な中心点 mc_eye_l_target
mc_xxxxx_target
特定の周波数でゆらゆら揺れている
ステータスを持つ ->洗い出し
目も口も同じmcを参照する?
目も口になれる、口が目になれる
mode_eye_l/r
mode_mouth
プログラム的なアニメーション
math_anim_status
指定の配置プリセットに応じる
MATH_ANIM_STATE_YURA_OuO ✔
デフォルト
ゆらゆらさせる
MATH_ANIM_STATE_RAND_XXX
ランダムな位置に散開する
一定時間で位置が変わる
要素同士の距離は一定を保つ
MATH_ANIM_STATE_ROT_444 ✔
∵←この形で回転する
MATH_ANIM_STATE_ROT_609 ✔
・u・ ←この形で回転する
MATH_ANIM_STATE_FREEZE
・・←静止
タイムライン的なアニメーション
timeline_animation_status
TIMELINE_ANIM_STATE_STARTUP // アニメーションの開始地点
TIMELINE_ANIM_STATE_LOOP // ループする区間
TIMELINE_ANIM_STATE_TRANSOUT // 次のアニメーションに行く区間
emotion_statusが変更されたとき、TIMELINE_ANIM_STATE_TRANSOUTに遷移し、その後TIMELINE_ANIM_STATE_STARTUPに遷移する
表情の状態を保存
emotion_status
EMOTE_STATE_SML
EMOTE_STATE_LAF
EMOTE_STATE_SUP
EMOTE_STATE_SAD
EMOTE_STATE_ANG
EMOTE_STATE_X_X
入力
ゲームパッド(エリコン)
Lスティック
上下で顔の上下移動
左右で顔の左右移動
Rスティック
上下で顔の上下回転
左右で顔の左右回転
ボタン5/6
顔送り
ボタン1~4
よく使う顔プリセット
ボタン8
リセット
ゲームパッド(AtomS3)
加速度センサー
X軸で顔の上下移動
Z軸で顔の左右回転
Y軸の急速な変化で顔送り
ボタン押し込み
リセット
G5, G6, G7
リップシンク
Grove
拡張用(間に合うのか?)
AtomS3の入力メモ
https://gyazo.com/0794649d3e0234a2c738af53cdbfae52
加速度はfloatの-0.1~1.0を取り出せる
https://gyazo.com/c45718ba138131d128c776daaa6a89cc
本体左側面に貼り付けることを想定すると
初期値
X: 0.0
Y: 1.0
Z: 0.0
うつむき~あおり
X: 1.0~-1.0
Y: 0.0~1.0~0.0
Z: 0.0
左かたむき~右かたむき
X: 0.0
Y: 0.0~1.0~0.0
Z: -1.0~1.0
エリコンのキーマップのメモ
https://gyazo.com/f55ba471ce886b2a9fbffcaf0d9e8284
エリコン、windowsのゲームパッドのプロパティによる
L2R2がZ軸になっている(つまり同時押しできない?)
右スティックがX回転Y回転になっている
XBOXボタンは使わないほうが良さそう
エリコンの場合、ボタン12はプロファイル変更ボタンに割り当てられている
ゲームインプットAPIについて
https://gyazo.com/06753f61aacd54bfbb6dd6269442b0ee
正直なところ、アナログ入力が不要であればキーボード入力だけのほうがずっと簡単である
前回はここで挫折した
GameInputはシステムがいい感じにしてくれる部分で、いじる部分はない
GameInputDeviceは接続されたデバイスであり、通常は複数のコントローラー(ボタン)を持つ
デバイスは切断・接続される場合がある
GameInputControlはボタン等であり、更新したときにEvent.CHANGEで通知を行う
ボタン一つ一つにaddEventListener(Event.CHANGE, func);が必要
渡されるe:Eventにボタンの属性が含まれるので、そこでボタンの種類を判別する
公式のドキュメント
公式のフォーラムは分かりづらい上に失われている
ためになる個人ブログ
アドレス末尾に具体的な名前があるブログはだいたい神様である
図がわかりやすい
とりあえず動かすことはできた
AS3
intは整数
Numberで精度高い小数
回転が-180°~180°であることに絶句した
rotaionに++していくと180を越えた瞬間に-180になる
変形状態を別のオブジェクトに保存しておき、loopの最後に一括で変更すればよさそう
AS3でゲームコントローラーが一瞬で切断されてしまう問題
XBOXコントローラー など、有名どころはつながる
マイナーなコントローラーは一瞬で切断される
かつてのバグであり、AIR版は修正された
FlashPlayer版は修正されず放置された(おそらく)
開発メモ
AS3の記述にはFlashDevelopを使う
Animate内蔵のエディタがしょぼすぎる
VSCodeのAS3拡張は放置されている
Eclipseは試してない
FlashDevelopを本来の使い方をするためにはたくさんの下準備が要るが、今回はコーディングおよび自動フォーマットの用途のみで使う
一通り書いたあと、Animateのスクリプトパネルにコピペして使う
1つの.flaファイルで全てが完結するのは偉大である(罪でもある)
数年経つとファイル構成とか全部忘れる
.asファイル等がばらけているよりはflaファイルにまとめておいたほうが良い
しかしFlashDevelopは更新が終了している
しかもFlashDevelopのWebサイトが壊れたままである
web archiveに感謝を込めながら救出する
デフォルトのフォントが見にくいので変更する
デフォルトのテーマが明るくて目に痛いので変更する
おわった
メイキングをかくぞ
コンテンツ
全体の構成
コントローラー
やったことリスト
自分の頭の3Dスキャン
眉間と鼻と顎にマーカーでマーカーを描いて中心を取れるようにしておく
Scaniverse iPad mini6 で撮影
自分の頭のリトポロジー
Blenderでキャプチャした頭を整える
ミラーにする 実際のあたまは対称ではないのだけど
リメッシュモディファイアでざっくりとローポリにしたらいい感じになった
自分の体の3Dスキャン
ともだちにScaniverseしてもらった
頭と同じ処理を加える
腕と胸にもコントローラーをつけるために撮影したが、叶わず
技術検証
透過ディスプレイを作りたかった
失敗
ボイスチェンジャーを作りたかった
成功
Adafruitのチュートリアルのままだけども
HDMI入力の形式にしたかった
タブレットを顔面に入れるのではなく、胸部に収めたかった
Androidが公式で映像出力に対応しているかが曖昧で難儀
Pixelの最新版には搭載されると言われたがこのためだけに8万はちょっと
使われてないRaspberry PI 4Bが余ってる
AndroidはLinuxの親戚だから入らないか
いろいろ難儀して、特定のバージョンなら使えた
Android TV
クセがある
首を支えるアーマーパーツを作りたかった
失敗
タブレットを顔面に置かないということは、加速度センサー等の入力が別に必要になる
AtomS3の加速度センサーを使えないだろうか
ゲームコントローラ化して、スティック入力を加速度センサーで行えばいけるかも
成功
クセがある
ハンズフリーで操作したい
部分的に成功
失敗部分
顎入力はボタン数が少なすぎる
アニメーション
いつものAnimate CC to Adobe(Harman) Air for Androidでアプリを作った