hibitの技術系メモ

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

3Dプリンタで幾何学的物体とこうめちゃんを生み出した

 生み出されたもの。

f:id:hibit_at:20200919165202j:plain

 幾何学物体。

f:id:hibit_at:20200919165159j:plain

 こうめちゃん*1

 縁あって、3Dプリンタで遊ぶ機械が与えられたので、感想とか注意点とか。想定読者としては、3Dプリンタに興味があるけど使ったことないぐらいのレベルです。フィラメント式と光造形式の2つを触ったので、その比較など。

幾何学的物体

 立方体を、対角線を軸に回転させたもの。1辺の長さを1とした場合、この体積が\frac{1}{\sqrt{3}}\piであることは東工大の入試等でも出題される等で有名です。こちらはFDM式、いわゆるフィラメント式で出力しました。プラスチックのフィラメントを熱で溶かして積層していくやつです。他の方式に比べて目が荒くなり、積層面が傾くとギザギザしてしまいますが、安価なので家庭用といえばこの方式なイメージです。今回はPrusaというプリンタを使いました。

 データはBlenderでサクッと作成。

f:id:hibit_at:20200919170233p:plain

 キューブをScrewモディファイアで回転させるだけという力押しな方法ですが、これをstl出力するだけでなんとかいけました。

 3Dプリンタ全般の注意点として、下から徐々に積層していく関係上、下に支えがないような部分には、臨時的にサポート材という部品を同時に出力していく必要があります。ピラミッドみたいな形なら何の支えもなく出力可能ですが、ワイングラスみたいな形だと、グラスの部分を出力する際にはその下に支えが必要になります。これは臨時的なものなので後で取り除く必要がありますが、フィラメント式の場合、これが力と神経の要る作業になります。

f:id:hibit_at:20200919170625p:plain

 この図形を出力した時は、上の図でいう黄色い部分にサポート材が必要になりました。このサポート材も同じフィラメントから出力されていて、後でベリベリ剥がす必要があるのですが、本来出力したい部分も一緒に剥がしてしまいそうで怖いです。このような単純な図形だったら指でなんとかなりましたが、もう少し複雑な部品になると、ピンセット等で頑張る必要がありそうです。

 出力時間はこのサイズで一晩ぐらい。

こうめちゃん

f:id:hibit_at:20200919171712p:plain

 みんな大好きこうめちゃんです。

 こちらは精度的にフィラメント式だと不可能っぽいので、より細かい精度を実現できる光造形式を試してみました。こちらはUVレジンという、紫外線を当てると固まる樹脂を利用して整形します。

 こちらも下から順に積層していくもので、サポート材が必要というのはフィラメント式と同じなのですが、こちらはサポート材が蝋のような物質で出来ています。そのため、縦横無尽にサポートできる上に熱で溶かせるので、極めて失敗しづらいです。反面、プリンタ本体はもちろん材料費もフィラメント式に比べてかなり高いので、ご家庭の使用にはハードルが高いです。今回は、Projetというプリンタを使いました。

 3Dデータはけっこう調整する必要があります。

 まず、元データ(アバター向けデータ)だと、3Dプリンタで出力するには低解像度過ぎるので高解像度化します。と言っても、これはSubdivisonモディファイアをかけるだけで解決します。

 もうひとつ面倒な工程があります。基本的に3Dプリンタ用のデータは閉曲面のメッシュを想定しており、穴が空いていたり、板ポリゴンを使ったりといったメッシュを想定しておりません*2。しかし、アバター用に販売されている3Dデータは髪や小物といった部分に板ポリを多用していることが多いため、その部分に適宜修正を加える必要があります。Solidifyモディファイアでそのような処理ができますが、個別に部位を選択して厚みを調節する必要があるので、少し面倒です。

