hibitの技術系メモ

数学とか3Dとか翻訳とか

梅原大吾「勝ち続ける意志力」書評

f:id:hibit_at:20190914184353p:plain

https://www.amazon.co.jp/dp/4098251329

 日本で最初の、そして恐らく一番有名なプロ格闘ゲーマーである梅原大吾氏による自伝的書籍。その内容はもちろん格闘ゲームに関する記述が多いが、細かい攻略情報や戦略論を述べている訳ではなく、むしろ対人勝負におけるパフォーマンスをベストに保つ方法について書いてある。なかなか読み応えがあって、なるほど人生の攻略本という宣伝文句も頷ける。

成長中毒

 本書を読んで驚かされるのは、梅原氏の徹底した態度、言ってしまえば成長中毒ともいうべき自己研鑽への情熱である。大事なのは成長し続けること、そのために常に変化を求め、勝負の結果にこだわらず淡々と努力をし続ける。

 本書において重ねて強調されることは、とにかく変化し続けることが大事で、その結果や、更にいえば目標設定の巧拙なども問わないという点である。

普通、人はこっちの方向に何かあるはずだと当たりをつけて進むものだと思う。しかし、僕の場合は自分の足で全方向に歩くようにしている。正解がどちらの方向にあるのか、迷う必要すらない。すべての方向を探り尽くすからどこかで必ず正解が見つかるのだ。(74p)

 

自分を変えるとき、変化するためのコツは、「そうすることで良くなるかどうかまで考えない」ということだ。もし悪くなったとしたら、それに気づいたときにまた変えればいい。とにかく、大事なのは変わり続けることだ。良くなるか悪くなるか、そこまでは誰にも分からない。しかし経験から言うと、ただ変え続けるだけで、最終的にいまより必ず高みに登ることができる。(99p)

 

しかし、間違った階段を登ったと気がついたら、スタート地点まで引き返して、もう一度違う階段を登ればいいだけの話である。一番良くないのは、どの階段を登れば迷っている状態が延々と続くことだ。階段の下で正解を吟味し思い悩んでいるだけの人間よりも、間違った階段でもいいからとりあえず登っている人間の方がはるかに上達が早いと思う。(248p)

 この態度はもはや科学者や求道者のようでさえある。あえて悪く表現すれば総当り的だ。しかしこのような考え方は、何かを初めたいけれども不安で足踏みしている人、何か決断をしたけれどもそれが正解だったか迷い続けている人には力強く響くのではなかろうか。

 このような網羅的な試行錯誤を繰り返した梅原氏は、「10の強さ」(一般的な努力で到達できるライン)を超えた11や12の強さ(常人を超えた強さ)を得られるという。その自信を得られた瞬間が幸せだから、その一瞬の快楽に向かって迷いなく苦労を続けていけると述べている。

 以下、個人的に印象に残った箇所を引用する。梅原氏の絶対の自信が伺える文だ。

僕はこれまで頭の回転が速く、要領が良く、勢いに乗っていると思われる人間と何度も戦ってきたが、ただの一度も負ける気はしなかった。(中略)何も考えずに、自分のセンスと運だけを頼りに歩いてきた人間と対峙すると、相手の動きがチャラチャラと軽く見える。性根が定まっていないこと、さらには綿密な分析に基づいた動きでないことに、すぐに気がつくのだ。(59p~60p)

 恐らく梅原氏は、人生に求める幸福(快楽といってもよいだろう)の閾値がすごく高いのだと思う。中途半端なそれ、人と同じようなそれでは満足できない。そしてこれは多くのトップアスリートに共通する性質でもあると思う。

 本書では、梅原氏の人生において中高生時代に進路に悩んだ経緯が書かれているが、それもこういう性質に依るものだろう。どれだけ苦しんでも、遥かな高みにある究極の快楽に到達しなければ気が済まない。そして様々な経験の結果、それに到達する一番の近道は毎日努力を積み上げていくことだと信じ、実践している。

トップアスリートでい続けたいか

 もちろん、このようなストイックな態度が万人向けのものでないことは梅原氏も自覚している。

友人関係に恵まれていて、自分に合った仕事があって、毎日の生活が充実していると感じるのなら、あえて厳しい道を歩むことはないだろう。(中略)もちろん、現在の状況を変える必要のない人もいれば、変えられない人もいるだろう。だから、口が裂けても全員に楽をするな、険しい道を歩めとは言わないし、思わない。(70~71p)

 

さすがに、すべてのゲーマーに僕と同じ道を歩め、とは言えない。その道がどれだけ苦しく、つらいものであるかは誰よりも僕が一番知っている。(120p)

 梅原氏のいう努力の仕方はトップアスリートの為の、というか、トップアスリートを目指すための努力を淡々と続けることが苦にならない人の為のものである。そして、何かの大会を一点突破するための方法論ではなく、パフォーマンスを維持し続けるために毎日の努力を要求するものである。数年単位の間違った努力も、間違っていたことがわかるだけで収穫である、というのがウメハラ流だが、実際はそのように能動的に環境を変えて、集中的に取り組んで、ダメだったら潔く方向転換をする、ということを意識的に行える人間はそれほど多くないように思われる。

 まあ、だったら現状の環境で死ぬまで思い悩んで我慢してくださいというのも酷なので、やはりどこかで努力が必要なのだろうけど……。だとしたらやはり、本書で重要視されているとにかく変化するということが人生の真髄なのかも知れない。程度の差はあれ。

 あなたが自分を成長中毒者だと認めるならば、この本は人生必携の書になるかもしれない。そこまでストイックでない場合でも、何かの選択で思い悩んでいる人には上に述べたようなこと(間違っていても変化することが大事)が励ましになるかもしれない。あなたが仕事に満足している勤め人で、土日と連休が生きがい! この生活が定年まで続いて欲しい! と思うようなタイプならば、本書は必要ないだろう。

Mリーグがあれば……

 以下、完全な余談。梅原氏は一度格闘ゲームで挫折した後、麻雀で頑張っていこうとしたが、それも挫折している。ここでいう挫折とは、技術的なものではなく、長くこの業界にいても未来がなく、いつかは前向きに競技と向き合えなくなるのではないかという不安によるものだ。最終的には梅原氏はスポンサー契約を結びプロゲーマーとなるが、それは麻雀の挫折と介護の仕事を経た後の、eスポーツの盛り上がりを待たなければならなかった。

 本書では麻雀をやめた経緯についてあまり詳しく書かれていないが、筆者(ブログ主)が持っている麻雀界の知識を基になんとなく想像を巡らせてみよう。

 梅原氏が麻雀に関わっていたのは2004年~2007年の3年間だ。その時も麻雀にはプロ団体というものはあったが、給料がもらえるプロではなく、むしろ在籍することに対して料金を払う(それによってタイトルの挑戦権が与えられる)というものだ。まあ「プロになって食う」というのは麻雀に関して言えば、その見通しはかなり厳しいものだった。

 それとは別に、梅原氏は雀荘で仕事をしていたそうだが、それはつまりギャンブルやそれにまつわるトラブルと隣合わせの生活をしていたことを意味する。ここら辺は表では一切言及できない部分だが、本書にある「麻雀は人に恨まれることもある」という記述からは、勝手ながらそちら方面の辛さを想像してしまう。

 選手に給料を払うという意味でのプロの誕生は、2018年のMリーグ発足を待つ必要がある。もし梅原氏が麻雀に打ち込んでいる時に、Mリーグのようなものがあれば、梅原氏も前向きに麻雀プロを目指せたかもしれないな、となんとなく思ってしまう。

神谷美恵子「生きがいについて」書評

f:id:hibit_at:20190914184631p:plain

https://www.amazon.co.jp/dp/4622081814

 語学の天才でありGHQとの折衝も務めた*1知の巨人・神谷美恵子氏が生きがいについて記した本である。

 さてこの本、書き出しから重い。

