Onoty3D

Unityに関するメモとか

VertExmotionでおきゅたんのほっぺをつつく。

f:id:onoty3d:20180811044612p:plain


この記事はUnity アセット真夏のアドベントカレンダー 2018 Summer!
の11日目の記事です。

自分の中のロードマップでは拙作Character Particleの機能追加版がすでに公開されている予定であったため、本来そちらを紹介するつもりでしたが、全然出来ていないので、保険で予告タイトルに含めていたVertExmotionの方を取り扱います。

VertExmotion


VertExmotionは、シェーダーで頂点を移動させることにより、オブジェクトをプルンプルンに見せたり出来るアセットです。

揺れ表現、例えば揺れものスクリプトを使う場合は対象モデルにボーンが必須になりますが、このアセットはメッシュの頂点移動での揺れ表現の為、ボーンが無いものにも利用できます。

アセットはノーマルとPro版がありますが、Pro版ではすべてのソースコードの公開と新機能のベータ版、優先サポートなどが保証されています。

f:id:onoty3d:20180811012552p:plain

これをつかって、今回はおきゅたんのほっぺをツンツン(タプタプ?)してみました。

こんな感じ。

ちょっとまだツメが甘いですが、調整を重ねた暁には、「おきゅたんツンツンシステム」として設立したいと思っております。

さて設定方法。
解説動画があるんで、大まかな部分はそちらを参照してください。


初期操作としては、揺らしたいモデルのSkinnedMeshRendererにVertExmotionスクリプトをセットし、さらにそのマテリアルのシェーダをVertExMotionに対応したものにする感じです。
Rendererが複数のマテリアルをもつ場合は、動かしたいサブメッシュのマテリアルのみシェーダーを変える感じで大丈夫です(例えば顔のマテリアルのみとか)。

UnityのビルトインシェーダーをVertExmotionに対応させたものはアセットに付属しているので、特に自分で用意せずそのまま使えます。
それ以外のシェーダーでVertExmotionの効果を使いたい場合は、シェーダーに手を入れる必要があります。改造自体は簡単なので、少し解説します。

例えば自分がおきゅたんモデルに利用しているUTS2の場合。

下準備
・VertExmotion.cgincをToon_DoubleShadeWithFeather.shaderがあるフォルダと同じフォルダにいれる
・Toon_DoubleShadeWithFeather.shader
UCTS_Outline.cginc
UCTS_DoubleShadeWithFeather.cginc
UCTS_ShadowCaster.cginc
をそれぞれ複製し、
Toon_DoubleShadeWithFeatherVert.shader
UCTS_OutlineVert.cginc
UCTS_DoubleShadeWithFeatherVert.cginc
UCTS_ShadowCasterVert.cginc
などの名前にする。

Toon_DoubleShadeWithFeatherVert.shaderの修正
・アウトライン用ほか、いくつかPassがあるので、各Pass内でVertExmotion.cgincをincludeする。
またUCTS_Outline.cgincやUCTS_DoubleShadeWithFeather.cginc、UCTS_ShadowCaster.cgincのinclude部分は、それぞれVertexEmotion対応したものに書き換える。

UCTS_OutlineVert.cginc、UCTS_DoubleShadeWithFeatherVert.cginc、UCTS_ShadowCasterVert.cgincの修正
・VertexInputにfloat4 color : COLOR;を追加
・vert処理の冒頭で、v.vertex = VertExmotion(v.vertex, v.color);を呼び出す

分かりづらいのでGist追加

これでUTS2もVertExmotionに対応できます。有料アセットなのでなかのコードの詳解は避けますが、スクリプト側で頂点カラーに情報を詰め込み、VertExmotion(v.vertex, v.color)の処理の中で、その値にしたがって頂点を動かしていってる感じです。
元の頂点に対しスクリプト側から情報をセットする感じなので、頂点数を増やすテッセレーション処理には使えないようです。テッセレーションへの対応が出来たら素敵なのですが。

全体通して、少しハマったところ
はじめ、下図のように、センサーを両頬が入る大きさにしていました。
(オレンジの円がセンサー範囲。)

f:id:onoty3d:20180811041842p:plain
こうした場合、センサーに含まれるすべての頂点が動いてしまいます。

