More than 1 year has passed since last update.

これはマイネットエンターテイメント Advent Calendar 7日目の記事です。


経緯

ふと揺れるおっぱいが見たい気持ちになったのですが、MayaやLive2Dを買うお金がないので気合いで作りました。


準備


  • Unity (4.x or 5.x 無料版でおk)

  • おっぱい素材


作業


揺れる物体をUnityの物理エンジン(Spring Joint)を使って表現する


  • 1つめ

Rigitbodyコンポーネントだけのオブジェクト。

停止してほしいので、RigitodyのUse Gravityはオフ、Constraintsは全部チェックつける。

スクリーンショット 2016-12-06 20.20.11.png


  • 2つめ

Spring Jointコンポーネントを追加し、Connected Bodyに「1つめ」のオブジェクトを指定。それ以外の値は適当です。

RigitbodyのMassを小さめにしています。

スクリーンショット 2016-12-06 20.23.59.png


  • 3つめ

基本的に2つめのSpring Jointと同じです。

Connected Bodyに「2つめ」のオブジェクトを指定。

RigitbodyのMassを調整していい感じにばいんばいんするようにする(*´Д`)

コツとしては、


  • Springを大きめにすると激しくなって楽しい

  • Damperを0にしないと停止してしまう

  • Max Distanceは小さすぎず、大きすぎず・・・

  • Mathでばいんばいん具合を調整

12月-06-2016 20-32-49.gif

こんな感じになれば、ほら、楽しそうな予感が( ˆωˆ)

Mesh Rendererは確認用なので、あってもなくてもおkです。


画像素材を用意する


  • キャラクター

犠牲者

nene.png

インポート設定は特に不要です。


  • ノーマルマップ

空気を読んでそれっぽいものを作成

nene_NRM.png

インポート設定でTexture Type「Normal map」 Create from Grayscaleにチェックをつけるといい感じにノーマルマップを作成できます。

スクリーンショット 2016-12-06 20.55.27.png


  • マスク

nene_mask.png

マスクはアルファチャンネルを使用するので、Photoshopで↓こんな感じになっていないとダメです。(RGBチャンネルは使用しないので無しでおk)

スクリーンショット 2016-12-06 20.52.30.png

インポート設定は特に不要です。


いい感じに揺れるシェーダーをつくる

マスクのアルファチャンネルを使ってテクスチャーを動かします。

ノーマルマップは設定しなくても大丈夫ですが設定したほうが影ができて興奮できます。


pai.shader

Shader "pai" {

Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_Parallax ("Height", Range (0.005, 0.2)) = 0.02
_ParallaxX ("x", Range (-10.0, 10.0)) = 0.02
_ParallaxY ("y", Range (-10.0, 10.0)) = 0.02
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
_ParallaxMap ("Heightmap (A)", 2D) = "black" {}
}

SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 500

CGPROGRAM
#pragma surface surf Lambert alpha

sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _ParallaxMap;
fixed4 _Color;
float _Parallax;
float _ParallaxX;
float _ParallaxY;

struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};

void surf (Input IN, inout SurfaceOutput o) {
half h = tex2D (_ParallaxMap, IN.uv_BumpMap).w;
float3 viewDir = float3(IN.viewDir.x - _ParallaxX, IN.viewDir.y - _ParallaxY, IN.viewDir.z );
float2 offset = ParallaxOffset (h, _Parallax, viewDir);

IN.uv_MainTex += offset;
IN.uv_BumpMap += offset;

fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}

FallBack "Transparent/Bumped Diffuse"
}



マテリアルをつくる

先ほどのpaiシェーダーと画像素材からマテリアルをつくります。

値は自由ですが、paiシェーダーのHeightを大きくするとアレが大きくなります。

Heightはキャラクターに応じて微調整してください。(まずは0.05くらいから)

スクリーンショット 2016-12-06 21.01.47.png

xとyの値をいじるとこんな感じに動きます。。。

こいつにSpring Jointの動きを適用させれば、きっと夢が広がる!!!!!!!

pai_test.gif


Spring Jointで揺れているオブジェクトのpositionをpaiシェーダーに代入


pai_controller.cs

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class pai_controller : MonoBehaviour {

public float anchorX = 0.0f;
public float anchorY = 0.0f;

public float forceX = 1.0f;
public float forceY = 1.0f;

public Material pai;

void Update () {
if (!pai)
return;

var x = this.transform.localPosition.x * forceX + anchorX;
var y = this.transform.localPosition.y * forceY + anchorY;

pai.SetFloat ("_ParallaxX", x);
pai.SetFloat ("_ParallaxY", y);
}
}


Spring Jointの3つめにこのpai controllerコンポーネントをはりつけます。

Pai(Material)にはpaiなマテリアルをつっこめばおkです

それ以外の値については初期値のままでも大丈夫です。

スクリーンショット 2016-12-06 21.37.07.png

ちゃんとキャラクターごとにパラメータ調整すれば、もっといい感じになる気がする・・・(´Д`)


結果

nene.gif

キタ━━━━━━━(・∀・)━━━━━━━!!!!

勢いで他のキャラクターでもやってみた。

chara_1.gif

chara_2.gif


まとめ

やはり手軽に揺らしたおっぱいはなんか怖い!!

ノーマルマップとマスクを作る要員がいれば、既存のキャラクターからおっぱいを量産できるので便利だと思います。


世に溢れている揺れおっぱいは、作り手の愛情と職人技で成り立っている。

揺れおっぱいクリエイターに出会ったときは敬意を表すようにします、ありがとうございます。