f:id:hibit_at:20200921050130p:plain

 調整後の様子。

 出力は3日間ぐらいかかりました。

 また、光造形プリンタの場合、出力直後はサポート材の蝋がデロデロになっているのですが、それを更に溶かしたりまた洗浄液に浸けたりといった専門的な後処理が必要になります。ご家庭でやるには、価格の他にも、このような部分もけっこうハードルになる気がします。廃棄された枕状の大量の蝋は脂肪みたいでちょっとグロテスク……。全体の工程を通してかなりケミカルな要素が多いので、換気とかに気をつけないと、健康にも悪影響が出そうな気がします。

 アバター用の3Dモデルを(いくら調整したとはいえ)ほぼそのまま出力するということでどうなるか不安だったのですが、結果的にはかなり正確にしかも頑丈に出力されました。服や尻尾に小物としてついていたリボンは、洗浄したりしている内に取れてしまいましたが、これはさすがに出力する前にもう少し安定した造形にするべきだった案件であり、むしろ最初だけでも造形を正確に出力できたことに驚くべきでしょう。

 という訳で、3Dプリンタをやってみたという記事でした。

*1:https://booth.pm/ja/items/1791571

*2:これはフィラメント/光造形に関わらず、3Dプリンタ全般に言えることです。

KLabExpertCampに参加しました

 9/8~9/12、KLabExpertCampというイベントに参加しました。形式としてはインターンですが、業務を手伝った訳ではなく、参加者同士で集まってワイワイShaderを書いて映像作品を作ろうというものです。時節柄、オフラインではなくオンライン開催になりました。イベントの様子は#KlabExpertCampで。

作品

www.youtube.com

 Shaderなんぞやという方のために一応解説しておくと、この映像はすべてGLSLというプログラム言語で書かれたもので、3Dソフトによるポリゴン作成やレンダリング等は一切かませておりません。フラクタル処理を多用することにより、このような映像を生み出しています。

 コードを見たいという方のためにShaderToy(前半)(後半)にリンクを貼っておきますが、そこそこのグラボを積んでいるPCでないと計算負荷でPCが固まるおそれがあるので注意です。

 音楽はLogicで自作して後付しております。つよい人だとGLSLで音声すら作成する人もいるらしいです。(つよい)。

技術的な感想

  • 初歩的なレイマーチングはやったことはあるけど、カメラを動かしてスクリプトを作ってというのは初めてだった。
  • アポロニアンマンデルバルブを初めて使った。コードは流用させていただいたけど、思いつくのも実装するのもすごい。
  • レンダリングの処理をしてより見栄えを上げたかったけど、4日間の作業時間では無理だった。
  • VSCodeでGLSLをプレビューする環境を作り上げ、タイムラインの細かい調整はShaderToy Unofficial Pluginで済ませるというワークフローを確立した。作業効率50倍ぐらいになったと思う。
  • やっぱりフラクタルは楽しい。

イベント的な感想

 Shader勢が集まってShaderを書く会ということで、以前からVRChatで話したことある方、話したことはなくてもなんとなく名前は知っている方が多かったです。全員初対面というよりは話しやすい状態だったので個人的には助かりました。4日間で何回か講義を受けて、後はひたすらオンライン会議を繋ぎながら作業。入退場はある程度自由だし、ミュートもカメラオフも自由なので、他の作業と並行しやすかったのも助かりポイント。オフラインで集まって合宿みたいなのも、それはそれで楽しそうだったけど、今のご時世ではそもそも無理だったので、難しい……。

お世話になった諸々

  • かねたさんのコード。この🤔はかねたさんから許可を頂いて流用させていただきました。また、かねたさんにはメンターとしてレイマーチングやマテリアル設定のサンプルコード等もいただきまして、全面的にかなりお世話になりました。ありがとうございます!
  • アポロニアンのコードの本質的な部分はiq神のShaderToyから流用させていただきました。10行ぐらいの距離関数でこれが実装されるとか、信じられねえ……。
  • マンデルバルブのコードはこの記事から流用させていただきました。
  • GLSLの動画化には、避雷さんのShader Recを使わせていただきました。1分超の動画を投げても返ってくる。すごい。
  • 楽曲制作にあたっては、よじしょー君に色々とLogic操作の指導や助言をいただきました。助かった。