平穏無事なくらしにめぐまれている者にとっては思い浮かべることさえむつかしいかも知れないが、世のなかには、毎朝目がさめるとその目ざめるということがおそろしくてたまらないひとがあちこちにいる。

 この本のテーマは生きがい、つまり生きる目的ということになるが、そのニュアンスはかなり重めである。つまり、普通の生活を送っている人がいかにその生活に意義を見出すかというよりは、挫折、重病、死別といった絶望に叩き落された人間が、その中でいかに再び生きるに値する希望を見出すかという、それこそ「死ぬか生きるか」というレベルの「生きがい」について論じている*2

 著者の神谷美恵子氏はその生涯をハンセン病の患者への治療に捧げた点でも著名である。当然、本書でもハンセン病やその患者に対する記述は多いが、それはこのような「死ぬか生きるか」について論じるにあたって自然な流れと言える。

 ハンセン病は肉体の変異を伴う病気である。そしてその変異は醜い。いくら感染力が少ないと言っても、その化け物じみた外見への変異は、罹患者への偏見を容赦なく呼び起こす。罹患者は親友や家族からも縁を切られ、二度と普通の社会に戻れない絶望へと叩き落される。

 その一方で、幸か不幸か、ハンセン病自体によって命を落とすことは少ない。つまり罹患者は、精神的には死んだも同然になりながら肉体的には生きているという一種の二律背反の状態に置かれ、これこそが大きな絶望をもたらすと言える。もしハンセン病が短時間で死に至る病であれば、どれだけ身体が醜く変異しようとも、罹患者や家族に大きな葛藤をもたらすことはなかったであろう。

 しかし、「精神的には死にながら肉体的には生きている」という状況はハンセン病に特有のものであろうか。もちろんそうではなく、絶望の縁に立たされた人間は大なり小なりこの二律背反に置かれているのだ。本書はこの点について、表現を変えながら何度もそれを強調している。

らいのひとたちの持っている問題も、結局、人間がみな持っている問題を、つきつめた特殊な形であらわしているにすぎないのであるから、

 

しかしこれは何も病気の場合に限ったことではない。すべて生きがいをうしなったひとの意識において、心と体はばらばらになる傾向がある。

 

しかしこれはレプラ*3のひとに限ったことではない。たしかに彼らの状況は最も「限界状況的」なものの一つにちがいないけれども、人間の持つ本質的な問題をただ極端な形であらわしているにすぎない。

 つまり、精神の死とそこからの復活は人間にとって普遍的なテーマであり、ハンセン病はその最も端的なインスタンスであると言える。愛生園*4ハンセン病の患者を(そしてその精神的復活の過程を)見続けてきた著者は、その精神の回復のはたらき、つまり「生きがい」についてその本質を述べるに相応しい立ち位置にいると言えそうだ。

 ではこの本はそのような「限界状況」に陥った人のための処方箋なのだろうか? 冒頭を読む限りではそのように思えるが、しかしそうではないと思える箇所もある。

社会的にはどんなに立派にやっているひとでも、自己に対してあわせる顔のないひとは次第に自己と対面することを避けるようになる。心の日記もつけられなくなる。ひとりで静かにしていることも耐えられなくなる。

 

たとえ表面ではあたりさわりなくやっていても、心のなかでしゃんと顔を上げて生きるためには、何か自分なりの新しい価値体型をつくり出す必要にせまられる。

 つまり、平穏な生活を送っていても、やはり何かしら生きがいがないと惨めですよ、とも取れる主張をしている。これはこれで厳しい態度ではなかろうか。安穏と暮らしいても、生きがいを求めて邁進することを暗に強制されるとは!

 それを論じるにあたって、本書で描かれる生きがいの再獲得について見ていきたい。本書に出てくるそれはかなり宗教的なニュアンスがうかがえる。もちろん特定の宗教に加担するような書き方はしていないが、暗闇の中で光があらわれ、使命感に突き動かされるというような描写は、まさに宗教的体験と相似形であるように思われる。

 もちろんこれは避けられないことであろう。というか、恐らく絶望の淵から喜びを見出すような過程は大なり小なり宗教的感覚と無縁ではいられないのだろう。逆に、人間には絶望から抜け出すための心のはたらきが備わっていて、その発露が宗教となって現れている、とも考えられる。例えば、著者は芸術について以下のようなホワイトヘッドの引用を添えている。

芸術は、人類が、その生存のストレスに対して示した精神病理的な反応である、といってみることもできる

 この文において、「芸術」を「宗教」に変えても何ら違和感はない。

 先に述べたように、本書で述べられる生きがいの再獲得というものは絶望(最もわかりやすい例はハンセン病)に立たされた人間がいかに再び希望を取り戻すか、という「死ぬか生きるか」の問題である。

 しかし、生存のストレス、端的に言えば、この世に強制的に産み落とされ、そしていつかは死んでいくという理不尽な運命を提示された人間は大なり小なり絶望に囚われた弱い存在であり、その中から希望を見出すためには、使命感を伴う生きがいを再発見しなければならないのではなかろうか。それであれば、やはり本書籍は特定の苦境に立たされた人達のための本であるだけでなく、万人に向けての書であると言える。

 ここでもう一度、怠惰な側の人間に立ってみよう。毎日の生活に追われるだけの人間からすれば、やはりこのような「生きがい主義」とも言える考えはどうにもストイックというか貴族的だ。パンがなければお菓子を食べればいい、ではないが、生きる意味を考える余裕もなければ正直その自信もない、という人間がほとんどではなかろうか。

 この点について以下のような記述がある。

かりに平和がつづき、オートメイションが発達し、休日がふえるならば、よほどの工夫をしないかぎり、「退屈病」が人類のなかにはびこるのではないだろうか。

 現実はどうだろうか。本書が発行された年(1966年)に比べてオートメイションは限りなく進んだ。しかし競争社会はますます激化し、格差は拡大し、人類はそれほど余裕が増えたようには見えない。またその余暇の潰し方も、神谷氏が理想とする精神的なそれとはかけ離れた人も多いように思える。

 技術の発展にともない人類が贅沢病を謳歌できたのであれば、生きがいの追求は現代人の最も大きなテーマになったかもしれない。だが人類は、種レベルでは技術を活かして休日を増やすほど賢くもないし、個体レベルでいえば余暇も享楽的に過ごしてしまう愚かな動物に過ぎないのかも知れない。

 ひとつ言えることは、どのような時代であれ、その中であなたが自分の人生と向きあうとする限り、本書で述べられている内容がその助けとなることは確かであろう。

*1:ついでに医者にもなっている。我々とは知能のレベルが違いそうだ。

*2:神谷氏自身が体験した絶望と回復の自伝であるという側面もあるらしいが、その点については深く追求しない

*3:ハンセン病のこと

*4:ハンセン病患者の療養施設。隔離施設という側面もあるが。

BeatSaberのグローバルランキングの実力評価、譜面例(2021/05/01改稿)

  • このエントリはchokudai氏のエントリを全面的にオマージュしております。
  • ※現在のpp相場感を反映し、記事をリライトしました(2021/05/01)

 Beat SaberはVR空間上のノーツ(ブロック)を斬る音ゲーです。公式譜面やDLC譜面があって、その譜面の中で順位を競うのも面白いですが、それとは別に、ユーザーが作成したカスタム譜面による総合点を競うランキングがMOD制作陣によって運営されています。

f:id:hibit_at:20210114031028p:plain
こんな感じ

 参加しているのは約20万人!……ですがこの中にはMODを入れたけれどもランクを意識していない人がいる(というか大半)ので、実際のアクティブユーザーは10万人くらいかなという感じです。

ppとその実力

