Adventar21日目の記事として書かれています。前日担当のiLissさん早く記事書けやオラァ。これTSGに関係あるの?毎年恒例。関係ないのもアレなので、未来に関係あるかもしれない話でもしましょう。この世界で最も愛しい生物について唐突ですが、僕はグソクムシ*1です。現実社会ではこのような等脚目は生きずらい*2ので、人間に化けて生活をしています*3。そのため、現在の科学技術において生物学的にホモサピエンスに分類しているはず。ここまでどうでもいい茶番でしたが、そういうこともあり僕はグソクムシが好きです。どの程度好きかと言うと、近場であるすみだ水族館の年間パスポートを所持しており、2か月に一度程度の頻度でそこにいるダイオウグソクムシと会話したり*4、旅行先付近の水族館にわざわざ行ってグソクムシと会話してきたり。写真フォルダの30%位は彼らで占められているといっても過言ではないでしょう。僕のTwitterの画像欄を見ればそのごくごく一部が垣間見れるかも。ここまで何も考えずに書いていましたが、これ以上書き続けると逆に可読性を失ってしまったりしてしまうので、本題に入りましょう。バーチャルグソクムシ「fiord」を取り巻く技術そんな僕ですが、今年の春になって「VTuber」なるものを知りました。これを見た僕は思ったのです。「これはグソクムシをバーチャル空間に顕現させる義務がある」と。既存技術を探して、GWを使ってバーチャル空間上で動けるようにしました。そのため誕生日が2019/5/5になっています。Twitterに登録したら凍結するの目に見えているから登録しないけど。やっていることは以下のようなものです。Studioでカラーキー入れれば配信でも使えるよ!デスクトップマスコット化するかは考え中。ここまでサクッと書きました。TSGのみんなはプロなのでこれ以上説明は要らないでしょうし、多分これだけでも実装まで持っていけると思いますが、外の普通の方が見に来ることを考慮してちゃんと中身を書きます。全体像ところで、人間の動作とグソクムシの動作は明らかに異なるため、人間の動きをマッピングさせる必要があります*5。限定的に「顔と目、前足」のみの実現を目指します。Pythonで顔認識系統を全部担当。そこからUDPでUnityに「顔の角度、目の開き度合い」を送り付けています。SwitchのJoyConからその傾きの変化を取得して、その分腕を動かしています。apiというものがあり、それを用いるだけでも実は顔の特徴点を取得することができます。作成した当時はそんなことも知らなかったので、opencv+dlibを用いています。若干の高速化のためにopencvで顔の矩形検出、その範囲のみでdlibの顔の特徴点検出に回しています。UDPに送り付けるパートは...何でUDPにしたんだろう。他いい手段ないですか?また、誤差も出るので「EARだけ取る(カルマンフィルターにより瞬きが消されるので)」→「カルマンフィルターに全顔特徴点をかける」→「顔の傾きを取る」の流れで計算を行います。Unity部分Pythonから投げられたデータを受け取ります。顔の角度については(x,y,z)=(0,0,0)からのズレをオイラー角度のまま再現します。同時に、SwitchのJoyconからも入力を受けます。こんなライブラリがあるので余裕です!github.com目の開き度合いについては、「閾値以下なら目を完全に閉じる」「閾値以上なら一定時間をかけて目を開いていく」というモーションを付けると自然な動きが出来ます。EARそのものは目の開き度合いに関与するとまずいので。これだといわゆる「薄目」が表現できないので、その辺は要考察。Studioという配信ソフト(といいながら主にデスクトップ録画に僕は用いています)に送ってカラーキーつけるとVTuberになれます。それで出来たのがwww.youtube.comところで、VTuberになる権限を得た僕ですが、「バーチャル空間で動かせるようになる」のが目標だったのでコンテンツもモチベーションもありません。よって微動だにしません。そこ、「グソクムシまんまじゃん」とか言うな!ダイオウグソクムシが動かないのは事実だろうけど、オオグソクムシ結構動くぞ!試しに配信*6していますが、よく腕がすっとんでいくので、はよモーキャプしろ。使っているのが慣性系なので、おそらく誤差が出るでしょう。何らかの定期補正機能を導入したいお気持ち。VRCモデルには専用のフォーマットがあって、多分それに合わせたモデルを作る必要があります。必要なのボーン構成だけなので、うまい具合にマッピングすれば通ります。現在僕が所属している学科にある通称「BDM(びっくりドッキリメカ」と呼ばれる授業で「モーションキャプチャー」を作成中です。いうのも、Joycon結構誤差が出ます*7。いうことで脱Joyconをしたい+前足以外も動かしたいということで頑張ってはんだ付けするぞ。これ書きながら&人と通話しながら21日21:00~超のんびり雑に以下のモデルを作ってました。TSGに大量発生する謎の生物「おじぎねこ」あくまで人間が非人間を動かす際は専用の動きのマッピングが必要になりますが、おそらく可能でしょう。体のくねりと顔の動きがあると思うんだけど、どうするんだ...教えて、おじぎねこ!*1:誰がダイオウグソクムシだ。僕はオオグソクムシです。いいけどはてなさんなんでダイオウグソクムシとグソクムシがはてなキーワード(ブログ上のワードに線が引かれて自動的にリンクが貼られる機能)に入っていてオオグソクムシが入っていないのですか?*2:人間もそうだという説はありますが*3:ただし、その時間が長すぎて解除方法が分からなくなっているんですよね...*4:巡礼と僕は言っています。年内にもう一度行く予定。gameゲーム問題にしては面白い(といっても典型だと思う)問題だったので。問題概要H×Wのグリッドに駒がいくつか置かれている。相手スタートで以下の操作を交互に繰り返す。駒を1つ選んで取り除く。駒を1つ選んで、左か下のどちらか隣のマスに移動させる。移動先に他の駒があってはならない。操作を行えなくなった方の負け、というルールで、お互いに最善手を取ったとき勝てるか判定せよ。yukicoder解説ゲーム分野にはいくつか解法があって、大体そのどれかに該当する。DFSを行って最善手を全探索するタイプ(grundy数が使えない場合はこっち)grundy数を用いるタイプ(上のよりシンプルな問題で用いることが出来る)その他数学的な考察を行うことで規則的に問題を解くタイプ今回は上2つをやろうとすると探索範囲が広すぎて計算が間に合わない。いうことで自然と規則を見つけて解く形に。3x3辺りまで適当に脳内シミュレーション・grundy数の設定を行っていると、「盤面を一松模様と捉えて、移動=白黒を1つひっくり返す」と捉えるとよさそうなことに気が付きます。駒が2個の時に勝利条件=白黒1つずつだったので。これは、最終的に駒を1つ取り除いたほうがその次に相手が最後の駒を取り除いてくるので負けるため、お互い可能な限り移動し続けます。その結果必ず白黒1つずつの状態になって移動できなくなるので、それと同じ状態(白黒→白黒の遷移は出来ないけど、必ず白白→白黒と黒黒→白黒は存在するので)で負けることが分かります。市松模様の白黒を用い始めたところで、駒の個数ごとに勝てる条件を探してみましょう。探し方は「2個の基準が存在するので、3個以降はn-1個の時の勝利条件を相手が作れない」状態を探すことです。1個→相手が取り除くので必ず負けます2個→前述の通り白黒1つずつで勝ち3個→白白白と黒黒黒で勝てます(色を変えてきても取り除いてきても白黒の状況が作れます)4個→白白黒黒で勝てます(同様相手の行動に応じて必ず白白白か黒黒黒が作れます。それ以外は逆に白白白か黒黒黒を作られます)5個→白白白白黒か白黒黒黒黒が勝利条件です6個→白×6、白×3黒×3、黒×6が勝利条件ですという感じです。これを見直して規則を探すと、「白の個数-黒の個数が3の倍数で勝利」という規則が見えてくるのではないでしょうか。いうことで、これをそのまま実装すると通ります。2018の13日目の記事として書かれたはずでした。書き始めたの23:45分なんですが。15分で書けるかボケ。昨日はpizzacat83プロの『語彙力ゲーム「弓箭」であそぶ』でした。readingでやった環境構築」だそうです。編集後記:この記事は異常に長いので読むことを推奨しないことを書いておきます。2018の5日目の記事が当日18:00になっても出てこないことから「やべぇ」となって慌てて作られた記事です。moragramming!でした。来週or再来週のコンテンツ制作に奔走している僕ですが(無駄に期待値を上げる人)、今学期のTSG分科会で触れた内容を少しここに書いてみたいなと思いました。PointsAtCoder思考過程を文章として残してみたので、公開してみようっと。問題2N*2Nのグリッド上で、どの2点間の距離もd1、d2とは異なるようなN*N要素からなる集合を作ってください。何も考えなければ全体の1/4を選べれば正解で、d=1の時は市松模様、d=2の時はストライプになる感じでd1,d2でそれぞれ1/2になりそう?(d=25とかa2+b2=c2になるときは要検証)ってことで取り敢えず(0,0)から貪欲に選択していく方式で実装してみる。最初に(0,0)から距離がd1,d2の点を列挙->O(N2)1で生成したリストの要素を(x,y)としたとき、他の点でも使えるよう(-x,y)、(x,-y)、(-x,-y)もリストに加える。各点について2で生成したリスト分ずらした点を1つも使用していなければ使える。リストの点は実際ほとんど存在しないはずなので、O(1)位に見積もっても悲惨なことにはならないはず。WAしました(だから検証しろって言ったじゃん...)a2+b2=dで分解できるとき取り敢えず20×20でd=25の時の残りマス数を見ると「139/400」。実際提出してみた結果を見ても、このケースさえ何とかなればACぽい。生成されたマス目(以下。oを使用しています)をみるとかなり不規則なので、これを規則的に直したいと思います。oooooxxxxxoooooxxxxxoooooxxxxxoooooxxxxxoooooxxxxxoooooxxxxxxoooxxxxxxxoooxxxxxoxxoxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxooxxxxxxxoxxxxxxxxxooooxxxoxoooxoxxxoxxooxooxooxxoxxooxoxxxoxxoooxoxxxoxoxoxxxxxoxxoxxxoxoxoxxxxxxxoxxxxoxxxxxxxxxoxxxoxxxxxoxxxxxxoxoxxxoxxxoxxoxxxoxoxxxoxoxoxoxxxxoxoxoxoxoxoxoxoxooxoooxxxxxoxoxoxoxoxooxoxxxoxoxoxoxoxoxooxxxoxoxoxoxoxoxoxoxxoxoxoxxxoxoxoxoxoxoところでd=25の時に限って言うと、「市松模様」で実は通ります。同じ形状のd=100では2x2単位の市松模様にする必要があります。これは分解後のa,bの偶奇に依存しそうです。こっちの方面の考察をもう少ししてみましょう。a,bの偶奇について考えます。dが奇数⇔a,bの偶奇が異なるとき1x1の市松模様でOK。市松模様の色の判定は(a+b)%2で、これが常に奇数だから。4)⇔a,bがともに奇数のときd=50が(1,7)と(5,5)で分解できるなど。d=130が結構厄介で、貪欲解はこいつに殺されます。その原因は「貪欲だから」で、少し控えめの「偶数行目のみ取る」という方針を取れば解決。4)⇔a,bともに偶数のときこれは、全体を2で割って座標を圧縮することで上のどちらかのパターンに持ち込むタイプ?縮小して上のケースに持ち込んだ後、拡大するのを忘れずに。上の考察で用いられる模様は全て「残りの個数を1/2にするけど、他の模様と独立」という点があるため、問題無く1/4取り切ることが出来るはず。超考察寄りの構築ゲーでした。プロコン昨日こんなことをし始めました。hyoga.hatenablog.comただ、今の自分は黄色手前の青。div1Easyは流石に解けていないといけない領域です。日)ネットの海に生息するらしいバーチャルグソクムシ。競プロとCTFをメインに、たまにEsolangを混ぜます。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。