hibitの技術系メモ

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

AAA~ZZZの間で「名称・略称として使われていない組み合わせ」をスクレイピングで調べる

概要

 Wikipediaに対してスクレイピングを行い、「AAA」~「ZZZ」までの17,576通りの文字列に対し個別の項目が存在するかどうかを調べたところ、約4割にあたる7,746通りについて個別の項目があることがわかった。

緒言及び方法

 世の中にはアルファベットからなるたくさんの名称・略称が溢れている。AAA*1もあるしZZZ*2もある。しかしアルファベット3文字からなるイニシャルの中で「存在しないイニシャル」というのはあり得るのだろうか? ありえなさそうな組み合わせ、例えばQZXなんてどうだろう。しかしこれも、今調べたら山登りのアプリが出てきた。

 これを真面目に考えると「名称が存在しているのとはどういうことか?」となり難しい問題となる。今私が考えたばかりの架空の団体は存在しているのか? 同好会の名前だったら? どこかで線引きをする必要がある。ここは少しハードルが高いが「(日本の)Wikipediaに項目があるか」ということを基準にしたい。アルファベットは26種類あるので、2文字だったら 26 \cdot 26=676通り、3文字だったら 26\cdot26\cdot26=17,576通りの組み合わせに対して個別のURLにアクセスすれば調査できるが、人間がやるには無理のある量である。プログラムにやってもらうとしよう。

 以下のようなプログラムをpythonで組んだ。とりあえず2文字バージョンで。

import re
import requests

#アルファベットのリストを作成
alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#文章を作成してからそれをリスト化
chars = list(alphabets)

#ちゃんと26文字あるか確認
print (chars)
print (len(chars))

#HITとMISSのカウント初期値
hit = 0
miss = 0

#2文字のイテレーション
for s in chars:
    for t in chars:
        #ソースを取得
        url = "https://ja.wikipedia.org/wiki/" + s + t
        content = requests.get(url).text
        #項目があるかをソース中の文章で判断
        if content.find("この名前の項目はありません") == -1:
            hit += 1
            pattern = re.compile(r'<title>(.*?) - Wiki')
            #タイトルを正規表現で抽出
            match = re.search(pattern,content)
            print(match.group(1) + "という項目があります ",end="")
        else:
            miss += 1
            print(s + t + 'という概念はja/wikipedia上に存在しないようです ',end="")
        print(str(hit) + " " + str(miss))

 これを実行すると以下のような結果が得られる。回線速度にもよるが、実際に実行すると5分ぐらいかかるので注意。

f:id:hibit_at:20191104140609p:plain

 右にある数字の内、前者は(日本の)Wikipediaに項目があるもの、後者はないものを指す。さすがに2文字だったらAAからZZまで使われていない組み合わせはなかった。

 複数の候補がある項目(おそらく大半がそうだろう)は単なる一覧ページになるのでタイトルはアルファベットそのものだが、1個しかヒットしないページは専用の項目が出てくる。上の画像で言うとZL,ZM,ZNがそうで、それぞれズウォティ*3ザンビア*4亜鉛*5となっている。こういう「ユニーク名称」をいちいち調べていたら雑学博士になれそうだが、まあ時間がないので割愛する。

 では本番で3文字。17,576行も出力されるので結果をもう少し細かく分けたい。全体のヒット数とは別に、一番最初のアルファベットによる個別のヒット数もつけることにした。多分Aだと多くヒットしてQだとヒットが少ないだろうみたいな予測のもと。

 ソースコードは以下の通り。上のコードにあったコメントやテスト用の命令は一部省いている。

import re
import requests

alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
chars = list(alphabets)

hit = 0
miss = 0
#1文字目は個別に集計を取る
parthit = 0
partmiss = 0
#後で集計する用の配列
parthits = []
partmisses = []

#3文字のイテレーション
for s in chars:
    for t in chars:
        for u in chars:
            url = "https://ja.wikipedia.org/wiki/" + s + t + u
            content = requests.get(url).text
            if content.find("この名前の項目はありません") == -1:
                hit += 1
                parthit += 1
                pattern = re.compile(r'<title>(.*?) - Wiki')
                match = re.search(pattern,content)
                print(match.group(1) + "という項目があります ",end="")
            else:
                miss += 1
                partmiss += 1
                print(s + t + u + 'という概念はja/wikipedia上に存在しないようです ',end="")
            print(str(hit) + " " + str(miss))
    print(s + 'から始まるイニシャルを検索し終わりました。(' + str(parthit) + " " + str(partmiss) + ')')
    parthits.append(parthit)
    partmisses.append(partmiss)
    parthit = 0    
    partmiss = 0

print('合計' + str(hit) + " " + str(miss))