f:id:hibit_at:20210114030920p:plain
私のページです

 このPerformance Points(pp)という値によってランキングが順位付けられています。これはランク譜面(Ranked Map)という特定の譜面群をクリアすることによって得られる得点です。ランク譜面は、カスタム譜面の中から有志の投票によって選ばれており、一定のクオリティ(無理な配置がないか、実力に応じたスコアが出るか)を担保された譜面となっています。

 ppと実力との関係については、超ざっくりまとめると、

  •   0pp~…MODを導入すれば誰でもなれるレベル。
  • 2,000pp~…ランク譜面を触り始めたレベル。公式譜面 Expert クリア。
  • 4,000pp~…一般人からみればもう上級者の領域。公式譜面 Expert+(簡単なもの)クリア。
  • 6,000pp~…一般人がついていけなくなるレベル。公式譜面 Expert+(難しいもの)クリア。
  • 8,000pp~...ランク譜面をやり込んでいるレベル。ごく一部の公式DLC Expert+。
  • 10,000pp~…ここら辺からアスリートの領域。
  • 12,000pp~…超上級者。
  • 14,000pp~…世界大会に出るレベル。

 という感じになります。詳しく説明していきますが、その前にもろもろの注意事項。

  • MODについて

 MOD・カスタム譜面の導入は各自の責任でお願いします。もし不具合やトラブル等が起きた場合においても当方では責任を負いかねます。MODの導入手順についてはもぞりーさんのエントリが非常にわかりやすいです。

  • お前は誰だ

 普通の一般プレーヤーです。オマージュ元のchokudai氏がAtCoderの社長であり自身もトッププレーヤーであるのを考えると説得力のなさが際立つというか、お前偉そうに何様やねんという感じがしますが、ご容赦ください。

  • インフレ

 高難度のランク譜面が新しく追加されればプレイヤー全体のppも増えていきます。以下の説明はあくまで現時点の相場感であり、今後インフレ*1していきます。

0pp以上2,000pp未満

 MODを導入すれば誰でもなれるレベルです。色々なカスタム譜面をやっているうちに偶然それがランク譜面で……というケースもあるので、この辺りだと「知らない間になっている」レベルです。

 身体面では、最初は筋肉痛に悩まされる人が多いでしょう。はじめの内は、1時間もプレイしたら次の日は腕が上がらないと思います。

 このレベルの人が触る譜面の例です。

www.youtube.com

Comment: このレベルだと、見たままを斬るだけで特に気をつけることはないです。

2,000pp以上4,000pp未満

 中難度譜面を触りだすレベルです。ストリーム*2や対角*3といった配置が頻出するようになり、一気に音ゲー感がでてきます。たのしい。また、後述しますがこのゲームには「角度」が重要であることがわかってくるので、このゲーム独自の「手首」の使い方も習得していきます。

 身体面では、だんだん筋肉痛になりづらくなってくる頃です。しかしこれは後に続く悲劇の幕開けに過ぎない……。

 このレベルの人が触る譜面の例です。

www.youtube.com

Comment: 斬りやすいパターンがバランスよく配置されており、中級者から上級者まで実力に応じて楽しめる良譜面です。

www.youtube.com

Comment: 局所的に対角配置や高密度のストリームが出てきますが、全体的にはまだ密度は薄いです。

 公式譜面のExpertぐらいならば、このレベルだと余裕を持ってクリアできると思います。Expert+でも簡単なものならばクリアできるでしょう。

4,000pp以上6,000pp未満

 ここら辺から一般人からみればもう上級者の領域です。単なるクリアだけでなく「精度(Accuracy)」を意識するようになります。ノーツを追っかけるだけのプレイではなく、余裕を持って振り抜くプレイになります。譜面あたりのpp*4でいうと 200 ppを稼げるあたりがこのラインになります。中難度譜面でSSクリア、高難度譜面でSクリア辺りです。

 ここでBeatSaberのスコアシステムについて説明しますと、このゲームではただ斬るだけでなく「十分な角度をつけて斬る」ことが大事になります。具体的には、

  • 振りかぶり 100 度、振り抜き 60 度をつける
  • ノーツの真ん中を斬る

 と最高スコアを出すことができます。すべて完璧に斬れれば精度 100 %ですが現実的には不可能です。実際にはSSクリア(精度 90% 以上)がフルコンボフルスイングのラインなので、それを達成できればその譜面を完全にマスターしたと言ってもよいでしょう。同じ譜面でもAクリア(精度 65 %以上 80 %未満)とSSクリアでは、難しさももらえるppも全然違います!

 身体面では怪我が増えてきます。振りの勢いが出てくるので、コントローラを壁にぶつけたり、体にぶつけて内出血させたり……くれぐれもご注意ください。

 このレベルの前半の人が触る譜面の例です。

www.youtube.com

Comment: 中難度譜面。素直なリズムで密度も一定ですが、単純な上下だけではではなく、横切りや上段ノーツが来てもリズムを崩さず対応する必要があるため、一歩上の視認力と慣れが必要になります。

 また、目についたランク譜面を触るという段階は卒業して(低pp譜面をクリアしても個人ppが増えないので)、ある程度高pp譜面に狙いを定めて攻略するようになります。(2020/10/11 追記。最近はランク譜面の数が膨大になってきたのでそうとも言えなくなってきました。)

 プレイスキルの面では、複雑な配置、例えばクロスストリーム*5や片手配置*6が来ても冷静に対処できるようになります。

 身体面では、腕だけの力任せの振りを卒業して、手首や肩を効率的に使ってノーツを斬れるようになりますが、肘や手首への負担が響いてくる頃です。無理するとマジで危ないので、皆様マジで気をつけてください……。

 このレベルの後半の人が触る譜面の例です。

www.youtube.com Comment: このあたりから、スライダー*7の配置も出てきます。スライダーの見かけの物量に惑わされずに安定した剣捌きを維持する力が必要です。

 公式譜面でもExpert+はけっこう難しいのですが、簡単なものはこのレベルでクリアできる程度でしょうか。

6,000pp以上8,000pp未満

 ここら辺から一般人がついていけない領域です。実際にプレイしている様子を一般人が見たら「上手いね〜」というよりは「えっ、なんかめっちゃ腕を高速移動させてる……近寄らんとこ……」ってなるレベルです。

 ランクを上げようとする場合は、もう簡単な譜面に手を出しても意味がありません。譜面あたりだと 300 ppが目安になりますが、一部の美味しい譜面なら到達可能という感じです。個人スコアの計算方式の都合上、譜面あたり 200 ppぐらいは稼がないと意味がないので、難しい譜面に挑戦することから逃げられなくなるといった感じです。苦しい戦いを余儀なくされる人が多いと思います。

 このレベルのランカー同士だと、ppを稼ぐために色々な高難度譜面を漁っているのは大前提です。どんな譜面かはお互い知っているので、「今日、"アバ"、 1 %伸ばしたワ……」「"テオ"のあそこはヤバい……」といった効率的な会話が可能になります。(2020/10/11追記。ランク譜面の数が膨大になってきたので、それほど「限られた譜面でお互い争っている」という状況でもなくなってきました。みんな自分に合った好きな譜面をやろう!)

 このレベルの前半の人が触る譜面の例です。

www.youtube.com

 このレベルの後半の人が触る譜面の例です。

www.youtube.com

 公式譜面のExpert+のうち、難しいものっていうか配置が変なものだとこのレベルでクリアできる程度でしょうか。

8,000pp以上10,000pp未満

 この辺りから、譜面あたりのppでいうと 300 オーバーが必要になりますが、例外的に「美味しい」譜面を除いて、単純な反射神経やまぐれだけでは到達できないラインであり、ある程度相性に左右されずに安定したパフォーマンスを発揮する実力が必要になります。このレベルだと中難度以下の譜面はフルコンボが当たり前で、 90 %より上の精度をどれだけ稼ぐかという極限の争いになってきます。ここまで来れば、ランク譜面をやり込んでいて、大体の譜面に対応できることがある程度保証されていると言えると思います。

 プレイスキルだと、典型的な配置ならば条件反射でフルコンボを取れなければ話にならないレベルで、さらなる壁として、超密度の配置や、手首を捻るようなトリッキーな配置が出てくるので、それらへの対応が新しい課題になります。身体(というか手首)への負担も過大なものになっていき、その一方で、大半の譜面は1ミスしたら更新の見込みなし、という勝負になるので、ストレスも増大していきます。フィジカルケアとメンタルケアは必須です。

 このレベルの前半の人が触る譜面の例です。

