うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】どうぶつの森のような曲がった世界を作る

どうぶつの森のような曲がった世界を Unity で再現してみたかったのでやってみます

あつまれ どうぶつの森 | Nintendo Switch | 任天堂

計算式

ある点から進むにつれて頂点の座標を下図グラフのように下げてやれば
同じようにできるはずなので、これをもとにやってみる

f:id:hacchi_man:20200603044743p:plain:w300

処理手順

頂点の座標を動かす方法として GPU と CPU があるが 今回は GPU (Shader) を利用して実装をしていく

手順は以下のとおり行う

  1. 頂点シェーダーで渡される頂点はローカル座標なのでワールド座標に変換する
  2. ある点から現在の頂点までの距離を計算する
  3. 距離を特定の値で乗算する
  4. 3の値を用いてy座標をずらす
  5. ワールド座標からローカル座標に変換する

これを Shader 処理に変換すると下記のようになる

float4 curveIt(float4 v)
{
    // 1
    float4 world = mul(unity_ObjectToWorld, v);
    // 2 今回は 中心点を0地点にする
    float distance = length(world.z);
    // 3 係数は仮
    dist = pow(distance, 1.5);
    // 4 下に下げたいので-を掛ける
    world.y += distance * -0.1;
    // 5
    return mul(unity_WorldToObject, world);
}

確認

Plane モデルに 上記関数を利用した Shader を適応すると下図のように頂点が曲がっていることが確認できる

f:id:hacchi_man:20200603065841p:plain

Plane だとわかりにくいので Asset Storeより下記のものを利用して確認する

Low-Poly Simple Nature Pack | 3D Landscapes | Unity Asset Store

ちゃんと曲がってる表現ができていた

f:id:hacchi_man:20200603071202g:plain

未実装

今回はyの頂点座標をずらしただけなので、正しくやるなら法線や角度に合わせてxzもずらしてあげる必要がでてきます