なのでセンサーは、本当に動かしたい部分に範囲を狭め、狙ったところだけが影響を受けるようにしましょう。

f:id:onoty3d:20180811042642p:plain

f:id:onoty3d:20180811042750p:plain

右頬、左頬、それぞれ別のセンサーで管理している

センサー、エフェクト、コライダーは実行時も調整が可能であるため、実際に動かしながら調整していくといいと思います。

詳しい操作を動画任せにしてしまいましたが、以上となります~!

 

【検証不足】Planar Decal、テクスチャのUVに依存しないデカールシェーダを作る。

【検証不足】18/09/08 追記
ボーンが仕込まれたモデルの場合、ボーンの回転などで各頂点のローカル座標が動的に変更されると、デカールの位置がずれてしまいます。
Transformのポジション移動(ローカル座標に影響しない)しか考えてなかった…。
なのでボーンのないオブジェクト以外では、理想通りの振る舞いをしない可能性が高いです。申し訳ありません…。
ここは課題として、改良していきます。

------------------------------------------------------------------------------------------------------------------

キャラクターモデルの衣装に何かしら装飾を加えたい場合、テクスチャを直接加工するのもいいですが、デカール処理のあるシェーダーをつかうと、元のテクスチャにレイヤーのように重ねることが出来、便利です。
ただ若干難があり、衣装などは軽量化目的などで左右対称のUVになっていることも多いので、大抵のデカールシェーダーはそれに影響されて左右対称になってしまいます。

f:id:onoty3d:20180801171224p:plain
左右対称以前になんか色々残念な表示になっちゃった。

こういう場合、メインのテクスチャとは別にUV(セカンダリUV)を作成し、そこにデカールを載せたりしますが、少し大変で、DCCツールやスクリプトが必要だったりします。

ちなみに以前血糊表現でセカンダリUVを動的作成しました。

onoty3d.hatenablog.com

今回は別法で、Planarシェーダという仕組みを使ってみます。
Planarとは「平面」のこと。UV情報を使わず、メッシュの頂点の座標を平面の座標として扱い、その数値によってテクスチャを描画する方法です。
詳しくはググったらいくつか記事が出てきます。

X,Y,Zのうち、任意の一面のみを情報源とするならPlanar、全部を使う場合はTriplanarと言われます。
今回は服の柄につかうことを考えているので、全体ぐるりを考える必要はなく、前面だけ絵が出れば十分なので只のPlanarでいきます。

説明はこれくらいで、作ったシェーダー紹介するよ。

シェーダのパラメータは6つです。

f:id:onoty3d:20180801171450p:plain
Color: 下地になるカラー
MainTex: 下地になるテクスチャ
Decal Color: デカールのカラー
Decal: デカールテクスチャ
Decal Planar: デカールを表示する面
Decal Side: デカールを表示する側

 Decal Planarは、X,Y,Zどの表面にデカールを出すかを設定します。
モデルのローカルの向きが基準になるので切り替えて確認してみてください。

Decal Sideは、任意の面のうち、表と裏どちら側にデカールを出すかを設定します。
服の前後に同じ絵柄が出てると変だもんね?
Frontだと手前のみ、Backだと裏のみ、Bothだと両方に表示します。
Tシャツの装飾だと手前のみ、が多いかな?
両側に別の絵を出したい、とかいう時は改造しよう。

DecalテクスチャはTilingとOffsetでサイズと位置調整が出来ます。
絵を一つだけ出す場合は、テクスチャのWrap ModeをClampにしましょう。

f:id:onoty3d:20180801171716p:plain
絵を出したい面で、テクスチャが左右反転とか上下反転している場合は、Tilingの値の正負を入れ替えたりするといい感じになります。

f:id:onoty3d:20180801171732p:plain

あと細かい機能が欲しい場合は好きに改造してください。
Unlit版のシェーダーを公開しておきます。

UTS2への移植版は後ほどFANBOXで公開します(※公開しました)。

www.pixiv.net


もちろん手動でUnlit版のコードを移植すれば自力で作れます。

f:id:onoty3d:20180801172412p:plain

冥土送りにされる前におきゅたんにメイド服を着せる