www.youtube.com

 このレベルの後半の人が触る譜面の例です。

www.youtube.com

 公式譜面だとこのレベルのはほぼ存在しないですが、GhostのExpert+とかはここにあたるかなと思います。

10,000pp以上12,000pp未満

 このあたりからアスリートの世界に入ってきます。先程述べた極限の争いを高難度譜面で行っている感じです。

 日本では上位47名からがこのクラスになります。譜面あたりのppで言うと375あたりが目安になりますが、それらを稼げるような譜面は基本的に物量がものすごいことになっています。ある程度の基礎体力・筋力は必須ですが、それ以上に鍛え上げられた視認力と集中力が重要になってきます*8。そういった意味でも完全にスポーツの世界です。

 プレイスキルについては、もはや私が語り得るレベルを超えてきているので、ここから先は説明を省略します。

 このレベルの人が触る譜面の例です。

www.youtube.com

12,000pp以上14,000pp未満

 このあたりから意味のわからないレベルになります。先程述べた極限の争いを超高難度譜面で(以下略。日本では上位8名からがこのクラスになります。

 プレイヤー当人には得意不得意があったり、まだ上が…という思いもあるとは思いますが、さすがにここまで来ると超上級者と言っていいのではないでしょうか。

 このレベルの人が触る譜面の例です。

www.youtube.com

14,000pp以上

 世界トップクラスです。世界大会とかで優勝争いするのはこのレベルの人達です。前の人達と比べて何がすごいのかと言われると明確に説明するのが難しいのですが、こういう人達のプレイ動画を見ると、あまりにもスムーズすぎるので「逆に譜面が簡単に見える」という不思議な現象が発生します。達人の域です。世界ランクで上位40名からがこのクラスに入ります。

 このレベルの人が「触り始める」というランク譜面はもはや存在しませんが、世界の頂点に近い一握りのプレイヤーでないとクリアすらできないようなチャレンジマップの動画を貼ってきます(非ランク譜面)。

www.youtube.com

まとめ

 みんなも怪我にだけは気をつけながらたのしくBeat Saberをやろう!

*1:デフレする可能性もゼロではないのですが、諸々の事情により基本的にはインフレ傾向です

*2:16分音符刻みで並んだ上下ノーツの連続。

*3:左下から右上に斬らせるような配置。

*4:譜面ごとのppに高い順を並べて、0.965 をかけていったものの合計が個人ppになります。例えば、理論上、譜面あたり200ppを稼ぎ続けたら合計は 200/(1-0.965)=5,714 ppになりますが、実際はもっと低くなるので、おおよそ譜面あたりの最高ppの 25 倍ぐらいが目安になります

*5:腕を交差させるようなストリーム。

*6:片手だけを高速で振り回すような配置。見た目以上に難しい。

*7:複数のノーツをなぞるように一度に斬る配置

*8:上位ランカーの姿を配信などで見かけることはありますが、筋骨隆々な人は少なく、むしろ痩せ型の人が多いです

PythonとHerokuを使ってTwitterBotを作りました(ソースコード以外編)

 突然ですが先日、以下のようなBotを作成しました。

twitter.com

 Beat Saberという音ゲーについての情報提供を目的にしたもので、タイムラインの情報から以下の内容を自動的につぶやきます。

  • 現在配信中と思われるtwitchチャンネルを複窓で表示するためのURL
  • 一定時間ごとに投稿されたビーセイのハッシュタグがついたツイート(だいたい動画)をまとめてリツイート

 Botを作るにあたって手順や参考にしたページ、躓いた点などをまとめておきたいと思います。同じ内容を扱った記事は複数ありますが、(作成中の私と同じように)初めて作業する人だと既存の記事で想定していないようなポイントに躓いたりするものなので、何らかの形でそういった方々の助けになればと思います。

 一応備忘録がわりに説明文を加えていますが、もしプログラムを触ったことがない*1人が何もインストールされていない状態から始めるとしたら最低限の手順書になるように書きました。OSはWindows 10 64bitを前提としていますが、もし手順を参考にされる方がいればOS等は適宜読み替えてください。

目次

Botアカウントの作成

f:id:hibit_at:20190728214538p:plain

やること:TwitterBot用の新アカウント作成

 何はともあれアカウント登録。

APIキーの取得(Twitter開発者登録)

f:id:hibit_at:20190728214616p:plain

やること:ここで登録&作文

 ここから開発者っぽい領域に入っていきます。Twitterのアカウントとは別に、Twitterのdeveloper(開発者)としての登録をします。開発者になるとAPIキーというものをもらえます。

 APIキーについての詳しい説明は省きますが(というか私も詳細をわかっていない)、普段はTwitterのアプリやWebブラウザを通してしか見られないツイート内容やフォロワー数といったデータを、直接もらったり操作したりするためのパスワードのようなものです。これによってBotに色々させることができます。もちろん、誰にでもそんなパスワードを渡したら悪用されて危険なので、信頼できる作文を書ける開発者にのみ渡されます。

 そう、APIキーをもらうためには作文poemが必要なのです。それも英語の!(一応日本語でもできるらしいです)

参考記事

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2018年9月時点の情報 - Qiita

 なお注意点として、APIキーで操作できるアカウントはログインしているアカウントのみです。つまりBotを操作するためには、Botのアカウントを作成して、そのアカウントでDevelopersサイトにログインしてDeveloperの申請を行わなければなりません。

 私は最初これに気づかず(気づけよ)作文を2回やるハメになりました。なお、2回とも認証は一瞬(本当に数秒レベル)で降りました。審査に一週間かかるという噂はなんだったのか。

Pythonのインストール

f:id:hibit_at:20190728214820p:plain

やること:ここでインストール

 無事にAPIキーが取得できたら、いよいよそれを用いて実際にTwitterを内部的にアレコレするプログラムを作っていきます。その気になればどの言語でもできるんでしょうけど、Pythonが色々ライブラリも揃っていて情報も豊富なのでそれを使っていきます。上のURLには最新のPythonが公開されているはずなので、クリックした先にある「Windows x86-64 web-based installer」でインストーラがダウンロードできます。

f:id:hibit_at:20190728215011p:plain

 なお注意事項として、Pythonをインストールする時の注意点として、環境変数チェックボックスを入れましょう。これがないとコマンドプロンプトpythonpipといったコマンドが使えません。特にpipが使えないのは致命的です。

参考記事

Pythonインストール(Win10)編 - Qiita

Pathを通すとは、環境変数とは - Qiita

Pythonモジュールのインストール

やること:コマンドプロンプトで以下のコマンド

pip install requests_oauthlib

 Pythonは色々なことができるプログラム言語ですが(わかったようなことを言う)、Python自体にそのすべての機能が備わっている訳ではありません。色々な機能を持ったモジュール(部品)として公開されており、プログラムごとに必要な機能を応じてインポートする必要があります。また、標準ライブラリに含まれていない機能は必要に応じてダウンロードしインストールする必要があります。

 例えば今回のBotでは、APITwitterに投げてデータを受け取る……という操作を行いますが、このような機能はPythonに備え付けられていませんし、まさかフルスクラッチでかける訳がありません。なので、外部プログラム(モジュール)を利用してそれを簡単にできるようにします。

 で、このモジュール、結構いっぱいあります。今回のBotだけでも以下のモジュールが必要になりました。

  • json --- JSON エンコーダおよびデコーダAPIを通したやりとりは基本的にjsonというフォーマットのデータになるため、これが必要です。
  • sys --- システムパラメータと関数。絵文字のエンコードに使います。
  • codecs --- codec レジストリと基底クラス。絵文字のエンコードに使います。
  • datetime --- 基本的な日付型および時間型。完成したプログラムには使いませんが、デバッグの時に使いました。
  • requests_oauthlib --- OAuth認証のためのライブラリ。これがないとTwitterとのデータのやりとりができません。これだけは別途インストールが必要。

Pythonプログラムの作成

やること:ソースコードをかく

ソースコードについては近日中にQiitaに公開し解説も加えるつもりです。目下、機能改良&コード整理中なので……。

 いよいよプログラムを書いていきます。プログラムを書くことはそれこそメモ帳でもできますが、エディタを使った方がインデント(プログラムの入れ子関係を示すための文頭開始位置)を自動で揃えてくれたり、シンタックスハイライト(要素ごとに色を変えてプログラムを読みやすくする)をしてくれたりするので、その方が書きやすいでしょう。私はPythonとセットになっている純正のエディタで特に不満がなかったのでそれで書いていました。

ローカル環境での自動化

f:id:hibit_at:20190728221341p:plain

やること:Windowsタスクスケジューラーでタスクの設定

 無事に、BotにツイートをさせるPythonプログラムがかけました。原理上は人間がこれを注意深く時計を見ながら10分に1回ダブルクリックをすれば定期ツイートをしてくれるBotBotじゃねえ)が実現しますが、とてもそんなことはやっていられないのでプログラムにやらせましょう。

 幸い、Windowsにはタスクスケジューラーという備え付けのプログラムがあり、これは定期的に指定したプログラムを実行してくれるというまさにうってつけのものです。

