hibitの技術系メモ

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

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:このロゴのキャラの名前。著作権はかろうじて私にあります。