AAA~ZZZの間で「名称・略称として使われていない組み合わせ」をスクレイピングで調べる
概要
Wikipediaに対してスクレイピングを行い、「AAA」~「ZZZ」までの17,576通りの文字列に対し個別の項目が存在するかどうかを調べたところ、約4割にあたる7,746通りについて個別の項目があることがわかった。
緒言及び方法
世の中にはアルファベットからなるたくさんの名称・略称が溢れている。AAA*1もあるしZZZ*2もある。しかしアルファベット3文字からなるイニシャルの中で「存在しないイニシャル」というのはあり得るのだろうか? ありえなさそうな組み合わせ、例えばQZXなんてどうだろう。しかしこれも、今調べたら山登りのアプリが出てきた。
これを真面目に考えると「名称が存在しているのとはどういうことか?」となり難しい問題となる。今私が考えたばかりの架空の団体は存在しているのか? 同好会の名前だったら? どこかで線引きをする必要がある。ここは少しハードルが高いが「(日本の)Wikipediaに項目があるか」ということを基準にしたい。アルファベットは26種類あるので、2文字だったら通り、3文字だったら通りの組み合わせに対して個別の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分ぐらいかかるので注意。
右にある数字の内、前者は(日本の)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]))
これを実行すると結果のようになる。回線速度にもよるが、実際に実行すると数時間かかるので注意。
結果及び考察
まず全体の結果として、全組み合わせ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の検索クエリに投げてみて、『もしかして』を提案されなければ存在」という実装が考えられるが、世の中は検索結果が全てではないし、アマチュア小説の固有名詞みたいなものをどうカウントしていいかは判断が分かれるだろう。今後の研究の発展に期待したい(発展するのか?)。
おまけ
解析の様子を抜粋したやつ
梅原大吾「勝ち続ける意志力」書評
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リーグのようなものがあれば、梅原氏も前向きに麻雀プロを目指せたかもしれないな、となんとなく思ってしまう。
神谷美恵子「生きがいについて」書評
https://www.amazon.co.jp/dp/4622081814
語学の天才でありGHQとの折衝も務めた*1知の巨人・神谷美恵子氏が生きがいについて記した本である。
さてこの本、書き出しから重い。
平穏無事なくらしにめぐまれている者にとっては思い浮かべることさえむつかしいかも知れないが、世のなかには、毎朝目がさめるとその目ざめるということがおそろしくてたまらないひとがあちこちにいる。
この本のテーマは生きがい、つまり生きる目的ということになるが、そのニュアンスはかなり重めである。つまり、普通の生活を送っている人がいかにその生活に意義を見出すかというよりは、挫折、重病、死別といった絶望に叩き落された人間が、その中でいかに再び生きるに値する希望を見出すかという、それこそ「死ぬか生きるか」というレベルの「生きがい」について論じている*2。
著者の神谷美恵子氏はその生涯をハンセン病の患者への治療に捧げた点でも著名である。当然、本書でもハンセン病やその患者に対する記述は多いが、それはこのような「死ぬか生きるか」について論じるにあたって自然な流れと言える。
ハンセン病は肉体の変異を伴う病気である。そしてその変異は醜い。いくら感染力が少ないと言っても、その化け物じみた外見への変異は、罹患者への偏見を容赦なく呼び起こす。罹患者は親友や家族からも縁を切られ、二度と普通の社会に戻れない絶望へと叩き落される。
その一方で、幸か不幸か、ハンセン病自体によって命を落とすことは少ない。つまり罹患者は、精神的には死んだも同然になりながら肉体的には生きているという一種の二律背反の状態に置かれ、これこそが大きな絶望をもたらすと言える。もしハンセン病が短時間で死に至る病であれば、どれだけ身体が醜く変異しようとも、罹患者や家族に大きな葛藤をもたらすことはなかったであろう。
しかし、「精神的には死にながら肉体的には生きている」という状況はハンセン病に特有のものであろうか。もちろんそうではなく、絶望の縁に立たされた人間は大なり小なりこの二律背反に置かれているのだ。本書はこの点について、表現を変えながら何度もそれを強調している。
らいのひとたちの持っている問題も、結局、人間がみな持っている問題を、つきつめた特殊な形であらわしているにすぎないのであるから、
しかしこれは何も病気の場合に限ったことではない。すべて生きがいをうしなったひとの意識において、心と体はばらばらになる傾向がある。
しかしこれはレプラ*3のひとに限ったことではない。たしかに彼らの状況は最も「限界状況的」なものの一つにちがいないけれども、人間の持つ本質的な問題をただ極端な形であらわしているにすぎない。
つまり、精神の死とそこからの復活は人間にとって普遍的なテーマであり、ハンセン病はその最も端的なインスタンスであると言える。愛生園*4でハンセン病の患者を(そしてその精神的復活の過程を)見続けてきた著者は、その精神の回復のはたらき、つまり「生きがい」についてその本質を述べるに相応しい立ち位置にいると言えそうだ。
ではこの本はそのような「限界状況」に陥った人のための処方箋なのだろうか? 冒頭を読む限りではそのように思えるが、しかしそうではないと思える箇所もある。
社会的にはどんなに立派にやっているひとでも、自己に対してあわせる顔のないひとは次第に自己と対面することを避けるようになる。心の日記もつけられなくなる。ひとりで静かにしていることも耐えられなくなる。
たとえ表面ではあたりさわりなくやっていても、心のなかでしゃんと顔を上げて生きるためには、何か自分なりの新しい価値体型をつくり出す必要にせまられる。
つまり、平穏な生活を送っていても、やはり何かしら生きがいがないと惨めですよ、とも取れる主張をしている。これはこれで厳しい態度ではなかろうか。安穏と暮らしいても、生きがいを求めて邁進することを暗に強制されるとは!
それを論じるにあたって、本書で描かれる生きがいの再獲得について見ていきたい。本書に出てくるそれはかなり宗教的なニュアンスがうかがえる。もちろん特定の宗教に加担するような書き方はしていないが、暗闇の中で光があらわれ、使命感に突き動かされるというような描写は、まさに宗教的体験と相似形であるように思われる。
もちろんこれは避けられないことであろう。というか、恐らく絶望の淵から喜びを見出すような過程は大なり小なり宗教的感覚と無縁ではいられないのだろう。逆に、人間には絶望から抜け出すための心のはたらきが備わっていて、その発露が宗教となって現れている、とも考えられる。例えば、著者は芸術について以下のようなホワイトヘッドの引用を添えている。
芸術は、人類が、その生存のストレスに対して示した精神病理的な反応である、といってみることもできる
この文において、「芸術」を「宗教」に変えても何ら違和感はない。
先に述べたように、本書で述べられる生きがいの再獲得というものは絶望(最もわかりやすい例はハンセン病)に立たされた人間がいかに再び希望を取り戻すか、という「死ぬか生きるか」の問題である。
しかし、生存のストレス、端的に言えば、この世に強制的に産み落とされ、そしていつかは死んでいくという理不尽な運命を提示された人間は大なり小なり絶望に囚われた弱い存在であり、その中から希望を見出すためには、使命感を伴う生きがいを再発見しなければならないのではなかろうか。それであれば、やはり本書籍は特定の苦境に立たされた人達のための本であるだけでなく、万人に向けての書であると言える。
ここでもう一度、怠惰な側の人間に立ってみよう。毎日の生活に追われるだけの人間からすれば、やはりこのような「生きがい主義」とも言える考えはどうにもストイックというか貴族的だ。パンがなければお菓子を食べればいい、ではないが、生きる意味を考える余裕もなければ正直その自信もない、という人間がほとんどではなかろうか。
この点について以下のような記述がある。
かりに平和がつづき、オートメイションが発達し、休日がふえるならば、よほどの工夫をしないかぎり、「退屈病」が人類のなかにはびこるのではないだろうか。
現実はどうだろうか。本書が発行された年(1966年)に比べてオートメイションは限りなく進んだ。しかし競争社会はますます激化し、格差は拡大し、人類はそれほど余裕が増えたようには見えない。またその余暇の潰し方も、神谷氏が理想とする精神的なそれとはかけ離れた人も多いように思える。
技術の発展にともない人類が贅沢病を謳歌できたのであれば、生きがいの追求は現代人の最も大きなテーマになったかもしれない。だが人類は、種レベルでは技術を活かして休日を増やすほど賢くもないし、個体レベルでいえば余暇も享楽的に過ごしてしまう愚かな動物に過ぎないのかも知れない。
ひとつ言えることは、どのような時代であれ、その中であなたが自分の人生と向きあうとする限り、本書で述べられている内容がその助けとなることは確かであろう。
BeatSaber のグローバルランキングの実力評価、譜面例(2023/01/28 改稿)
- このエントリはchokudai氏のエントリを全面的にオマージュしております。
- ※現在のpp相場感を反映し、記事をリライトしました(2023/01/28)
Beat SaberはVR空間上のノーツ(ブロック)を斬る音ゲーです。公式譜面やDLC譜面があって、その譜面の中で順位を競うのも面白いですが、それとは別に、ユーザーが作成したカスタム譜面による総合点を競うランキングがMOD制作陣によって運営されています。
参加しているのは約 15 万人くらいかなという感じです。
実はこのランキングも色々あって多様化しつつあるのですが、ややこしくなるのでそれはまた記事の最後に。(2023/01/28 追記)
ppとその実力
このPerformance Points(pp)という値によってランキングが順位付けられています。これはランク譜面(Ranked Map)という特定の譜面群をクリアすることによって得られる得点です。ランク譜面は、カスタム譜面の中から有志の投票によって選ばれており、一定のクオリティ(無理な配置がないか、実力に応じたスコアが出るか)を担保された譜面となっています。
ppと実力との関係については、超ざっくりまとめると、
- 0 pp~…MODを導入すれば誰でもなれるレベル。
- 2,000 pp~…ランク譜面を触り始めたレベル。公式譜面 Expert クリア。
- 4,000 pp~…一般人からみればもう上級者の領域。公式譜面 Expert+(簡単なもの)クリア。
- 6,000 pp~…一般人がついていけなくなるレベル。公式譜面 Expert+(難しいもの)クリア。
- 8,000 pp~...ランク譜面をやり込んでいるレベル。ごく一部の公式DLC Expert+。
- 10,000 pp~…この辺りからアスリートの領域。
- 12,000 pp~…超上級者。
- 14,000 pp~…世界大会に出るレベル。
- 16,000 pp~...神の領域。
- 18,000 pp~...神の領域かつ精度オバケ。
という感じになります。詳しく説明していきますが、その前にもろもろの注意事項。
- MODについて
MOD・カスタム譜面の導入は各自の責任でお願いします。もし不具合やトラブル等が起きた場合においても当方では責任を負いかねます。MODの導入手順についてはまそさんのブログが非常にわかりやすいです。
- お前は誰だ
普通の一般プレーヤーです。オマージュ元のchokudai氏がAtCoderの社長であり自身もトッププレーヤーであるのを考えると説得力のなさが際立つというか、お前偉そうに何様やねんという感じがしますが、ご容赦ください。
- インフレ
高難度のランク譜面が新しく追加されればプレイヤー全体のppも増えていきます。以下の説明はあくまで現時点の相場感であり、今後インフレ*1していきます。
0 pp以上 2,000 pp未満
MODを導入すれば誰でもなれるレベルです。色々なカスタム譜面をやっているうちに偶然それがランク譜面で……というケースもあるので、この辺りだと「知らない間になっている」レベルです。
身体面では、最初は筋肉痛に悩まされる人が多いでしょう。はじめの内は、1時間もプレイしたら次の日は腕が上がらないと思います。
このレベルの人が触る譜面の例です。
Comment: このレベルだと、見たままを斬るだけで特に気をつけることはないです。
2,000 pp以上 4,000 pp未満
中難度譜面を触りだすレベルです。ストリーム*2や対角*3といった配置が頻出するようになり、一気に音ゲー感がでてきます。たのしい。また、後述しますがこのゲームには「角度」が重要であることがわかってくるので、このゲーム独自の「手首」の使い方も習得していきます。
身体面では、だんだん筋肉痛になりづらくなってくる頃です。しかしこれは後に続く悲劇の幕開けに過ぎない……。
このレベルの人がクリアし始める譜面の例です。
Comment: 斬りやすいパターンがバランスよく配置されており、中級者から上級者まで実力に応じて楽しめる良譜面です。
Comment: 局所的に対角配置や高密度のストリームが出てきますが、全体的にはまだ密度は薄いです。
公式譜面のExpertぐらいならば、このレベルだと余裕を持ってクリアできると思います。Expert+でも簡単なものならばクリアできるでしょう。
4,000 pp以上 6,000 pp未満
この辺りから一般人からみればもう上級者の領域です。単なるクリアだけでなく「精度(Accuracy)」を意識するようになります。ノーツを追っかけるだけのプレイではなく、余裕を持って振り抜くプレイになります。譜面あたりのpp*4でいうと 200 ppを稼げるあたりがこのラインになります。中難度譜面でSSクリア、高難度譜面でSクリア辺りです。
ここでBeatSaberのスコアシステムについて説明しますと、このゲームではただ斬るだけでなく「十分な角度をつけて斬る」ことが大事になります。具体的には、
- 振りかぶり 100 度、振り抜き 60 度をつける
- ノーツの真ん中を斬る
と最高スコアを出すことができます。すべて完璧に斬れれば精度 100 %ですが現実的には不可能です。実際にはSSクリア(精度 90% 以上)がフルコンボフルスイングのラインなので、それを達成できればその譜面を完全にマスターしたと言ってもよいでしょう。同じ譜面でもAクリア(精度 65 %以上 80 %未満)とSSクリアでは、難しさももらえるppも全然違います!
身体面では怪我が増えてきます。振りの勢いが出てくるので、コントローラを壁にぶつけたり、体にぶつけて内出血させたり……くれぐれもご注意ください。
このレベルの前半の人が触る譜面の例です。
Comment: 中難度譜面。素直なリズムで密度も一定ですが、単純な上下だけではではなく、横切りや上段ノーツが来てもリズムを崩さず対応する必要があるため、一歩上の視認力と慣れが必要になります。
また、目についたランク譜面を触るという段階は卒業して(低pp譜面をクリアしても個人ppが増えないので)、ある程度高pp譜面に狙いを定めて攻略するようになります。(2020/10/11 追記。最近はランク譜面の数が膨大になってきたのでそうとも言えなくなってきました。)
プレイスキルの面では、複雑な配置、例えばクロスストリーム*5や片手配置*6が来ても冷静に対処できるようになります。
身体面では、腕だけの力任せの振りを卒業して、手首や肩を効率的に使ってノーツを斬れるようになりますが、肘や手首への負担が響いてくる頃です。無理するとマジで危ないので、皆様マジで気をつけてください……。
このレベルの後半の人がクリアし始める譜面の例です。
www.youtube.com Comment: このあたりから、スライダー*7の配置も出てきます。スライダーの見かけの物量に惑わされずに安定した剣捌きを維持する力が必要です。
公式譜面でもExpert+はけっこう難しいのですが、簡単なものはこのレベルでクリアできる程度でしょうか。
6,000 pp以上 8,000pp 未満
この辺りから一般人がついていけない領域です。実際にプレイしている様子を一般人が見たら「上手いね〜」というよりは「えっ、なんかめっちゃ腕を高速移動させてる……近寄らんとこ……」ってなるレベルです。
ランクを上げようとする場合は、もう簡単な譜面に手を出しても意味がありません。譜面あたりだと 300 ppが目安になりますが、例外的に美味しい譜面で到達するぐらいです。個人スコアの計算方式の都合上、譜面あたり 200 ppぐらいは稼がないと意味がないので、難しい譜面に挑戦することから逃げられなくなるといった感じです。苦しい戦いを余儀なくされる人が多いと思います。
このレベルのランカー同士だと、ppを稼ぐために色々な高難度譜面を漁っているのは大前提です。どんな譜面かはお互い知っているので、「今日、"アバ"、 1 %伸ばしたワ……」「"テオ"のあそこはヤバい……」といった効率的な会話が可能になります。(2020/10/11追記。ランク譜面の数が膨大になってきたので、それほど「限られた譜面でお互い争っている」という状況でもなくなってきました。みんな自分に合った好きな譜面をやろう!)
このレベルの前半の人がクリアし始める譜面の例です。
このレベルの後半の人がクリアし始める譜面の例です。
公式譜面の Expert+ のうち、難しいものっていうか配置が変なものだとこのレベルでクリアできる程度でしょうか。
8,000pp以上10,000pp未満
この辺りから、譜面あたりのppでいうと 300 オーバーがコンスタントに必要になります。まぐれだけでは到達できないラインであり、ある程度相性に左右されずに安定したパフォーマンスを発揮する実力が必要になります。このレベルだと中難度以下の譜面はフルコンボが当たり前で、 90 %より上の精度をどれだけ稼ぐかという極限の争いになってきます。ここまで来れば、ランク譜面をやり込んでいて、大体の譜面に対応できることがある程度保証されていると言えると思います。(2022/02/11追記)スコアシステムの変更により、90 %台後半を出さないと稼げない仕様になりましたので、低難度で 95 %より上を出せるか、中難度でも 93% より上を出せるか、といった「詰め」の領域になってきます。
そのため、どの譜面をクリアできるかよりも、どの譜面で高精度を出せるかといった点が重要になってきます。人によりますが、93 %以上のスコアは角度と中心精度を同時に満たす必要があり、どれだけ反射神経や動体視力があっても訓練なしで到達するのはまず無理なラインです。身体(というか手首)への負担も過大なものになっていき、その一方で、大半の譜面は1ミスしたら更新の見込みなし、という勝負になるので、ストレスも増大していきます。フィジカルケアとメンタルケアは必須です。
このレベルの前半の人がクリアし始める譜面の例です。
このレベルの後半の人がクリアし始める譜面の例です。
公式譜面だとこのレベルのはほぼ存在しないですが、GhostのExpert+とかはここにあたるかなと思います。
10,000 pp以上 12,000 pp未満
このあたりからアスリートの世界に入ってきます。先程述べた極限の争いを高難度譜面で行っている感じです。
日本では上位 57 名からがこのクラスになります。譜面あたりのppで言うと 375 あたりが目安になりますが、それらを稼げるような譜面は基本的に物量やテック*8がものすごいことになっています。ある程度の基礎体力・筋力は必須ですが、それ以上に鍛え上げられた視認力と集中力が重要になってきます*9。そういった意味でも完全にスポーツの世界です。
プレイスキルについては、もはや私が語り得るレベルを超えてきているので、ここから先は説明を省略します。
このレベルの人がクリアし始める譜面の例です。
12,000 pp以上 14,000 pp未満
このあたりから意味のわからないレベルになります。先程述べた極限の争いを超高難度譜面で(以下略。日本では上位 13 名からがこのクラスになります。
プレイヤー当人には得意不得意があったり、まだ上が......という思いもあるとは思いますが、さすがにここまで来ると超上級者と言っていいのではないでしょうか。
このレベルの人がクリアし始める譜面の例です。
14,000 pp以上
世界トップクラスです。世界大会とかで優勝争いするのはこのレベルの人達です。前の人達と比べて何がすごいのかと言われると明確に説明するのが難しいのですが、こういう人達のプレイ動画を見ると、あまりにもスムーズすぎるので「逆に譜面が簡単に見える」という不思議な現象が発生します。達人の域です。日本人だと上位 2 名。
このレベルの人が「クリアし始める」というランク譜面はもはや存在しませんが、世界の頂点に近い一握りのプレイヤーでないとクリアすらできないようなチャレンジマップの動画を貼ってきます(非ランク譜面)。
16,000 pp以上
世界トップクラス中のトップクラスです。グローバルランキング上位 23 名ぐらいです。日本人だと上位 1 名。
18,000 pp以上
世界トップクラス中の(以下略
グローバルランキングの上位 2 名です。残念ながら日本人はいません。
さて、このレベルで何が違うのかというと、「精度」(より正確に言うと中心精度)になります。
ゲームのシステム上、フルコンボを取ると大体 90 %以上の精度は出ますが、相場感をざっくりまとめると、
- 90%~ ああ、なんとかフルコンを繋いだんだね……もっとセイバーを振る余裕を持てるといいかな
- 91%~ うーん、もうちょっと欲しい
- 92%~ まあ、フルコンしたって感じ
- 93%~ ここら辺なら安定フルコン
- 94%~ フルコンかつ角度も十分。現在のスコアシステムでやっと美味しくなるライン。
- 95%~ やるやん。コンボ・角度はもちろん中心精度も狙えている
- 96%~ 中心精度が上がってますねえ
- 97%~ 中心精度がエグいですねえ
- 98%~ ミリ単位の制御か?
- 99%~ ミクロ単位の制御か???
- 100% ノーツが極めて少ない譜面でない限り、現実的に不可能
という感じで、後半になると 0.1 % 上げるだけでも大変だし、その勾配がどんどんきつくなっていく感じです。以前のスコアシステムでは、良くも悪くもこの違いをあまり考慮していませんでした。
しかし現在は、この「極限の領域」に応じて高い pp がもらえるシステムに変更されました。この結果、90 %後半を稼ぐいわゆる精度勢の pp が爆上がりしました。
以前だと、グローバルトッププレイヤーは超物量譜面を難なくこなす超人という感じでしたが、現在のグローバルトッププレイヤーは完全に精度ですべてをなぎ倒しています。
現在、グローバル 1 位の Bizzy さん。
注目するべきは、★7.66 の譜面で 98.55 %(!)を取っている点で、超高難度の譜面をクリアできなくても高い pp を得られています。
このスコアシステムは、裏を返せば物量譜面やテック譜面に対する実力が評価されないということで、賛否両論あります。変態譜面をクリアするのも実力だと思いますが、現在スコア争いの要点になっているのはそこではない、ということです。
参考までに、Bizzy さんの動画。
今まで上げた譜面に比べると密度も少ないですが、遥かに高い pp を得られています。ほとんどのノーツで 113 以上のスコアを取っており、信じられない精度なのですが、はっきり言って初心者にはそのすごさがわからないと思います。
ScoreSaber 以外のランキングシステム
話がややこしくなるので今まで言及していませんでしたが、現在 ScoreSaber 以外にもランキングシステムがあります。
BeatLeader です。
現在は ScoreSaber と BeatLeader の二大政党制と言っていいと思います。
こちらにもランク譜面があって、とはいってもほとんど ScoreSaber のそれとほとんど被っているのですが、ScoreSaber 程精度カーブがきつくないので、「たくさん譜面をやれば pp が増える」「難しい譜面をクリアすれば pp が増える」という世界観に近い仕様となっています。あとノーツが消えるモードとかスピードアップモードのボーナスがスコアに加算されるので、そこは大きな違いです(ScoreSaber はノーマルモードしか許容されません)。
この記事を書いた時から少し前までは、ScoreSaber が半強制 mod だったのもあって「ランキングシステム≒ScoreSaber」であり、「BeatSaber のカスタムソングをやっている人≒ScoreSaber でスコアを送信ししてる人」といって差し支えない状況でした。
現在は BeatLeader が台頭しており、そうとも言えなくなってきています。なお、どちらかしか選べない、といったものではないので、両方入れている人がほとんどです。実際、ランキングの上位層もほとんど被っています。中には、BeatLeader だけ入れているという人もいますが。
とは言っても、ScoreSaber が最大手である状況は変わりなく、グローバルランキングといったら ScoreSaber のそれを指すという認識で問題ないと思います。一応、ランキングや pp と言っても大きく 2 種類あるよ、という点だけ。
まとめ
みんなも怪我にだけは気をつけながらたのしく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:すごい角度をしているけどよく見て腕や肩をひねれば斬れる配置をテックといいます
*9:上位ランカーの姿を配信などで見かけることはありますが、筋骨隆々な人は少なく、むしろ痩せ型の人が多いです
PythonとHerokuを使ってTwitterBotを作りました(ソースコード以外編)
突然ですが先日、以下のようなBotを作成しました。
Beat Saberという音ゲーについての情報提供を目的にしたもので、タイムラインの情報から以下の内容を自動的につぶやきます。
Botを作るにあたって手順や参考にしたページ、躓いた点などをまとめておきたいと思います。同じ内容を扱った記事は複数ありますが、(作成中の私と同じように)初めて作業する人だと既存の記事で想定していないようなポイントに躓いたりするものなので、何らかの形でそういった方々の助けになればと思います。
一応備忘録がわりに説明文を加えていますが、もしプログラムを触ったことがない*1人が何もインストールされていない状態から始めるとしたら最低限の手順書になるように書きました。OSはWindows 10 64bitを前提としていますが、もし手順を参考にされる方がいればOS等は適宜読み替えてください。
目次
- 目次
- Botアカウントの作成
- APIキーの取得(Twitter開発者登録)
- Pythonのインストール
- Pythonモジュールのインストール
- Pythonプログラムの作成
- ローカル環境での自動化
- Herokuのアカウント作成
- Gitのインストール
- Herokuへのデプロイ
- Herokuスケジューラの設定
Botアカウントの作成
何はともあれアカウント登録。
APIキーの取得(Twitter開発者登録)
やること:ここで登録&作文
ここから開発者っぽい領域に入っていきます。Twitterのアカウントとは別に、Twitterのdeveloper(開発者)としての登録をします。開発者になるとAPIキーというものをもらえます。
APIキーについての詳しい説明は省きますが(というか私も詳細をわかっていない)、普段はTwitterのアプリやWebブラウザを通してしか見られないツイート内容やフォロワー数といったデータを、直接もらったり操作したりするためのパスワードのようなものです。これによってBotに色々させることができます。もちろん、誰にでもそんなパスワードを渡したら悪用されて危険なので、信頼できる作文を書ける開発者にのみ渡されます。
そう、APIキーをもらうためには
参考記事
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2018年9月時点の情報 - Qiita
なお注意点として、APIキーで操作できるアカウントはログインしているアカウントのみです。つまりBotを操作するためには、Botのアカウントを作成して、そのアカウントでDevelopersサイトにログインしてDeveloperの申請を行わなければなりません。
私は最初これに気づかず(気づけよ)作文を2回やるハメになりました。なお、2回とも認証は一瞬(本当に数秒レベル)で降りました。審査に一週間かかるという噂はなんだったのか。
Pythonのインストール
やること:ここでインストール
無事にAPIキーが取得できたら、いよいよそれを用いて実際にTwitterを内部的にアレコレするプログラムを作っていきます。その気になればどの言語でもできるんでしょうけど、Pythonが色々ライブラリも揃っていて情報も豊富なのでそれを使っていきます。上のURLには最新のPythonが公開されているはずなので、クリックした先にある「Windows x86-64 web-based installer」でインストーラがダウンロードできます。
なお注意事項として、Pythonをインストールする時の注意点として、環境変数にチェックボックスを入れましょう。これがないとコマンドプロンプトでpython
やpip
といったコマンドが使えません。特にpip
が使えないのは致命的です。
参考記事
Pythonモジュールのインストール
やること:コマンドプロンプトで以下のコマンド
pip install requests_oauthlib
Pythonは色々なことができるプログラム言語ですが(わかったようなことを言う)、Python自体にそのすべての機能が備わっている訳ではありません。色々な機能を持ったモジュール(部品)として公開されており、プログラムごとに必要な機能を応じてインポートする必要があります。また、標準ライブラリに含まれていない機能は必要に応じてダウンロードしインストールする必要があります。
例えば今回のBotでは、APIをTwitterに投げてデータを受け取る……という操作を行いますが、このような機能はPythonに備え付けられていませんし、まさかフルスクラッチでかける訳がありません。なので、外部プログラム(モジュール)を利用してそれを簡単にできるようにします。
で、このモジュール、結構いっぱいあります。今回のBotだけでも以下のモジュールが必要になりました。
json
--- JSON エンコーダおよびデコーダ。APIを通したやりとりは基本的にjsonというフォーマットのデータになるため、これが必要です。sys
--- システムパラメータと関数。絵文字のエンコードに使います。codecs
--- codec レジストリと基底クラス。絵文字のエンコードに使います。datetime
--- 基本的な日付型および時間型。完成したプログラムには使いませんが、デバッグの時に使いました。requests_oauthlib
--- OAuth認証のためのライブラリ。これがないとTwitterとのデータのやりとりができません。これだけは別途インストールが必要。
Pythonプログラムの作成
やること:ソースコードをかく
ソースコードについては近日中にQiitaに公開し解説も加えるつもりです。目下、機能改良&コード整理中なので……。
いよいよプログラムを書いていきます。プログラムを書くことはそれこそメモ帳でもできますが、エディタを使った方がインデント(プログラムの入れ子関係を示すための文頭開始位置)を自動で揃えてくれたり、シンタックスハイライト(要素ごとに色を変えてプログラムを読みやすくする)をしてくれたりするので、その方が書きやすいでしょう。私はPythonとセットになっている純正のエディタで特に不満がなかったのでそれで書いていました。
ローカル環境での自動化
やること:Windowsタスクスケジューラーでタスクの設定
無事に、BotにツイートをさせるPythonプログラムがかけました。原理上は人間がこれを注意深く時計を見ながら10分に1回ダブルクリックをすれば定期ツイートをしてくれるBot(Botじゃねえ)が実現しますが、とてもそんなことはやっていられないのでプログラムにやらせましょう。
幸い、Windowsにはタスクスケジューラーという備え付けのプログラムがあり、これは定期的に指定したプログラムを実行してくれるというまさにうってつけのものです。
参考記事
これで自動化完了! 10分に1回、PC上でPythonファイルが走るようになります……が、毎回Pythonが立ち上がるのは正直目障りです。そして何よりPCを起動し続けていなければなりません。真の自動化のためには、自分のPCとは無縁なところでTwitterにAPIを送り続けるような仕組みが必要になりそうです。
そのための仮想環境を提供するサービスが、次に説明するHerokuになります。
Herokuのアカウント作成
やること:ここでアカウント登録した後、ここでCLIをインストール
Twitterとかと違ってややとっつきづらいサイトですが、まあ登録していきましょう。このサービスの中にさっきのパイソンファイルを置いて実行してもらう、ということになるのですが、ドラッグ&ドロップとかをするわけではなく操作は基本的にコマンドで行います。開発者はコマンドを使うものなのです。慣れない人は頑張りましょう。
また、先程のpipと同じく、Windowsのコマンドプロンプトにherokuを扱うための命令一式をインストールする必要があります。それがCLIです。インストールしていきます。
Gitのインストール
やること:ここでインストール
更にややこしいのですが、Herokuのファイルを管理するためにはGitというシステムを使う必要があるので、それも別途コマンドラインにインストールする必要があります。さっきからインストールするものばかりですね。
参考記事:
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_folder
、application_name
は自分のアプリの名前に変えてください。
これでようやくHeroku上にPythonファイル(やその他設定ファイル)を送るための準備が整いました。ローカルで作業用のフォルダを用意して、いろいろファイルを用意して(このあたりの詳細は参考記事を見てください)Herokuにpush(ローカルの作業内容をインターネット上の大本に反映させること)します。Heroku上でプログラムが動く状態にすることをデプロイと言いますが、これでデプロイ完了です。
なお注意点として、Pythonをデプロイする際には、Python用のビルドパックというものを設定する必要があります。ブラウザから設定することもできますが、コマンドでも設定できるので、上のコマンドではそれも一括してやっています。
私はこのデプロイを通すときに何回やってもエラーが出てデプロイできなかったので困り果てていましたが、知人に相談したところ 「requirements.txt」の名前を「requirement.txt」にしていたということが発覚しました。お恥ずかしい……。これも誰かの参考になるかもしれないので言いますが。
参考記事
Herokuスケジューラの設定
やること:HerokuスケジューラでPythonファイルを定期的に実行するようにする
長かった戦いにも終わりが訪れようとしています。後はHeroku上のスケジューラで、デプロイしたプログラムを定期的に走らせるようにすれば自動Botの完成です。Herokuにはスケジューラというアドオンがあるので、それを設定します。Herokuのブラウザでも設定できますが、以下のコマンドでも開くことができます。
なお、Herokuスケジューラは無料のアドオンですが一応クレジットカードを登録する必要があります。
これで定期的に自動ツイートするBotが完成しました!
VRChatのアバター改変でテクスチャにロゴ等を貼る方法
VRChatをプレイしているとアバターの服にロゴ(または肌にタトゥー)等のワンポイントつけたいとかそういうことがあると思います。基本的にはテクスチャにロゴを貼り付けるだけなのですが、一手間必要な場合が多いのでその手順を解説していこうと思います。
基本…UVマップとその問題点
以降、ミーシェちゃんのモデル(かわいい)(BOOTHで販売中だよ!)を基準に解説していきたいと思います。
3Dモデルはメッシュ(ポリゴン)の表面を1枚の平面の「地図」にして、そこに絵を描き込んでいく、という方法でテクスチャ(表面の質感)を表現しています。この地図をUVマップと言います。3次元(X軸、Y軸、Z軸)からなる物体の表面を新たに2次元(U軸、V軸)に転写することからUVマップと呼ばれます。
しかし、サイコロのような物体でない限り、立体は必ず曲面を持っています。それを平面の地図に「まっすぐ」転写するのは不可能であり、必ずどこかに歪みが現れます。これはUVマップの仕組み上避けられないことです。
これは実際のミーシェちゃんの服のテクスチャです。赤い線がUVマップになります。普段は表示されていませんが、psd(フォトショップデータ)にはレイヤーとして保持されているので、今回はあえて表示しています。この赤い線が実際のポリゴンの1枚1枚*1と対応しています。
私は以前psdデータがあると色変えがしやすいという記事を書いたことがありますが、本記事のような場合にもpsdデータがあると役立つので、販売モデルはなるべくpsdデータ付のものがいいと思います。やや余談ですが。
ちなみに、あえてUVマップの線を3Dモデルに写してみた図。時々非表示にするのを忘れて素でやってしまうことがある。
3Dモデル上では自然な線ですが、UVマップ上ではナナメになっていました。
このテクスチャにそのままロゴをはりつけてしまうとどうなるか。
傾いています。というか左右反転しています。UVマップが左に傾いていれば逆に右に傾き、縮んでいれば逆に拡大して表示されてしまいます(数学的に表現すれば、UVマップの逆変換を受けてしまいます)。更に今回は、UVマップを「裏から見たような」形で展開しているので、それの影響も受けています。このようなことはままあります。というか、そういう方が多いと考えてよいでしょう。
そこでどうするか。
方法1…ロゴを変形させる
力技かつわかりやすい方法です。UVマップが歪んでいるなら、ロゴもそれに合わせて歪ませればいいじゃない。幸いgimp(無料ツール)は自由変形があるのでそれほど苦ではないです。Shift + T
で出来ます(鏡像反転はShift + F
)。ビーくん*2をこう……
変形!
解決!
ただこれには限界があって、関わるポリゴンが少ないかつ曲率が小さければ大丈夫なのですが、どちらかが複雑になってくるとUVマップの歪みが大きくなってきます。直線的な自由変形では対処しきれなくなる……というのもありますが、例えばある箇所と別の箇所で対応するポリゴンのサイズが数倍、という状態になると、結果として表示される解像度にもその差が現れてきます。見栄えが少し悪くなるかもしれません(ロゴの一端がぼやけるなど)。
場合によっては、UVマップ自体を直す、ということができるので、次の項目で説明します。
方法2…UVマップを修正する。
こちらの方がアプローチとしては根本的ですね。社会が間違っているなら、社会に合わせて自分を殺すのではなくむしろ社会を変えていく、そんな男気を感じます。ただ、後述するデメリットのため、いつでも使える訳でもないので注意が必要です。
この方法では、みんな大好きBlenderを使う必要が出てきますが、がんばりましょう。
さて、Blenderにミーシェちゃんのfbxを読み込ませていきます。
初期状態ではよくわからないタイムラインみたいのが表示されていると思うので、ここにUVマップを表示するようにします。
ミーシェちゃんは既にUVマップが展開済なので、服のオブジェクトを選択して編集モードにすればすぐにUVマップが出てくるはずです。
この内4枚を正方形にしたいと思います。
服のUVマップの内、真っ直ぐにしたい辺を選択して、縦にしたいならば「X軸揃え」、横にしたいならば「Y軸揃え」をします(ショートカットキーはW
)。お前さっきU軸とV軸ゆーたやん。なんでX軸とY軸になってるの? 私がBlenderに聞きたいよ……。
後は細かい調整をすれば(画像を貼り付けるという意味では)綺麗なUVマップが完成します。辺を動かす時に周りも動いてしまうようであれば「プロポーショナル編集モード」になってますので注意。
もちろんこの方法にはデメリットもあって、もともと完成されていたテクスチャ(今回の例であれば服のシワなど)の方が歪んで表示されてしまいます。影響する範囲が小さければほとんど気にならないですが、大きければ無視できない範囲になるかもです。服のつなぎ目等のテクスチャを巻き込んでしまったらその時点でアウトでしょうね。UVマップ、ムツカシイネー。
皆様もUVマップの性質を理解しながら良き3Dライフを。
(主にBeat Saberを想定した)バーチャルモーションキャプチャーを調整するための方法
バーチャルモーションキャプチャー(以下:VMC)を用いると、上に貼った動画のように、あたかもアバターがBeat Saber(以下:ビートセイバー)をプレイしているかのような動画が撮れます。詳しくは以下の手順を参照。
しかし何も調整を加えないと、
- 目を見開きっぱなし
- 手の平ひらきっぱなし
- 手が捻じれる
という問題が発生するのでそれぞれ対策を解説していきたいと思います。
目を見開きっぱなし
fbxから変換したままのVRMでは、VMCで表示されるアバターはまばたきをしません。目を見開きっぱなしです。別に気にならないと言えば気にならないレベルですが、まばたきがあると一気に「生きてる感」が出るので設定していきましょう。
正確には、VMCにはデフォルトでまばたきの設定が入っているのですが、素のVRMデータにはそれに対応する「BLINK」というブレンドシェイプが設定されていないので、まばたきの命令は出していてもその動かし方がわからないという状態です。
では、「BLINK」の設定をしていきましょう。VRMを出力したということはUnityに以下のようなアセットが設定されているはずです。(既存のVRMをいじる場合でも、UniVRMを読み込んだUnityにVRMファイルを読み込んだ時点で生成されます)
その中の「VRM名.BlendShapes」フォルダにある「BlendShapes」を選択すると、インスペクタに色々な表情に対応するブレンドシェイプの一覧が表示されます。
その中の「BLINK」を選択します。
売り物のアバターだったら普通、対応するシェイプキーを作っているので、その値を「100」にします。
シェイプキーは対応するメッシュに格納されています。三角を押して展開しないとシェイプキーの一覧が表示されないので注意。大体のモデルは「face」とか「body」とかそんな名前になっているはず。
これで設定完了。もちろん、シェイプキー(頂点の変形)が作られていることが前提で、何もシェイプキーを設定していないモデルが魔法のようにいきなり瞬き出したりはしないですからそこは注意です。
…という流れですね。この流れは瞬きに限らずあらゆる表情付けに共通なので覚えておくとよいかもしれません。また1つのブレンドシェイプに複数のシェイプキーを組み合わせることもできます(なので「ブレンド」シェイプな訳ですね)。
手の平ひらきっぱなし
VMCで読み込んだモデルは、手を開いた状態で持ち込まれます。コントローラーのタッチパッドを触ると色々手の形が変わりますが(VRChatと同じ制御です)
まあ普通にビートセイバーをやっていればここはまず触らないので、多くの場合は手の平を開きっぱなしにしながらセイバーを振り回す訳です。
これはこれで超能力者みたいな趣がありますが、やはりセイバーを握りしめていた方が自然でしょう。
なのでVMC側で握りっぱなしにするようにします。
ここの「ショートカットキー」をクリック
色々と手の形を動かす命令があります。もったいないですが、すべて削除しましょう。
そして新たに命令を作りましょう。上の図の「カスタム」が新しく作った命令になります。「ハンドジェスチェー追加」を押して、以下のようなセッティング。初期設定からいじった部分をすべて赤丸つけています。
発動するキーは何でもいいのですが、私はキーボードの「S」にしてます。一度Sを押したら最後、この手は二度と開かれませんがまあビートセイバーをする上でならそれぐらいがちょうどいいです。この設定を一回してしまえば、「ショートカットキー」の右下にある「カスタム名称(保存でプリセットへ追加)」という所でこのセットをまるごと保存・呼び出しできるので、以降はワンクリックで出来るようになります。
手が捻じれる
これは一部の人向けの問題になります。アバターの手の向きについては、VMC側である程度補正が入るっぽく、コントローラーを自然に持っている限りはいいのですが、それ以外の角度で持つ場合、手首が不自然に捻じれてしまいます(あらかじめコントローラを通常じゃない角度で持ってキャリブレーションしてもこの現象は発生します)。
これは私が逆手で構えた時のポーズ。
現実はこんな感じになっています。VMCの機能や(もしくはポリゴン自体をいじることにより)「手の角度」自体は補正できますが、問題はこれ。IK(インバースキネマティクス、手の角度から肘の動きを計算すること)が狂ってしまうため、ポーズが狂ってしまうのです。
え? 逆手でプレイするのなんてお前だけだろって?
確かに逆手でプレイするのは世界で私含めごく一部(最近は片手逆手の人が増えてきました)ですが、実はランカー勢は通常プレイにおいても、コントローラーを特殊な方法で持っているのです。
それがこれだ!
(元画像はBeat Saber界隈のDiscordに出回っているものです。作者を存じ上げない、というか特定不可能なため無断転載させていただきますが、問題があることが発覚した時点ですぐに対応させていただきます)
名付けてB-Grip!
実は、VIVEコントローラーを普通に持つと先端が大きすぎてアンバランスであるため、とても振り回しづらいです。これは難曲を攻略する上では死活問題です*1。そのためランカー勢(のうちVIVE勢)はほぼこのグリップでプレイしています。しかしこれだとVMCでは手首が裏返ってしまいます。これは全世界共通の問題なのです!
ではどう直すかについて。
トラッカーを追加して手の甲にはめましょう。
今のところこの問題はマネーでしか解決できないのだ。いや、なんかIKをいじれるすごい技術があれば解決できるかもしれんけど……。
ちなみにトラッカーを手の甲にわりあてる場合はVMCのここで割当設定を決める必要があります。自動割当だとコントローラを手だと認識してしまうので……。まあ、これは動画の見栄えにどうしてもこだわるなら、というレベルですね。
皆様もよき動画撮影ライフを。
*1:ちなみにこれは冗談ではなく、世界のトップランカーの大半はOculusです