参考記事

タスクスケジューラにpythonを登録する方法(引数付実行) - Qiita

 これで自動化完了! 10分に1回、PC上でPythonファイルが走るようになります……が、毎回Pythonが立ち上がるのは正直目障りです。そして何よりPCを起動し続けていなければなりません。真の自動化のためには、自分のPCとは無縁なところでTwitterAPIを送り続けるような仕組みが必要になりそうです。

 そのための仮想環境を提供するサービスが、次に説明するHerokuになります。

Herokuのアカウント作成

f:id:hibit_at:20190728221506p:plain

やること:ここでアカウント登録した後、ここCLIをインストール

 Twitterとかと違ってややとっつきづらいサイトですが、まあ登録していきましょう。このサービスの中にさっきのパイソンファイルを置いて実行してもらう、ということになるのですが、ドラッグ&ドロップとかをするわけではなく操作は基本的にコマンドで行います。開発者はコマンドを使うものなのです。慣れない人は頑張りましょう。

f:id:hibit_at:20190728222156p:plain

 また、先程のpipと同じく、Windowsコマンドプロンプトにherokuを扱うための命令一式をインストールする必要があります。それがCLIです。インストールしていきます。

Gitのインストール

f:id:hibit_at:20190728222034p:plain

やること:ここでインストール

 更にややこしいのですが、Herokuのファイルを管理するためにはGitというシステムを使う必要があるので、それも別途コマンドラインにインストールする必要があります。さっきからインストールするものばかりですね。

参考記事:

自分用 Git For Windowsのインストール手順 - Qiita

Herokuへのデプロイ

やること:専用のフォルダを作成し、コマンドプロンプトで以下のコマンド

mkdir application_folder

でフォルダを作成し、Pythonファイルやその他設定ファイルを格納

cd application_folder
git init
git add.
git commit -m "commit"
heroku login
heroku create application_name
heroku buildpacks:set heroku/python
git push heroku master

※もし実際に上の手順をされる方がいたら、application_folderapplication_nameは自分のアプリの名前に変えてください。

 これでようやくHeroku上にPythonファイル(やその他設定ファイル)を送るための準備が整いました。ローカルで作業用のフォルダを用意して、いろいろファイルを用意して(このあたりの詳細は参考記事を見てください)Herokuにpush(ローカルの作業内容をインターネット上の大本に反映させること)します。Heroku上でプログラムが動く状態にすることをデプロイと言いますが、これでデプロイ完了です。

 なお注意点として、Pythonをデプロイする際には、Python用のビルドパックというものを設定する必要があります。ブラウザから設定することもできますが、コマンドでも設定できるので、上のコマンドではそれも一括してやっています。

 私はこのデプロイを通すときに何回やってもエラーが出てデプロイできなかったので困り果てていましたが、知人に相談したところ 「requirements.txt」の名前を「requirement.txt」にしていたということが発覚しました。お恥ずかしい……。これも誰かの参考になるかもしれないので言いますが。

参考記事

簡単!Herokuで動くTwitter botをPythonで実装する - Qiita

Herokuスケジューラの設定

f:id:hibit_at:20190728222521p:plain

やること:HerokuスケジューラでPythonファイルを定期的に実行するようにする

 長かった戦いにも終わりが訪れようとしています。後はHeroku上のスケジューラで、デプロイしたプログラムを定期的に走らせるようにすれば自動Botの完成です。Herokuにはスケジューラというアドオンがあるので、それを設定します。Herokuのブラウザでも設定できますが、以下のコマンドでも開くことができます。

 なお、Herokuスケジューラは無料のアドオンですが一応クレジットカードを登録する必要があります。

f:id:hibit_at:20190728222625p:plain

 これで定期的に自動ツイートするBotが完成しました!

*1:コマンドプロンプトの説明はないですが、もし知らなければググってください

VRChatのアバター改変でテクスチャにロゴ等を貼る方法

 VRChatをプレイしているとアバターの服にロゴ(または肌にタトゥー)等のワンポイントつけたいとかそういうことがあると思います。基本的にはテクスチャにロゴを貼り付けるだけなのですが、一手間必要な場合が多いのでその手順を解説していこうと思います。

基本…UVマップとその問題点

f:id:hibit_at:20190704154453p:plain

 以降、ミーシェちゃんのモデル(かわいい)(BOOTHで販売中だよ!)を基準に解説していきたいと思います。

 3Dモデルはメッシュ(ポリゴン)の表面を1枚の平面の「地図」にして、そこに絵を描き込んでいく、という方法でテクスチャ(表面の質感)を表現しています。この地図をUVマップと言います。3次元(X軸、Y軸、Z軸)からなる物体の表面を新たに2次元(U軸、V軸)に転写することからUVマップと呼ばれます。

 しかし、サイコロのような物体でない限り、立体は必ず曲面を持っています。それを平面の地図に「まっすぐ」転写するのは不可能であり、必ずどこかに歪みが現れます。これはUVマップの仕組み上避けられないことです。

f:id:hibit_at:20190704154709p:plain

 これは実際のミーシェちゃんの服のテクスチャです。赤い線がUVマップになります。普段は表示されていませんが、psd(フォトショップデータ)にはレイヤーとして保持されているので、今回はあえて表示しています。この赤い線が実際のポリゴンの1枚1枚*1と対応しています。

 私は以前psdデータがあると色変えがしやすいという記事を書いたことがありますが、本記事のような場合にもpsdデータがあると役立つので、販売モデルはなるべくpsdデータ付のものがいいと思います。やや余談ですが。

f:id:hibit_at:20190704154901p:plain

 ちなみに、あえてUVマップの線を3Dモデルに写してみた図。時々非表示にするのを忘れて素でやってしまうことがある。

 3Dモデル上では自然な線ですが、UVマップ上ではナナメになっていました。

 このテクスチャにそのままロゴをはりつけてしまうとどうなるか。

f:id:hibit_at:20190704155547p:plain

f:id:hibit_at:20190704155630p:plain

 傾いています。というか左右反転しています。UVマップが左に傾いていれば逆に右に傾き、縮んでいれば逆に拡大して表示されてしまいます(数学的に表現すれば、UVマップの逆変換を受けてしまいます)。更に今回は、UVマップを「裏から見たような」形で展開しているので、それの影響も受けています。このようなことはままあります。というか、そういう方が多いと考えてよいでしょう。

 そこでどうするか。

