テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unityでパンツが見えそうなら「見せられないよ!」する

まず最初に書いておくと、この方法は失敗作だ。

単純にパフォーマンスが良くないし、精度も今ひとつ。
だけど、同じ過ちを犯す人がいるかもしれないから、メモに残しておく。

ちなみに、こんな感じになる。一応リアルタイム。
画像はSweetSpotの見せられないよアイコンより。

健全2

健全

モデルはAoiちゃん。
少し前からあった自分好みのアセットで、制服・パジャマ・道着のような物から、ボロボロにされた服やバスタオル一枚、スク水ニーソ・セーラー服の下にスク水といった、マニアックな物も入ってる逸品。

モーションも格闘から会話・移動等々、非常に良い感じ(62種類?多すぎて分からん)

スクリーンショット 2014-06-23 23.22.25
Aoi Character Pack

あ、ちなみにバスタオルの中は黒塗りです。
つまりシュレティンガーのぱんつ。


この方法、やってる事はすごく簡単だ。

  1. Mesh Coliderをリアルタイムに更新
  2. パンツにコライダーを設定
  3. パンツへ向けてRaycastを飛ばす
  4. 当たれば見えてるので、「みせられないよ」を出す

1、Mesh Coliderをリアルタイムに更新。

これは単純で、SkinnedMeshRendererのBakeMeshでメッシュをベイクして、それをMeshColiderへ流し込んでる。この方法はパフォーマンスをアホみたいに消費するけど、一応はリアルタイムでメッシュコライダーを動かすことが出来る。


        bakedMesh = new Mesh();
        mesh = transform.GetComponentInChildren<SkinnedMeshRenderer>();
        meshCollider = GetComponent<MeshCollider>();

// 中略
        mesh.BakeMesh(bakedMesh);
        meshCollider.sharedMesh = null;
        meshCollider.sharedMesh = bakedMesh;

とりあえずこのままだと凄くしんどいので、数フレームに1回動かすことにした。なので、AOIちゃんの前蹴りで見えてしまうパンツには対応できない。

また、スカートは実際は透明色で破いていたので、その辺りも考える必要があった。例えば、ヒットしたコライダーがMeshColiderなら、そのメッシュのUVから色を取り出して、色が透明だったら再送する等々。RaycastAllでも良い。

スクリーンショット 2014-06-23 23.34.02



2,パンツにコライダーを設定


次にパンツにコライダーを設定する。パンツの位置はHipの位置から少し下にした。しかし、これが意外と難問で、コライダーの大きさを小さくするとパンツが見えてしまうし、コライダーの大きさを大きくすると見えてないのに「みせられないよ」が出てしまう。

なので、スカートの上のような位置には大きめのコライダーを設定し、特定の角度でないと「みせられないよ」が出ないようにした。正直、この辺りでメッシュコライダー要らなくね?と思い始めたが、ふとももは見えてるがパンツは見えない状態もあるので、一応残した。

ちなみに、パンツは割と下の方に配置している。理由は簡単で、下から覗いた時に反応しやすいように。ローアングラー



3、パンツへ向けてRaycastを飛ばす

単純にカメラからパンツの位置へRaycastを飛ばしてるだけ。
正しくは、パンツがカメラの位置を取得してカメラの位置からRaycastを飛ばしてる。

Rayの設定はこんな感じ。

Ray ray = new Ray(cameraTransform.positiontarget.position - cameraTransform.position);

そう、面積に対してRayを飛ばしていないので、ここでも穴がある。
面積に大して飛ばしていれば、もう少しパンツのコライダーを小さくしても何とかなったかもしれない。

スクリーンショット 2014-06-23 23.40.10

4,パンツの位置に「見せられないよ」を出す
これは凄く簡単。

まずパンツの位置のスクリーン座標を出す。その座標にGUI Textureを出すだけ。なので、近づくと「みせられないよ」が非常に大きくなってしまう問題がある。

実際は、カメラ方向へ「みせられないよ」をビルボードとして表示する方法の方が良さそうだ。

transform.position = Camera.main.WorldToViewportPointtarget.position );

スクリーンショット 2014-06-23 23.43.39

ちなみに、「みせられないよ」の位置は若干右上にずれているので、単純に表示しただけでは位置がずれてしまう。この対策は、一旦スクリーン座標(0/0)へ移動した後に、Pixel Insetで中心にしたい物が左下になるように調整するのが楽だ。



と、ここまで作って色々と考えた結果、もっと良さそうなアイディアがあるんじゃないかと思う。例えば「パンツ判定用テクスチャを作り、それを別途レンダリング・判定を行う」とか、「足の位置から見える範囲を計算する」等々。

それに、実際は東京大学・五十嵐研究所の開発したこだわり物理エンジン(アニメ的に見栄えの良いようにスカートの中を隠したりポリゴンを歪めたりする物理エンジン・Unityで使用可能)でスカートの中が見えないように上手くごまかす方法もある。

色々と案があるが、とりあえず来週の日曜日にでも試してみよう。



この記事では他のアイディアや不明点、あと最近のアニメでよく見る「謎の光」の画像などを募集しています。何かあれば@tsubaki_t1やこの記事のコメント欄まで。