着せ替えアセット、スキニング済みメイド服

siodamari.booth.pm

をご存知でしょうか。名前の通り、着せ替え用メイド服です。
自分は数日前にTwitterで見かけはしていたものの、普段は鹿アバターですし、おきゅたんアバターに着せるにしても「どうせBlenderとかでの加工が必要なんだろうな」と思って注視はしていませんでした。

ところが先日、VRChat内でたまたまこのメイド服を纏ったnmさんに出会いました。

f:id:onoty3d:20180727224458p:plain
nmさん

おきゅたんbotが着せ替え方法を聞いてみたところ、なんとBlender等は必要なく、Unityだけで完結するとのことでした。なんだってー!

f:id:onoty3d:20180727224641p:plain
いろいろ大公開で説明するnmさんと、バットで牽制するおきゅたんbot

その時は軽く仕組みを聞いただけで終わったのですが、夜が明けてから早速購入して試してみたところ、あっという間に着せ替えが出来ました。

 正直お手軽過ぎて、同梱ReadMeを読むだけでいける内容でしたが、とりあえずやり方をメモっていきます。

※注 自分はモデルを操作する能力がまだ無いため、メッシュやマテリアルを分割する術をまだ知りません。公開中のVRC用おきゅたんモデルは首、腕、足が同一メッシュであるため、やむなく今回はメイド服に付属するソックスと靴は利用しないことにします。

1.モデルの用意

おきゅたんモデルとメイド服を同じプロジェクトに入れる。
今回はVRChatでの利用を前提とするため、VRC用のモデルをインポートします。

bowlroll.net

2.シーンに配置

おきゅたんをシーンに置き、適当にマテリアル調整(ただの見た目のためだけ)。

f:id:onoty3d:20180727225437p:plain

メイド服のモデルも追加。

f:id:onoty3d:20180727225456p:plain

メイド服の頭は三種類のアクセサリが用意されています。
今回はひらひらなHeadDressを使います。残りは削除してOKです。

f:id:onoty3d:20180727225532p:plain
また先述のとおり、ソックスと靴も利用しないため削除します。

3.ボーン位置をあわせる

残りをまるごとおきゅたんモデルの中に移動させ、子にします。

f:id:onoty3d:20180727225621p:plain

まずHeadDressをheadの子にします。
サイズが大きいので、HeadDressのスケールを0.8~0.85にします。
※インポート時のスケール設定に委ねられるので、スケールのサイズは参考程度に。

f:id:onoty3d:20180727230606p:plain

次にHip以下を対応するボーンの子にしていきます。

lowbody---Maid_Hips
upbody---Maid_Spine
upbody2---Maid_Chest
neck---Maid_Neck
right_sholder---Maid_RightShoulder
right_arm---Maid_RightArm
right_elbow---Maid_RightForeArm
(leftも同様に)

f:id:onoty3d:20180727232447p:plain

※本来は足もセットすべきですが、今回は使わないため削除してOK

基本的に各ボーンは対応するのボーン位置とまったく同じ位置に移動させたほうがいいです(回転時のズレをなくすため)。
ただしおきゅたんモデルの場合ChestやNeckなんかは若干移動させる必要があるようです。また、腕はおきゅたんがAポーズなのに対し、メイド服がTポーズなので、回転させて合わせます。

f:id:onoty3d:20180727230310p:plain

f:id:onoty3d:20180727230331p:plain
また肘から下の袖の長さが足りないため、Maid_RightForeArmのボーンサイズを1.5倍しました(これも回転時に歪ませないため、x,y,z三軸とも1.5倍)

f:id:onoty3d:20180727231334p:plain

メイド服に手首のボーンも入っていたら、リサイズしなくても袖までの長さを調整出来る気がします。手首ボーンも追加されるといいなぁ。

位置を微調整したら、元々のおきゅたんモデルで不要なメッシュ、服、スカート、リボンを削除します。

f:id:onoty3d:20180727230533p:plain

以上でメイドおきゅたんの完成となります。
適当にアニメーションをセットして、動きが破綻してないことを確認しましょう。

気になっているところ

f:id:onoty3d:20180727231543p:plain