方法1…ロゴを変形させる

 力技かつわかりやすい方法です。UVマップが歪んでいるなら、ロゴもそれに合わせて歪ませればいいじゃない。幸いgimp(無料ツール)は自由変形があるのでそれほど苦ではないです。Shift + Tで出来ます(鏡像反転はShift + F)。ビーくん*2をこう……

f:id:hibit_at:20190704155810p:plain

 変形!

f:id:hibit_at:20190704160138p:plain

 解決!

 ただこれには限界があって、関わるポリゴンが少ないかつ曲率が小さければ大丈夫なのですが、どちらかが複雑になってくるとUVマップの歪みが大きくなってきます。直線的な自由変形では対処しきれなくなる……というのもありますが、例えばある箇所と別の箇所で対応するポリゴンのサイズが数倍、という状態になると、結果として表示される解像度にもその差が現れてきます。見栄えが少し悪くなるかもしれません(ロゴの一端がぼやけるなど)。

 場合によっては、UVマップ自体を直す、ということができるので、次の項目で説明します。

方法2…UVマップを修正する。

 こちらの方がアプローチとしては根本的ですね。社会が間違っているなら、社会に合わせて自分を殺すのではなくむしろ社会を変えていく、そんな男気を感じます。ただ、後述するデメリットのため、いつでも使える訳でもないので注意が必要です。

 この方法では、みんな大好きBlenderを使う必要が出てきますが、がんばりましょう。

 さて、Blenderにミーシェちゃんのfbxを読み込ませていきます。

f:id:hibit_at:20190704160526p:plain

 初期状態ではよくわからないタイムラインみたいのが表示されていると思うので、ここにUVマップを表示するようにします。

 ミーシェちゃんは既にUVマップが展開済なので、服のオブジェクトを選択して編集モードにすればすぐにUVマップが出てくるはずです。

f:id:hibit_at:20190704160735p:plain

 この内4枚を正方形にしたいと思います。

f:id:hibit_at:20190704160934p:plain

 服のUVマップの内、真っ直ぐにしたい辺を選択して、縦にしたいならば「X軸揃え」、横にしたいならば「Y軸揃え」をします(ショートカットキーはW)。お前さっきU軸とV軸ゆーたやん。なんでX軸とY軸になってるの? 私がBlenderに聞きたいよ……。

f:id:hibit_at:20190704161147p:plain

 後は細かい調整をすれば(画像を貼り付けるという意味では)綺麗なUVマップが完成します。辺を動かす時に周りも動いてしまうようであれば「プロポーショナル編集モード」になってますので注意。

 もちろんこの方法にはデメリットもあって、もともと完成されていたテクスチャ(今回の例であれば服のシワなど)の方が歪んで表示されてしまいます。影響する範囲が小さければほとんど気にならないですが、大きければ無視できない範囲になるかもです。服のつなぎ目等のテクスチャを巻き込んでしまったらその時点でアウトでしょうね。UVマップ、ムツカシイネー。

 皆様もUVマップの性質を理解しながら良き3Dライフを。

*1:正確には1ポリゴンは三角形ですが、2ポリゴンの四角形を基準にした方がわかりやすいので、以後「1枚」は「四角形」と考えてください

*2:このロゴのキャラの名前。著作権はかろうじて私にあります。

(主にBeat Saberを想定した)バーチャルモーションキャプチャーを調整するための方法

www.youtube.com

 バーチャルモーションキャプチャー(以下:VMC)を用いると、上に貼った動画のように、あたかもアバターがBeat Saber(以下:ビートセイバー)をプレイしているかのような動画が撮れます。詳しくは以下の手順を参照。

sh-akira.github.io

 しかし何も調整を加えないと、

  • 目を見開きっぱなし
  • 手の平ひらきっぱなし
  • 手が捻じれる

 という問題が発生するのでそれぞれ対策を解説していきたいと思います。

目を見開きっぱなし

 fbxから変換したままのVRMでは、VMCで表示されるアバターはまばたきをしません。目を見開きっぱなしです。別に気にならないと言えば気にならないレベルですが、まばたきがあると一気に「生きてる感」が出るので設定していきましょう。

 正確には、VMCにはデフォルトでまばたきの設定が入っているのですが、素のVRMデータにはそれに対応する「BLINK」というブレンドシェイプが設定されていないので、まばたきの命令は出していてもその動かし方がわからないという状態です。

 では、「BLINK」の設定をしていきましょう。VRMを出力したということはUnityに以下のようなアセットが設定されているはずです。(既存のVRMをいじる場合でも、UniVRMを読み込んだUnityにVRMファイルを読み込んだ時点で生成されます)

f:id:hibit_at:20190321215519p:plain

 その中の「VRM名.BlendShapes」フォルダにある「BlendShapes」を選択すると、インスペクタに色々な表情に対応するブレンドシェイプの一覧が表示されます。

f:id:hibit_at:20190321215827p:plain

 その中の「BLINK」を選択します。

 売り物のアバターだったら普通、対応するシェイプキーを作っているので、その値を「100」にします。

f:id:hibit_at:20190321215937p:plain

 シェイプキーは対応するメッシュに格納されています。三角を押して展開しないとシェイプキーの一覧が表示されないので注意。大体のモデルは「face」とか「body」とかそんな名前になっているはず。

f:id:hibit_at:20190321220042p:plain

 これで設定完了。もちろん、シェイプキー(頂点の変形)が作られていることが前提で、何もシェイプキーを設定していないモデルが魔法のようにいきなり瞬き出したりはしないですからそこは注意です。

f:id:hibit_at:20190321230415p:plain
図にするとこんな感じ

 …という流れですね。この流れは瞬きに限らずあらゆる表情付けに共通なので覚えておくとよいかもしれません。また1つのブレンドシェイプに複数のシェイプキーを組み合わせることもできます(なので「ブレンド」シェイプな訳ですね)。

手の平ひらきっぱなし

 VMCで読み込んだモデルは、手を開いた状態で持ち込まれます。コントローラーのタッチパッドを触ると色々手の形が変わりますが(VRChatと同じ制御です)

f:id:hibit_at:20181220024849p:plain
VRChatの表情制御の図

 まあ普通にビートセイバーをやっていればここはまず触らないので、多くの場合は手の平を開きっぱなしにしながらセイバーを振り回す訳です。

f:id:hibit_at:20190321220412p:plain
手が開いている様子

 これはこれで超能力者みたいな趣がありますが、やはりセイバーを握りしめていた方が自然でしょう。

 なのでVMC側で握りっぱなしにするようにします。

f:id:hibit_at:20190321220551p:plain

 ここの「ショートカットキー」をクリック

f:id:hibit_at:20190321220706p:plain

 色々と手の形を動かす命令があります。もったいないですが、すべて削除しましょう。

f:id:hibit_at:20190321220835p:plain

 そして新たに命令を作りましょう。上の図の「カスタム」が新しく作った命令になります。「ハンドジェスチェー追加」を押して、以下のようなセッティング。初期設定からいじった部分をすべて赤丸つけています。

f:id:hibit_at:20190321221055p:plain

 発動するキーは何でもいいのですが、私はキーボードの「S」にしてます。一度Sを押したら最後、この手は二度と開かれませんがまあビートセイバーをする上でならそれぐらいがちょうどいいです。この設定を一回してしまえば、「ショートカットキー」の右下にある「カスタム名称(保存でプリセットへ追加)」という所でこのセットをまるごと保存・呼び出しできるので、以降はワンクリックで出来るようになります。

手が捻じれる

 これは一部の人向けの問題になります。アバターの手の向きについては、VMC側である程度補正が入るっぽく、コントローラーを自然に持っている限りはいいのですが、それ以外の角度で持つ場合、手首が不自然に捻じれてしまいます(あらかじめコントローラを通常じゃない角度で持ってキャリブレーションしてもこの現象は発生します)。

f:id:hibit_at:20190321231142p:plain

 これは私が逆手で構えた時のポーズ。

