どうぶつの森のような曲がった世界を Unity で再現してみたかったのでやってみます
あつまれ どうぶつの森 | Nintendo Switch | 任天堂
計算式
ある点から進むにつれて頂点の座標を下図グラフのように下げてやれば
同じようにできるはずなので、これをもとにやってみる
処理手順
頂点の座標を動かす方法として GPU と CPU があるが 今回は GPU (Shader) を利用して実装をしていく
手順は以下のとおり行う
- 頂点シェーダーで渡される頂点はローカル座標なのでワールド座標に変換する
- ある点から現在の頂点までの距離を計算する
- 距離を特定の値で乗算する
- 3の値を用いてy座標をずらす
- ワールド座標からローカル座標に変換する
これを 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 を適応すると下図のように頂点が曲がっていることが確認できる
Plane だとわかりにくいので Asset Storeより下記のものを利用して確認する
Low-Poly Simple Nature Pack | 3D Landscapes | Unity Asset Store
ちゃんと曲がってる表現ができていた
未実装
今回はyの頂点座標をずらしただけなので、正しくやるなら法線や角度に合わせてxzもずらしてあげる必要がでてきます