ウェイトの関係か、屈むと服がエプロンを突き抜ける。
ボーンの調整で直しきれない場合は、服のテクスチャの該当位置を白くすればいいかも?

 

追記
おきゅたんbotに冥土送りにされた。

f:id:onoty3d:20180730002752p:plain

 

ポストエフェクトっぽく世界を変える試み その2

onoty3d.hatenablog.com


前回の続き。
さて、もう一つくらいエフェクト作っちゃおう、と思って思いついたのがドットのモザイク。
多分なんか最近見たんだろう。
先に完成画を見せるとこんな感じね。

f:id:onoty3d:20180723025728p:plain

こういうのをつくるには、シェーダーで図形をお絵かきする知識が必要ですが、図形お絵かきに関してはSechiさんの公開されてるお絵かき入門が非常に勉強になります。
いろんな関数の捉え方がぐっと変わる。

予備知識があったため、脳内では「円描いてー、繰り返してー、中央の色を広げてー」とすぐに展開出来、余裕と思っていたのですが、実際に書くと意外と色々苦戦して、完成までに5時間近くかかってしまいました。

また出来上がった画を見た瞬間に、「あ、これビーズアートっぽくもできるじゃん」と思ったのでその機能も追加。

f:id:onoty3d:20180723025806p:plain

実際にVRChat内を歩いてみた時の動画はこちら。

若干試行錯誤が必要だったのと、試しに売ったら売れるのかが気になるので、ちょっとこれは100円で売ってみる。

onotchi.booth.pm

ポストエフェクトっぽく世界を変える試みと、指定色を残すシェーダー

さて、コミックおきゅたんをやったなら、ワールドそのものもコミック風にしてみたい。

自前のワールドならメッシュのシェーダーをそれ用のにすればいいのだけれど、任意のワールドをコミック風ににするにはポストエフェクトでやってしまうのが手っ取り早いです。
以前コミック風にするポストエフェクトは作成済み。

ただVRChatで使えるポストエフェクトはPost Processing Stackしか許されていないようで、そもそもそれも自作ワールドにしか使えないということで、どうにも太刀打ち出来ません。
さぁ、どうしようかなぁ…と思った時に思いついたのが、カメラの前に板を置いてしまうこと。板の後ろの画をそのまま描画するシェーダーを書いて、その画を加工してしまえばいいじゃないかと。
この辺は以前遊ばせていただいたEsさんの水面シェーダー関連の記事が心に残っていました。

esprog.hatenablog.com

公式にもサンプルはあります。

docs.unity3d.com

で、コミック表現の前に、試しに以前作った色残しエフェクトを組み合わてみました。

onoty3d.hatenablog.com

実際にVRChat内で使ってみたところ。

カメラ全体を覆っても良かったのですが、それだと後から動画編集したのと区別がつかなそうだったので、若干アピールのためにメガネにしてみました。

メガネにしてみて思ったのですが、最初メガネをHeadの子にしていたんですが、Headの子はどうやってもカメラに映らないようでした。
変に顔とか髪とかのメッシュに視界が埋まっちゃうのを防ぐためですかね。
とりあえず苦肉の策でNeckの子にしていますが、例えばVRモードの場合は手にメガネを持って、眼前にかざす、とかでもいいかも。
あるいはうまくHeadに外からJointする方法もあるのかな?
体全体を大きな球で覆って、その球にシェーダーを適用してもいいかも。

シェーダーはBOOTHで無償公開しました。
BOOTHデビューです。
作成したマテリアルを板などにセットして使ってみてください。

onotchi.booth.pm

パラメータは3種類で、

Target Color: 残す色
Threshold: 同系色の許容範囲
Brightness: 灰色にした部分の明るさ

が調整できます。

VRChat始めました

最近ようやくVRChat始めました。

f:id:onoty3d:20180723005528p:plain

アカウント自体は昨年から作っていたし、環境としてもいつでも始められる状態だったんですが、まぁ色々タイミングやらなにやらで。
始めたというものの、結局Oculus Riftをつけるのが面倒で今の所デスクトップでやってます。ただその内ちゃんとRiftでも入ります。デスクトップだと出来ないこと多いので…。
ちなみに、先述の通りアカウントだけは作っていたので、アバターは最初からアップロード可能でした。