f:id:hibit_at:20190321231436p:plain

 現実はこんな感じになっています。VMCの機能や(もしくはポリゴン自体をいじることにより)「手の角度」自体は補正できますが、問題はこれ。IK(インバースキネマティクス、手の角度から肘の動きを計算すること)が狂ってしまうため、ポーズが狂ってしまうのです。

 え? 逆手でプレイするのなんてお前だけだろって?

 確かに逆手でプレイするのは世界で私含めごく一部(最近は片手逆手の人が増えてきました)ですが、実はランカー勢は通常プレイにおいても、コントローラーを特殊な方法で持っているのです。

 それがこれだ!

f:id:hibit_at:20190321221307p:plain (元画像はBeat Saber界隈のDiscordに出回っているものです。作者を存じ上げない、というか特定不可能なため無断転載させていただきますが、問題があることが発覚した時点ですぐに対応させていただきます)

 名付けてB-Grip!

 実は、VIVEコントローラーを普通に持つと先端が大きすぎてアンバランスであるため、とても振り回しづらいです。これは難曲を攻略する上では死活問題です*1。そのためランカー勢(のうちVIVE勢)はほぼこのグリップでプレイしています。しかしこれだとVMCでは手首が裏返ってしまいます。これは全世界共通の問題なのです!

 ではどう直すかについて。

 トラッカーを追加して手の甲にはめましょう。

 今のところこの問題はマネーでしか解決できないのだ。いや、なんかIKをいじれるすごい技術があれば解決できるかもしれんけど……。

f:id:hibit_at:20190321221928p:plain

 ちなみにトラッカーを手の甲にわりあてる場合はVMCのここで割当設定を決める必要があります。自動割当だとコントローラを手だと認識してしまうので……。まあ、これは動画の見栄えにどうしてもこだわるなら、というレベルですね。

 皆様もよき動画撮影ライフを。

*1:ちなみにこれは冗談ではなく、世界のトップランカーの大半はOculusです

2018年+αにやったこと(主に3D)

 4月から3DCGを初めて、いろいろと知見が溜まってきました。まだまだ勉強中で、走りながら考えるといった感じですが、それらをまとめて書き溜めておかないと、自分がどういうことをやってきたのか、またその過程でどのようなサイトにお世話になってきたのかということを忘れてしまい、技術の基礎が疎かになってしまう感じがあるので、書き記しておきたいと考えております。

 本当は、半年に1回ぐらいのペースでやるべきだったのかもしれませんが(半年前の記憶でさえすでにあやふや……)、もうすでにそのタイミングを逃してしまったので、やや中途半端な時期ではありますが、2018年+αにやったこと、という形でまとめておきたいと思います。

(以下、長いので敬体ではなく常体で記す)

VRChatへのアバターアップロード

 4月。HTC Viveを買ってVRChatに登録する。

 すべての始まり。この頃はトラストシステムがなく、登録したらすぐにアバターアップロードができた。アップロードにあたっては、サンオ (id:san_o)さんの以下のページに大変お世話になった。残念ながらこの記事だけで更新が止まってしまったようだが、この記事だけで千金に値するブログだと思う。

vr-san-o.hatenablog.com

f:id:hibit_at:20190128013636p:plain

 一応こんなものだが。この時期はまだ販売アバターが少なかったので、Unity Asset StoreにあるSuriyunさんのアバターを改変して遊んでいた。VTuberでこの子を使っている方もいたようだ(詳しくない)。下はそのボクセルバージョン。

f:id:hibit_at:20190128015714p:plain

 なお、ボクセルの作成方法についてはサンフィッシュ熊野さんの3DCG出来ない!でもVRChatでオリジナルアバターを作りたい人向けチュートリアルが詳しい。

フルスクラッチアバターの作成

f:id:hibit_at:20190211004556p:plain

 今なお現役のパンダもどき。二面図をモデル作っていくという作り方を日本VTRさんの以下のページから学んだ。

nvtrlab.jp

 元の二面図のパンダからは似ても似つかない謎の生物になったが、これはこれで愛嬌があってよいのではと思っている。

f:id:hibit_at:20190211004235p:plain

 私の外向けのメインアバターであるダークエルフちゃん(一応そういう名前)。見てわかる通り、服装はJamiroquaiVirtual Insanityのオマージュ。この子はJamiroquaiを聴きすぎてしまった結果、自分をアボリジニだと思い込んでしまった悲しい子である。

 特にそのために参考にしたという訳ではないが、高知工科大学が公開している以下のページは基礎的ながらもかなり内容が濃く、これからBlenderを始める人におすすめである。

krlab.info.kochi-tech.ac.jp

 この頃はVRChatで知り合った人達に、とりあえずその日できたアバターを見せては反応をもらったりアドバイスをもらったりという感じで、非常に恵まれた期間だった。あるフレンドのオリジナルアバターを見て「アマチュアでもここまで出来るのか……」という衝撃を受けたのが、アバター作りにチャレンジした一番のきっかけである。部屋にこもってBlenderをいじっていても、そういう気持ちは起きなかっただろう。

改変アバターの作成

f:id:hibit_at:20190211004704p:plain

 6月に作ったメインアバター。お気に入りではあるが、この子は露出度が高いしweebな感じがあるので、一応内向けアバターという位置づけ。この頃になると、フルスクラッチではなく販売素材や配布素材を活かして効率的に作っていく術を覚えるようになる。その時はタイミングが良いことにあるモデラーさんがVRChat向けに素体を配布してくれていたので、ありがたく改変させていただいた(今は広く公開はしていない)。服とか髪とか含めて1週間ぐらいで出来た気がする。

 今(2019年現在)では数百体のモデルがBOOTHを中心に売られている。もしVRChatを始めるのがあと半年遅かったら、自分はアバターを自作までする気になっただろうか? 今のコミュニティの人間と知り合えただろうか? 仮に知り合ったとして、同じような関係になれただろうか? そういうことを考えると不思議な気分になる。

数学の勉強を再開

 思うところがあり数学の勉強を再開した。図形の一般概念であるところの多様体のことを勉強したかったので、入門書として有名な「多様体の基礎」(通称:松本多様体)を購入し、一応一通り目を通した。

www.amazon.co.jp

 ラノベのように読めるということで有名だが、全然そんなことはなかった。位相と集合とか解析学とかあたりの基礎が抜けているっぽいので、そのあたりを補完してからリトライしようと思う。学部時代に数学を真面目に勉強しておけばよかったと後悔しているが、こういうことは思い立った時に始めるしかない。

 他に参考にしたものとして、東工大のサイトに上がっている川平准教授が公開されている多様体の基礎のキソというpdfは非常にわかりやすかった……が、もっと噛み砕いた資料、というか具体的な計算例や可視化例があってもいいかなと思う(というか私が欲しい)。私が多様体の気持ちをよく理解できるようになったら(cf. 多様体愛護協会)「多様体の基礎のキソのきそ」みたいな文を書こうと思う。

 全体的な理解とは別に、特に射影平面については面白い概念だと思ったのでUnityでビジュアライズできないかということに興味が移るが、これは後日レイマーチングを用いて一部成功した。

5次元立方体のバズ

 およそ1年前に投稿した5次元立方体のビジュアライズがなぜか1年経った頃になってバズる。phiさんがテセラクト(4次元立方体)シェーダを販売して話題になった頃だったから、皆様に耐性(?)のようなものがついたのかもしれない。ようやく時代が俺に追いついてきたということか……ということはなく、バズりは時の運の産物である。ただ、コーディングでこの動画を実装できたのはそれなりに面白いことだと思うので、それがある程度認められたようで嬉しかった。せっかくなのでQiitaに解説記事を書いた。

 5次元立方体についての動画はあまりなく、そこにある程度の私の新規性はあると思うが、YouTubeではJos Leysさんが超次元立体について非常に興味深い動画を多数投稿しているので、こういったレベルと比べるとまだ改善の余地がある。今後、UnityとVR/ARデバイスを用いてよりインタラクティブかつ、より体感的に幾何をビジュアライズすることにより新規性を出していきたい。