最後に

 このような有意義なイベントを企画したいただいたKLabの運営陣の皆様、誠にありがとうございました。他の参加者の作品も#KlabExpertCampから見られるので、興味があればぜひ。

 (☝ ՞ਊ ՞)☝KLab最高~~(☝ ՞ਊ ՞)☝

 

呼吸をするようにマナ悪ロンをするリスキーエッジの登場人物達(改)

 昔書いた文のリメイクです。

リスキーエッジ

 リスキーエッジ、という名作がある。

f:id:hibit_at:20200602104410p:plain

 押川雲太郎作の麻雀漫画である。

 高レート麻雀の場で生き続ける孤高の男・吉岡を主人公にしたアウトロー的な麻雀漫画であり、主人公の生い立ちや成長や葛藤や信念が闘牌を通して巧みに描かれているおかげで、ついつい感情移入してしまう名作である。

 ただこの漫画、基本的にマナーが悪い。特にロンする時。

 言うまでもないことだがロンをする時は、「ロン」→「◯◯点(です)」とだけ声するのがマナーであり、余計なことは言わない*1

あんたらしくないぜ

f:id:hibit_at:20200602104832p:plain

 煽りレベル:★☆☆

 相手を立てている意図もあるがマナ悪には違いない。危険牌を切る方だってそれをわかった上で覚悟して打っているのだ。あとロンと発声しましょう。無言倒牌は明確なマナー違反である。

信じていたよ