#1文字目ごとの個別累計を返す
for i in range(0,len(chars)):
    print('1文字目が' + str(chars[i]) + " " + str(parthits[i]) + " " + str(partmisses[i]))

 これを実行すると結果のようになる。回線速度にもよるが、実際に実行すると数時間かかるので注意。

結果及び考察

f:id:hibit_at:20191104171951p:plain

 まず全体の結果として、全組み合わせ17,576通りの内、ヒットした(Wikipediaに項目があった)アルファベットの組み合わせは7,746通り、そうでないものは9,830通り存在した。ヒットしないものの方が多い! ただ、これは「Wikipediaに項目がある」という高いハードルを越えたものが半分近くあるということで、当然項目がなくても存在・認知されている名称・略称は無数に存在する。この9,830通りはただの「使われていない可能性があるもの」であり、中小企業名(明らかな使用例と考えて良いであろう)等もここには入って来ないことから考えると、実際はそのほとんどに明らかな使用例が存在すると考えるのが自然だろう。

 次に開始文字の結果。ベスト3とワースト3を並べると以下のようになる。

順位 文字 ヒット数
1位 A 554
2位 C 503
3位 S 455
24位 X 91
25位 Z 78
26位 Q 67

 予想通りAのヒット数が多く最大の554、また最小も予想通りでQの67。念のため言っておくと答えを先に見ていた訳ではない。人気組はAのほかにCとS、不人気組はQのほかにZとX、まあそうだよね……という感じである。

 ここらの発展として「本当にその組み合わせの使用例が存在しないか」を検証しようとすると難しい。例えば、より正確らしい手段として「Googleの検索クエリに投げてみて、『もしかして』を提案されなければ存在」という実装が考えられるが、世の中は検索結果が全てではないし、アマチュア小説の固有名詞みたいなものをどうカウントしていいかは判断が分かれるだろう。今後の研究の発展に期待したい(発展するのか?)。

おまけ

f:id:hibit_at:20191104170830p:plain 解析の様子を抜粋したやつ

*1:トリプルエー、音楽ユニット

*2:佐咲紗花の楽曲。今調べました

*3:ポーランドの通貨らしい。初めて知った。

*4:国名は知っていたがZMに対応しているとは思わなかった

*5:これはさすがに知っていた

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

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のグローバルランキングの実力評価、譜面例(1/17改稿)

※このエントリはchokudai氏による以下のエントリを全面的にオマージュしております。※

chokudai.hatenablog.com

※記事公開時点からかなりインフレが進んだため、全面的に記事を書き直しました(2020/01/17)※

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

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

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

ppとその実力

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

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

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

  •   0pp~…MODを導入すれば誰でもなれるレベル。
  • 1,000pp~…ランク譜面を触り始めたレベル。
  • 2,000pp~…中難度譜面を触りだすレベル。
  • 3,000pp~…ここら辺から一般人からみればもう上級者の領域。
  • 4,000pp~…高難度譜面を触りだすレベル。
  • 5,000pp~…ここら辺から一般人がついていけない領域。
  • 6,000pp~…だいたいのランク譜面をクリアできるレベル。
  • 7,000pp~…超高難度譜面に挑み始めるレベル。
  • 8,000pp~…ここら辺から化け物の領域。
  • 9,000pp~…いみがわからない。
  • 10,000pp~神の領域

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

  • MODについて

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

  • お前は誰だ

 普通の一般プレーヤーです。現在、世界1,000位以内(日本100位以内)で、上に挙げた区分だと「超高難度譜面に挑み始めるレベル」になります。オマージュ元のchokudai氏がAtCoderの社長であり自身もトッププレーヤーであるのを考えると説得力のなさが際立つというか、お前偉そうに何様やねんという感じがしますが、ご容赦ください。

  • 動画について

 以下の説明では「このレベルの人が触る譜面の例」としてYouTubeの動画を引用していきます。譜面の難易度としては「そのレベルの人が手を出し始める譜面、やっとクリアできるようになる譜面」という位置づけですが、YouTubeに上がっているような動画はだいたいプレーヤーが上手すぎて(大半がトップランカーです)余裕でクリアしているのでご注意ください。決して「この人がこのレベルだよ!」という意図ではないですよ! あと、どのような譜面でppを稼ぐのは(超上級者以外は)自由であり、人によって得意不得意があるので、動画の例はあくまで目安です。

  • pp相場感

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

0pp以上1,000pp未満

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

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

 ランク譜面を触り始めたレベルです。色々なランク譜面をやっていたらすぐに到達します。

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

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

www.youtube.com