販売モデルリス

 6月頃から盛んになったアバター販売だが、すごい勢いで増え続けているので誰も整理できていないのが現状である。こりゃあ誰かがリスト化した方がいいぞ、ということでとりあえず作ってみた。最初に20体ぐらいのリストを作って(まだその頃は平和だった)Googleスプレッドシートで共同編集できるようにしたが、結論的にいうとこれは失敗した、というか更新停止をせざるを得なくなった。

f:id:hibit_at:20190129022704p:plain

 主に私とあるフレンドさんとで記入をしていたが、100体を超えたあたりで手が回らなくなってしまった。元から少数が人力管理するには無理のある量だったのだ。

 人力でダメなら機械じゃい、ということで正規表現Google Apps Scriptを勉強してBoothをWebスクレイピングすることを考えた。GASの扱いについてはこのページにお世話になった。ここら辺の経過はQiitaのここにまとめてある。

 しかしこれも結果的には失敗した。「3Dモデル」を機械的に抽出することはできても「どれがアバターで、どんな特徴を持つか」という情報を機械的に抽出するのが難しく、結局人力勝負になってしまうのだ。「3Dモデル」タグを持つ商品は2,000以上にのぼるが、人力で選別処理をするには馬鹿げた量だ。

 「大量のモデル群の整理がついていない」という懸念はたぶん誰もが感じている。例えば、ねこますさんは、作者個人が申請するWebプラットフォームのような構想が良いのではと言っている。これをやってみるのもアリかと思ったが、私がWeb周りに詳しくないのと、構築したところで周知浸透できるのかという点に不安があるので、今はまだチャレンジしていない。

 という訳でこれは未解決問題である。他に個人努力として考えられるアプローチとしては、キカイガクシューを頑張って、Boothの個別ページからアバターか否か・性別・外見をまとめる判別システムを作るとか(できるのか)?

シェーダ

 9月ぐらいからシェーダそのものをいじってみたくなる。最初は簡単な例から……ということで、いくつかのワンライナー改変を考えてQiitaに投稿したら、少し反響があって嬉しかった。その後、マンデルブロ集合固有ベクトルの図示などいろいろなシェーダを自作する。これらの勉強にあたってはちくわ (id:nn_hokuson)氏のおもちゃラボに非常にお世話になった。このサイトなくてはここまでスムーズにシェーダを勉強できなかったであろう。紛うことなき神サイトである。

 11月には、簡単なサーフェスシェーダだが、フルスクラッチで自作シェーダを作った。1行残らずすべてのコードの意味(少なくとも「変更したらどういう挙動を示すか」)を理解しているシェーダである。GitHubリポジトリここ、Qiitaの解説はここ

 また時期は前後するが、VRChatで見かけたFractal Explorerというワールドに感銘を受けて、ああいうのを再現できないかと思った。二次元の座標をもとに組むシェーダだと限界がありそうなので、レイマーチングに興味を持つようになる。その内GLSLとか読み書きできるようになりたい。

セル結合

 12月に書いた、セル結合について積年の恨みを書いた文章がなぜか異様にバズった。

deux-hibi.hatenablog.com

 これはまさに異様で、1,700ブクマ弱を獲得してその日のはてブロ総合トップになるとともに、Twitterのトレンドに「セル結合」が並ぶことになった。まさかここまで広がると思わず極端なキレ芸的文章を書いてしまったので、さすがにフォローした方が良いなと思って後日釈明記事を書いた。これで一躍人気ブログに……ということはなく、その後は細々とした感じに戻ったが、まあこれぐらいがちょうど良いんじゃなかろうか。それはともかく人類は(無意味な)セル結合をやめ……やめてくれると嬉しいな(遠慮)。

ビートセイバー(環境構築方面)

 12月にビートセイバー(Beat Saber)を始めた。単なる娯楽用のゲームを「始めた」と言うのも変だけど。ある晩、もののためしにコントローラーを逆手に持って数曲やってみたら「これは……”来る”……!」と謎の確信を感じ、その日から逆手でしかプレイをしなくなる(過言)。

 その思いを抑えきれず下のようなイラストツイートをしたところ、それを見かけたガチ勢の人から声をかけてもらった。これがきっかけとなってビートセイバーのディープな世界に突っ込んでいくことになる。

 このイラストは今年の初めに購入したiPad Proがなかったら描かなかったかもしれない。思いついた事柄をそのままApple Pencilで表現して数秒でtwitterに投稿できるのはすごいことだ。そう考えると今ビートセイバーを楽しめているのはiPad Proのおかげと言えるのか……?

 やったこととしては、LIVバーチャルモーションキャプチャー(VMC)の導入。このあたりは猫井ゆうなさんの解説ページがわかりやすくとても助かった。MODを用いたカスタムアバターの導入にあたってはのしろぐさんのサイトさんには非常にお世話になった。ビートセイバーに関する情報では、日本で一番まとまっているサイトではなかろうか。神サイトである。MODを使うかVMCを使うかどちらがいいのかというのは非常に難しい問題で、これについては別途記事を書くつもりである。

 なお動画撮影のためだけにトラッカーを買った。VR機器をフル活用するようになってからの方が、肉体の限界とか部屋の狭さとかが気になるようになった気がする。物理的制約から人を自由にするためのVRなのに、本末転倒では?

ビートセイバー(動画投稿方面)

 とりあえず逆手セイバーの可能性を示すために以下のようなマップ(譜面)を作成&撮影した。マップデータはここ

 あと、合同作譜というのもやった。サーバ上にあるマップを協同で編集するというやつで、わりとたのしい。こういうツール・MOD類がユーザー主導でどんどん公開されていくのもビートセイバーの良い文化である。

 せっかくみんなで作っているから、動画もリレー形式でプレイするものを作ってみてはどうかと呼びかけた。タイムシートを決めて、皆から素材動画をもらって動画編集をするということをやった。編集にはAVIUtlを用いた。非常に便利なフリーソフトだが、各種プラグインの導入やメモリ拡張が(ほぼ)必須なのでその点は注意。完成品は以下。

発信し続けること

 やりたいことや面白いと思ったことを発信し続けるのは大事だと思う。ふとしたことがきっかけで……というのはよくある話だが、結局そういうめぐり合わせがないと効率的に成長できないのが普通の人間だと思う。同時に、それと同じぐらい、頑張ったはずなのに上手くいかなかったことや自然消滅したこともあるというのが、普通の人間だと思う。こういうのは時の運が絡むので、こうすれば絶対に上手くいくということはない。

 だからうまい縁を引き当てるまではどんな形であれ、twitterの呟きでもブログでも飲み会の雑談でも何でもいいけど、可能な限りわかりやすく具体的にやりたいことのイメージや希望を発信し続けることが大事かなと思う。

2019年のこれから

 「最終的に何がやりたいの?」ということを簡潔に記すのは難しい(長期的には変わっていくものでもあるし)。現在考えていることを要約すると、世の中の美しいこと、複雑なことは突き詰めれば線形的な要素群に分解できて、いったん線形的に扱えるようにすればコンピュータに一括計算させられるので、プログラムを活かして上手くそれら(美しいことや複雑なこと)をビジュアライズしたい、ということになる。数学もプログラミングもそのためのツールに過ぎないと思っているが、まだまだ両者とも未熟である。

 それとは別に、3DとVR/AR(将来的にはXRの方がより総括的な名称になるのかな?)はまだまだ遊びの余地がたくさんあるので、そういう娯楽的な楽しみも追及していきたい。また、それらが一般化していく中で、編集や作業を効率化していきたいという需要は絶対出てくると思うので、そういった面でもプログラミング能力を活かせたらと思う。ニッチかつマイクロなOSS開発とかあったら参加してみたい(インターネットの詳しい人達おしえて!)。後は十分な食事と睡眠をとって健康に気を付けるぐらいだろうか。