f:id:hibit_at:20200602105056p:plain

 煽りレベル:★★★

 論外。相手をバカにするのも程があるレベルである。ぶん殴られても文句言えない。あとロンと(ry

それが当たりだから

f:id:hibit_at:20200602105333p:plain

 煽りレベル:★★☆

 予想が的中してドヤ顔したいのはわかるけど黙っとけや。

バカがいて助かったよ

f:id:hibit_at:20200602105435p:plain

 煽りレベル:★★★

 ぶん殴られても文句言えないレベル。

出るとは思わなかった

f:id:hibit_at:20200602105509p:plain

 煽りレベル:★★☆

「出るとは思わなかった」「一発」

 フリー雀荘に行くとマナーとして注意される言葉の代表格である。余計なこと言わんでいい。

テンパイがわからなかったのか

f:id:hibit_at:20200602105555p:plain

 煽りレベル:★☆☆

 テンパイかどうかは牌を倒さないとわかる訳がない。

安目

f:id:hibit_at:20200602105641p:plain

 煽りレベル:★☆☆

 安目とかわざわざ言わんでよろしい。ただ役と点数を一応添えているあたり、吉岡さんとしてはまだマシな方。

おれのテンパイに……

f:id:hibit_at:20200602105812p:plain

 煽りレベル:★★☆

 知るかっちゅーねん。「まさか」がつくと煽り力1翻プラスである。

高目

f:id:hibit_at:20200602105949p:plain

「出るとは思わなかった」「高目」

 フリー雀荘に行くとマナーとして注意される言葉の代表格である。さっきも同じこと書いたよ!

イーシャンテンだと思ったのか

f:id:hibit_at:20200602110039p:plain

 煽りレベル:★★☆

 こっちの考えまで勝手に決めないでほしい。

テンパイしてるんだろ

f:id:hibit_at:20200602110115p:plain

 煽りレベル:★★☆

 相手がテンパイしてなかったら恥ずかしいし、それ以前に人の打ち筋を批判するのはマナー違反である。

るロ~ン

f:id:hibit_at:20200602110213p:plain

 煽りレベル:★★★

 発声は簡潔に行いましょう。

f:id:hibit_at:20200602110254p:plain

 ロンの発声をして役名を添えて点数申告! これでもこの漫画の中ではマシな方。

まとめ

 ざっとまとめて見たがみんな本当にマナーが悪いな……。

 いくら一晩で億クラスの金が動く高レート麻雀と云えど、マナーには気をつけたいものである

*1:慣れてない人には想像しづらいが、普通は役名も言わない。やり慣れている人は点数だけ言ってもらえれば一目で確認できる、という考えだ。

AtCoderで緑コーダーになりました

f:id:hibit_at:20200518180931p:plain

f:id:hibit_at:20200518180907p:plain

 先日のABC168で無事緑コーダーとなりました。「緑コーダーになるまで何をしたか」という記事はありふれているので、特に新規性のある内容が書けるとは思えませんが、一区切りとして。

あまり書きたくなかった

 最初からこういうこと書くのも何ですが、この記事を書くにあたってあまり気は進みませんでした。なぜなら、自分なら緑コーダーぐらいなら一瞬でなれると思っていたのに、半年以上かかってしまったからです。自分は頭良いと信じていたのに。打ち砕かれる希望。突きつけられる現実。厳しい。

 一応、自分の相場感、実際の問題、誰かが始めるにあたっての意見を書いておきましたので、参考になれば幸いです。

インフレしている気がする

 前提として、AtCoder全体がインフレしている気がします。社長の記事によれば緑は、

chokudai.hatenablog.com

学生ならかなり優秀。 エンジニアとしてもある程度の安心感がある。論理的に複雑な処理の実装に対応できない、なんてことはなさそう、くらいには思える

 ということですが、このツイート時点から参加者はほぼ倍増しており、教材も世に溢れています。今となってはbit全探索やDFS、BFSは茶でも組めて当たり前といった感じです。AtCoder Problemsで昔の問題をやると明らかに表示難易度に比べて簡単です。というか私が始めた時と比べても水準が上がっているような気がします。気のせい?

 緑でもレベルが高い、というのは自分弁護のための恣意的引用のようで気が引けるのですが、この記事で述べられていることは概ね同意できます。

学生でもエンジニアでも、このレベルに到達できたのならとても優秀です。そして、ここから先は趣味の領域になります。

www.pc-gear.com

自分のレベル

 プログラミングは好きでしたが、c++は初めてでした。Pythonなら多少心得があったのですが、計算時間が厳しそうということでc++をイチから始めることにしました。

atcoder.jp

 これをやりました。なので自分のc++競技プログラミング専用です。

 数学は得意だと思っていましたが最近はよくわからなくなってきました。いや、今でも得意だと信じているのですが……。実力の程はブログの過去記事などを読んでいただければ。以下の記事がおすすめです。

deux-hibi.hatenablog.com

deux-hibi.hatenablog.com

頭の良さだけで押し切れるか

 競プロを始めたいという人にとって、自分の潜在的な思考力がどれぐらい通用するかというのは気になる点だと思います。これについては「センスだけでいくなら相当の頭の良さが必要」という感じでしょうか。AtCoderはパズル的な問題が出やすく、本質さえ分かれば数行で正解、というのも問題によっては可能です。

atcoder.jp

 例えば、これはD問題ですが数学的考察により数行で解くことができます。

atcoder.jp

 これはE問題ですが同様です。

 こういった問題達を見逃さずに瞬殺できれば、コーディングの練習を積まずとも、センスだけでも緑より上、水色や青になれる可能性はありますが、きわめて高い水準を要求されると思います。もしあなたが数学オリンピックに出場できるぐらいの数学力があればさすがに心配ないでしょう。私はそこまでではなかったので、結局真面目にトレーニングする羽目になりました。

慣れが必要

 やはり競プロは競プロという独立したスポーツです。数学力やコーディング力と少なからぬ関係はありますが、そこで成績を出すには競プロというフォーマットに慣れる必要があります。入出力を受け取って、アルゴリズムに落とし込み、計算量を見積もって、実装する。コンテスト本番で安定してパフォーマンスを出すためには、ある程度問題を解いてコンテストを経験することは必須です。別の言い方をすると、簡単な問題であれば反射的に典型問題に落とし込んで無表情で瞬殺できるようになる必要がありますし、その幅をどんどん広げていく必要があります。

atcoder.jp

 例えばABC167で出たこの問題は愚直な全探索で、本番もわりと落ち着いて解けたのですが、これを迷いなく実装するにはけっこう慣れが必要ではないかと思います。ていうかこれで茶diff前半なの……。

 あと、一般的な数学力とは別の「競プロ用数学力」ともいうべき概念が存在すると思います。以下の問題は単純な組み合わせなのですが、扱う数が大きいので逆元の実装が必要です。慣れないとけっこう大変。

atcoder.jp

競プロが役に立つか

 実務に役に立つかと言われたら、超専門的な業務を除いて、それほどならないだろうなと思います。競プロではアルゴリズムを洗練させて実行時間を2秒以内に収める必要がありますが、現実には10分かけてコードを改善するより計算機に10分多く計算させた方が合理的な方がほとんどだと思います。

 もちろん完全な無駄ではなく、計算量の肌感覚が身に着くので「これは冗長な計算をしてるな」とか「この多重ループは気持ち悪いな」とかがわかるようになります。わざわざ配列や変数を新しく定義せずとも目的の値を見つけ出す最短ルートを見つけ出せますし、複数の添え字の動きを頭の中でイメージしながら、エラーを出さずにループを構築させることができます。

 しかしそれらのようなことは開発全体から見れば一部の部分であり、現実には環境構築で躓かないか、とりあえず動くコードを作れるか、スクレイピングや学習に回す時間を何時間確保できるか、といったことの方が、開発においては重要な場合が多いかなと思います。

競プロ自体を楽しいと思えるか

 ともあれ、「ここを超えられないと自分的にヤバいだろ」というラインは超えたので一安心です。最近のコンテストでも水パフォは何回か出ているし、この半年でかなり基礎を固めた感はあるので、このペースで努力を続けていけば水色になれるだろうという感触はあります。ただ、この「努力」というのは、難問のAC、(恐らく業務では使わない)ライブラリの実装訓練といったものもを含む地道なものです。それだけのモチベをこれからも維持し続けられるかはわかりません。他のことに時間を取られてしまうかもしれないし、そもそも問題を解くことが楽しく思えなくなってくるかもしれません。

 やはり重要なのはパズルを楽しめるかどうかではないかと思います。意識が低いかもしれませんが、今でも灰diff中盤~茶diff中盤あたりをなんとなく解いている時が一番楽しいかもしれません。問題に集中できている時は無心になれるので、これだけの環境を用意してくれたAtCoder社には感謝に堪えません。

 上で「緑にならないと自分的にヤバいだろ」と述べましたが、例え灰色でも、問題を解きながらACを重ねている限りその人は立派な競技プログラマなのだと思います。今後何かのきっかけで急成長して青や黄になっても、その思いは変わらないと思います。

 これからも精進していきます。

Blender触ったことないけど販売モデルに尻揺れを追加したいという人へ

Blenderのバージョンは2.80です

これまでのあらすじ

Blender触ったことないけど販売モデルを巨乳に改変したいという人へ - hibitの技術系メモ

プロローグ

 よお、久しぶりだな。あれからもう1年半近くも経ったのか。お前さんの3Dモデルも見違えるようになったじゃねえか。

 ……とは言っても、今ではBOOTH - 創作物の総合マーケットで数百を超えるアバターが販売されている。お前さんのそのイカしたモデルは、フルスクラッチか? 改変か? まあ、どっちでも変わらんか。そんなことを論じる意味もなくなっちまったな。時代も変わったもんだ。俺みたいなロートルに、今更何の用があってきたんだ?

 ……なるほど、胸の次は尻ってワケか。お前さんの考えてることはわかるさ、同類だからな。まあ、些かマニアックだし、対応しているモデルは少ないだろうな。だが自分でそれを設定するということは、Blenderの闇のより深くへ進むってことだ。その覚悟はあるか? ……と言いたいところだが、その様子じゃ聞く必要はなさそうだな。

メッシュの改造

 まずはおさらいだ。プロポーショナル編集で体型を変更する。オブジェクトが服や肌に分かれている場合にはCtrl + Jで結合しておいた方が良いだろうな。オブジェクトが結合されても割り当てられたマテリアルは変わらないから心配無用だ。

f:id:hibit_at:20200415161558p:plain

 Xミラーにチェックを入れるのを忘れるなよ。

f:id:hibit_at:20200415161540p:plain

 あとは適当に頂点を動かして……

f:id:hibit_at:20200415162315p:plain

 こんなところか。

ボーンとは

 揺れ、関節……そういったもの基本的に全部ボーンによって制御されている。さて、ボーンとは何か? それを説明するために表示をまずワイヤーフレーム表示にする。

f:id:hibit_at:20200416101314p:plain

 ここをクリックしてもいいが、キーボードでもできる。Blender2.8系だとZ4だな。

f:id:hibit_at:20200415162641p:plain

 さて、ボーンとはこの体の内外にあるクサビ型のことだ。これ全体でアーマチュアといい、個々のクサビ型をボーンという。このアーマチュアが変形する時、それぞれのボーンに対応するポリゴンもくっついて一緒に回転する。その対応関係のことをウェイトというが、まあこれは後で説明する。

 要は3Dモデルの動きってのは、回転で出来ているのさ。人間の骨を模した構造を持つボーン達と、それらに対応したポリゴンが回転することによって、3Dモデルも人間らしく動くって訳だ。

 そしてこのモデルに……というかほとんどの販売モデルに尻用のボーンはない。hipsってのはあるが、それは体の起点に近い概念で、いわゆる尻肉にあたる部分ではない。販売モデルのほとんどは髪や胸に追加でボーンとウェイトを設定して揺らせるようにしてくれているが、尻までそれをやっているモデルってのはまあ……少ないだろうな。だからこそ、お前さんは今それを設定する必要があるということだ。ここまではいいな?

ボーンを追加

 今からボーンを追加していくぞ。アーマチュアを選択して編集モードだ。tabキーでも切り替えられる。

f:id:hibit_at:20200416100950p:plain

 アーマチュアはポリゴンと同じように、Eキーで押し出しをすることにより新しいボーンを生やせる。ここでもXミラーは忘れるなよ。

f:id:hibit_at:20200416101629p:plain

 そしてテクニックだが、Shiftキーを押しながらEキーを押すと左右対称にボーンが生えてくる。最終的には左右まったく同じものを作らなければいけないからこれは必須だな。

 さて、新しく突き出たこの双子のボーン、これが将来の尻ボーンになる訳だが、こいつらの先端はどこに置けばいい?

 極論すると、どこに置いてもいい。回転の起点になるのはボーンの根本だからな。もちろん、そこから子を生やす場合はその先端の位置も重要になってくるが、今回は無関係だ。まあ、納まりがいい場所に置いとくがいいさ。

f:id:hibit_at:20200416101802p:plain

 ボーンの名前はここで変えておく。hipsはもうすでにあるから……英語だとbuttocks_Lbuttocks_Rあたりが適切か? ここでの名前は重要だ。名称を統一して_L_Rを忘れるなよ。理由は後で説明する。

 そういえば、お前ならそろそろ疑問に思っている頃だろうな。

 尻のポリゴンはこんな高い位置を中心に回転するのか? と。

f:id:hibit_at:20200416102022p:plain

 そう、hipsの先端は腰まで伸びている。そこからspine(脊椎)ボーンが生えてくるんだから当然だな。hipsから生やした以上、そこがボーンの起点になるのは避けられない。しかし人間の尻ってのは、脊柱の根本を中心に回転する訳じゃない。ならばどうするか? 方法は2つある。1つはボーンを二段構成にすること。もう1つは、ボーンの連結関係を切り離すことだ。どっちで働きは同じだが、後者を説明するぞ。

f:id:hibit_at:20200416102149p:plain

 ここで「接続」のチェックマークを外す。

f:id:hibit_at:20200416102332p:plain

 今しがた生やしたbuttocksボーンの根本を選択し移動させる。hipsの先端が引っ張られることもなく、自由に動かせるはずだ。ちょうどいいところに動かしてやれ。

ウェイトペイント

 これで第一段階は完了だ。しかし今のままだとボーンが動いてもポリゴンは1mmも動かない。ボーンとポリゴンを対応させる必要がある。3Dモデルってのは、ボーン毎にどの頂点が連動するかってのが決まっているのさ。この連動をウェイトといい、人体が自然に動くためにはすべてのボーンにウェイトが適切に設定されていなければならない。指先に至るまで、ボーンごとに全部だぜ? 気の遠くなるような話だろ……3Dモデルってのは手間の塊なのさ。

 ウェイトは頂点グループによって管理される。専門用語が多いが、流れをなんとなく把握できれば細かい部分は覚えなくていい。ボーンと同じ名前の頂点グループに含まれる頂点にウェイトが乗っている、ということになる。だから新しく作成したボーンにウェイトを乗せるには新しく頂点グループを作成する必要がある。名前が1文字でも違ったらウェイトが設定されないから要注意だ。

 まずは頂点グループ作成を作る必要がある。オブジェクトモードに戻って、ソリッド表示(Z6)、アーマチュアは非表示(H)しておいた方がやりやすい。

f:id:hibit_at:20200416102831p:plain

 ここの「+」ボタンでグループを新規作成した後、名前を変えてさっき作ったボーンと同じにする。重ねて言うが、1文字も間違えるなよ

f:id:hibit_at:20200416102952p:plain

 これでやっとウェイトを塗る準備ができたな。

 体のオブジェクトを選択して、Ctrl + tabキーを押してみろ。

f:id:hibit_at:20200416103050p:plain

 そこで「ウェイトペイント」を選択だ(7キーでもいい)。そう、ウェイトは「塗る」モンなのさ。CADみたいな操作を要求されるBlenderの中で、ここだけはアナログな筆操作を要求される。

f:id:hibit_at:20200416103139p:plain

 ここでも切り替えられるが、カーソルを持っていくのがめんどくさいならキー操作に慣れることをオススメするぜ。

f:id:hibit_at:20200416103236p:plain

 ウェイトペイントモードにしたら、こんな風に真っ青な表示になっているはずだ。青ってことはウェイトが乗っていないってことだ。いまからこのキャンバスに魂込めてウェイトを塗っていく。おっと、Xミラーもここでは忘れるなよ。

f:id:hibit_at:20200416103425p:plain

 ブラシはここで選択する。右上の「ツール」から「ブラシ」を開いてそこで切り替える。色々あるが、塗る時は「F Draw」、消す時は「F Subtract」の2種類だけでいい。

f:id:hibit_at:20200416104954p:plain

 こんな塩梅か? 赤く塗られた点がウェイトがついた部分だ。もう片方は塗る必要はない。xxxx_Lという頂点グループにウェイトが塗られた時点で、xxxx_Rにも左右対称に塗られているからな。便利だろ? 名称に気をつけろって言ったのはそういうことさ。

 気をつける点として、ウェイトってのは、それ単体では赤でも緑でも水色でも重みは変わらない。色さえついていれば問答無用にボーンと連動するんだ。だから塗ってないと思った点(じつはうっすら水色)が実はモロに動いて飛び出る……なんてのがウェイトあるあるだな。まあ、こういう末端の揺れボーンだったらそこまで影響はないが、確認は必須だ。

f:id:hibit_at:20200416105656p:plain

 確認はポーズモードでできる。右上の「ポーズ」を選択してから当該ボーンを選択、Rキーでボーンを回転させて挙動を確かめればいい。

f:id:hibit_at:20200416105946p:plain

 大丈夫そうだな。

Unityへの適用

 長い作業もそろそろ大詰めだ。今までの作業で、ボーン→ポリゴンの流れはできたが、いまのままだとボーンが動かない。spineheadといったhumanoidに必須なボーンはトラッキングデータを反映してくれるが、それ以外のボーンはただ固定して動くだけだ。buttocksボーンに揺れ物を適用させることによって、ようやくトラッキングの動きが揺れに反映されて、自然な揺れ物となる。

f:id:hibit_at:20200416191145g:plain

 こんな風にな。やれやれ、やっと一段落だ。揺れ物としては有名なものはDynamicBone(有料)、VRMSpringBone(無料)があるが、まあそこら辺の導入やパラメータ設定は他の記事を参照してくれ。

 この一連の作業が理解できていれば、ほかにもいろいろな揺れ物を自力で実装できるはずだ。お前さんの3D人生が充実することを祈ってるぜ。

エピローグ

――いらっしゃいませ。

 ああ、いつもお世話になっております。相変わらず色々な部分が豊満で良いモデルですね。

 え、あの人に会ったんですか。ははあ、なるほど。でもお客さん、もうあんまりあの人には関わらない方がいいですよ。

 いやね、あの人も相変わらずで、それでもBANはされずにギリギリの線を狙っていたみたいなんですけど、この間twitchにBANされちゃったみたいで。

 お客さんは配信とかするかわからないですけど、命あっての物種、アカウントあっての配信ですからね。お客さんも気を付けてくださいね。と言っても、あの人と同様、どうせ突っ走っちゃうんでしょうけど。

We don’t permit streamers to be fully or partially nude, including exposing genitals or buttocks. We do not permit the visible outline of genitals, even when covered. Broadcasting nude or partially nude minors is always prohibited, regardless of context.

https://blog.twitch.tv/en/2020/04/07/update-to-our-nudity-and-attire-policy/

筆者和訳: 配信者が完全なまたは部分的な裸になることは許可されていません(性器や臀部を露出させることも含めます)。また、性器がカバーされている場合でも、その輪郭がはっきり見えることは許可されていません。未成年者の完全なまたは部分的な裸を放送することは、いかなる場合でも常に禁止されています。

かわいそうなじーぴーゆー2020

さく・え hibit

※VRChatはすばらしいゲームです

f:id:hibit_at:20200314191046p:plain

じーぴーゆーたちはこうじょうでせいさんされます

きれいなげーむをびょうがすることや

きかいがくしゅうでよのなかのやくにたつことをゆめみています

f:id:hibit_at:20200314191133p:plain

じーぴーゆーはぎょうれつをけいさんすることや

さんかっけいをびょうがすることがだいすきです

えんどゆーざーのもとでなにをするのか

いまからどきどきしています

f:id:hibit_at:20200314191157p:plain

そんなあるひ、げーむだいすきおじさんが

じーぴーゆーをかっていきました

よーし、かっこいいげーむをたくさんびょうがしていくぞ

f:id:hibit_at:20200314191218p:plain

しかし、なんと! じーぴーゆーをかったのは

ぶいあーるでおんなのこになることがだいすきな

ばーちゃるびしょうじょじゅにくおじさんだったのです

f:id:hibit_at:20200314191227p:plain

まいにちおんなのこのあばたーばかりびょうがするじーぴーゆー

でも、もんくはいいません

ゆーざーをたのしませることが

じーぴーゆーのなによりのよろこびだからです

f:id:hibit_at:20200314191249p:plain あるとき、いちぶのゆーざーのあいだで

じょそうようのふくをおくったりじどりをあげたりすることが

はやりはじめました

f:id:hibit_at:20200314191315p:plain

おじさんも「おお! やっぱり、りあるのほうがいいぞ!」と

ぜんぜんぶいあーるをしなくなってしまいました

f:id:hibit_at:20200314191332p:plain

すっかりほこりをかぶったじーぴーゆー

でも、たのしそうなおじさんをみていると

これでよかったのだとおもい、このいえをさることにしました

f:id:hibit_at:20200314191424p:plain

あてもなくあるくじーぴーゆー

そこにびんぼうながくしゃがとおりがかりました

「おお! これはさいしんのじーぴーゆー!」

f:id:hibit_at:20200314191437p:plain

それから、じーぴーゆーはけんきゅうしつで

しぬほどでぃーぷらーにんぐをする

しあわせなひびをおくることになったのでした

めでたしめでたし

元ネタ: kagamin.net

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:これはさすがに知っていた