Comment: 基本的な動きでノリよく斬れる、初心者でも楽しみやすい譜面です。

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

 中難度譜面を触りだすレベルです。ストリーム*2や対角*3といった配置が頻出するようになり、一気に音ゲー感がでてきます。たのしい。

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

 このレベルの人が触る譜面の例です。(公式の初期譜面のEX+もこのあたりでしょうか)

www.youtube.com

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

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

 ここら辺から一般人からみればもう上級者の領域です。単なるクリアだけでなく「精度(Accuracy)」を意識するようになります。ノーツを追っかけるだけのプレイではなく、余裕を持って振り抜く美しいプレイになります。

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

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

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

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

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

www.youtube.com

Comment: 全体的に密度が高い譜面ですが、難所として変則的なストリームの塊が3回訪れます。それをうまく処理できるかがカギであり、上級者への試金石のような譜面です。

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

 高難度譜面を触りだすレベルです。このあたりだと、目についたランク譜面を触るという段階は卒業して(低pp譜面をクリアしても個人ppが増えないので)、ある程度高pp譜面に狙いを定めて攻略するようになります。高pp譜面の数は限られているので、みんなが同じような譜面を攻略しその精度を競うといった世界になってきます。ピアノのコンクールみたいだ……。

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

 身体面では、腕だけの力任せの振りを卒業して、手首や肩を使ってうまくノーツを斬れるようになりますが、それに呼応するかのように譜面の配置がいやらしくなるので体への負担は減りません。腕だけでなく色々な部位にダメージが来るようになります。

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

www.youtube.com

Comment: 最初は簡単ですが、クライマックスに向けて加速度的に密度が上がっていき、最後に怒涛の両手斬りの連続が来ます。非常にドラマチックな構成であり、ファンも多い譜面です。ランク譜面を触り始めた人の中には「これだけはクリアできるようになりたい!」と思う人も多いのではないでしょうか。

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

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

 ランクを上げようとする場合は高難度譜面にしか目にいきません。もしくは中難度譜面をSSクリア。苦手譜面でも頑張って攻略しないとppが増えないので、苦しい戦いを余儀なくされる人が多いと思います。

 このレベルのランカー同士だと、高難度譜面の精度を争っていることは大前提です。どんな譜面かはお互い知っているので、「今日、"アバ"、1%伸ばしたワ……」「"テオ"のあそこはヤバい……」といった効率的な会話が可能になります。

 プレイスキルの面では、速い譜面に対応できるようになります。bpmや密度がすごいことになってくるので、的確に処理できる動体視力や反射神経が必要です。

 身体面では、筋肉痛とかはもうあまりないと思いますが、腱鞘炎や関節の故障といったクリティカルな事例が発生する時期のような気がします。ドクターストップがかかって数週間の安静を余儀なくされた知り合いが数人います。そういうゲームなので仕方ないですね。

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

www.youtube.com

Comment: そこまで複雑な配置はないですが、とにかく密度が高いです。初心者が筋肉だけで対処するのは不可能です。

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

 だいたいのランク譜面をクリアできるレベルです。様々な譜面を攻略・挑戦してきた結果、ある程度の基礎力ができているので、あらかた初見の譜面にも対応できるようになります。配信でリクエス*6を受けてもスムーズにこなせます。

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

www.youtube.com

Comment:途中までは普通の高密度譜面ですが、最後に、手をクロスさせながら上下左右に乱れ斬る発狂ゾーンがきます。

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

 完全にpp中毒です。少しでもppを上げるために超高難度譜面に挑み始めて撃沈していきますが止められません。苦しいのに止められないのは依存症の兆候です。重篤化する前に医師に相談しましょう。

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

www.youtube.com

Comment: 高速で変則ストリームが来たり発狂ゾーンが来たり片手地帯が来たり、難所のフルコースみたいな譜面です。

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

 ここら辺から化け物の領域です。日本人には現在22人います。

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

www.youtube.com

Comment: ランク譜面の女王。NJS(ノーツが流れてくる速度)がクソ速い上に配置も極悪。クリアできるかこんなん。

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

 いみがわからないレベルです。日本人は現在6人います。

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

www.youtube.com

Comment: ランク譜面の王。腕が四本ぐらい欲しくなる。

10,000pp以上

 神の領域です。世界でも現在40人ぐらいしかいません。うち日本人は現在2人います。というか世界1位が日本人です。

「このレベルの人が触る譜面の例」というのはもはや存在しないのですが、ランク譜面以外だと冗談みたいなチャレンジ譜面があります。世界で1人しかクリアできていません。

www.youtube.com

Comment: なんだこれわ

まとめ

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

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

*2:1/4グリッド刻みで並んだ上下ノーツの連続。

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

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

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

*6:視聴者からやって欲しい譜面を投げてもらえるmodがあります

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です