未だ、VRChat内で出来ること・出来ないことあまり把握しきれておりませんが、とりあえずシェーダーだけはなんでも自由に使えることはわかったので、自分が過去にやったいろんなシェーダー遊びをやっていけたらいいな、と思っております。

とりあえず最初に試してみたのは、過去にもやったコミック風シェーダー。

その後、おきゅたんbotの提案もあってペラペラバージョンに進化しています。
物理的にメッシュやボーンを潰しているのではなく、シェーダーで潰しているため、普通にアニメーションとかは出来ます。

f:id:onoty3d:20180723010217p:plainf:id:onoty3d:20180723010250p:plain

まだまだ絶賛試行錯誤中です。
ついでに吹き出しや効果線、コマの枠なんか出せたら楽しいかなと思います。
吹き出しはリアルタイムで音声解析して喋った言葉がそのまま出せたらいいのですが、流石にいまのVRChatの機能だけでそれを実装する術は思いつきません…。

まずは通常のVRでの実装を模索してみたほうがいいかも。
ともかく色々と実験はしていきたいと思います。

スクショでお題にチャレンジに参加しました。

参加させていただきました、スクショでお題にチャレンジ。
結果はなんと大賞をいただいてしまいました。ありがとうございます、ありがとうございます…!

お題にチャレンジ!Vol.6: ハッピーバレンタインなイメージをUnityで作ったら?なスクリーンショット – Unity公式 Asset Portal

f:id:onoty3d:20180218002738p:plain

今回のお題、ハッピーバレンタインデー。
Humanoidこはくちゃんズが公開された時期だったので、最初に浮かんだ画は魔女の儀式のような感じでチョコレートを溶かすラッコちゃんでした。

ついでにこはくちゃんズだから、舞台は学校にしよう。
以前試した、UTS2(UnityChanToonShader2.0)のプロ生ちゃんとアニメ風の教室アセットがすごく馴染みが良かった(※)ので、同じパブリッシャーさんの調理室アセットを使わせてもらうことにしました。

(※)

 最終的につかったアセットはこれら。
(手頃なお値段で化学用具アセットがあったので、魔女をやめて化学にシフトしました(笑))
シェーダーは全てUTS2に置き換え。
幾つかアセットのタイトルにPBRと入っているのもありますが、ガン無視してしまった。
またテクスチャも一部はアニメ寄りになるよう、いろいろ手をいれました。

あと、応募時に申告するの忘れていましたが、スクショの作成自体は以下のアセットを使っています。
このアセット、スクショの作成方法をCapture Screenshotメソッド使うかRenderTexture使うか切り替えられたり、サイズも実際の表示サイズより大きなサイズを設定できたりと便利なんですよね。

以下製作途中でとったスクショの幾つか。f:id:onoty3d:20180218002229p:plain
最初に教室と、こはくちゃんズを適当に配置。
まだみさきちのポーズが決まっていません。
チョコを盗むユニティちゃんと、怪しげな準備を始めるラッコちゃん、どちらへ向けるか…。

 

f:id:onoty3d:20180218002344p:plain
3人の構図が決定。
カメラ位置を微修正。
また、光と影が強すぎる気がしたので、抑えています。

 

f:id:onoty3d:20180218002430p:plain
調理台の天板が黒くて全体的に暗めだったので明るく。
上の小物も地味な色だったため、原色に近い色を使ってメリハリ

 

f:id:onoty3d:20180218002738p:plain
キノコだけじゃつまらん!何か足そう!
マンドラゴラとかイモリとか入れてみたかったけれど、無料の根菜を使う。
ユニティちゃんの髪色もいつも見る感じにして、手元にチョコをひとつ持たせて盗んでる感を増す(増したつもり)。
さらにポストエフェクトを若干載せて、完成。
エフェクトはかけまくるとアニメっぽさが損なわれたので、結局ほんのりとしか使いませんでした。

【おまけ】
画面外では、使わなかった鍋とかが浮いていたり。f:id:onoty3d:20180218003026p:plain

膝立ちっぽいユニティちゃんが実は床に刺さってるだけだったり。f:id:onoty3d:20180218003150p:plain

 

今後もチャレンジのお題が出たときには、参加していきたいと思います。