【Unity】波のTerrainを作る♪

これって、案外簡単なのかなということでやってみた。
どうも参考の国土地理院のが失敗、さらにノイズ乗っけるとかというのはちょっとウワンにはむつかしかったので、ここはマンデルブロのPGをまねてやってみた。

【参考】
①[フラクタル地形自動生成](https://qiita.com/keny30827/items/f4e29a4a90779cf94da6)
②[Unityで国土地理院のデータを使って地形を作る](https://qiita.com/mechamogera/items/68791c10beeb59dca07d)
参考①はやはり難しすぎてまねできない、参考②はマネできたがどうも結果が今一つ。一応こちらは全てのBMPが画像をとりあえず地形にできたので、面白いとは思いましたが、国土地理院の地図データ。。特に山岳データは穴ぼこだらけ、文字が窪んじゃう、等高線もダメそう。しかし人の画像の地形が描けたのは面白かった？？
※ただし、あのJavascriptツールはOculusGoと相性悪くて作成後に消去する手間が必要でした

ということで、自前で海の波位作れそうということでやってみました。
###やったこと
（１）乱数で埋めつくす
（２）三角関数＋乱数でやってみる
（３）OculusGoで見る
###（１）乱数で埋めつくす
アイディアはあのマンデルブロのプログラムの改変でできるはずということで、以下のようなコード書きました。
※主要な部分は以下のとおり

```cs
    float Calculate(double X, double Y)
    {
        float s= (float)Math.Sin(X*5);
        float s1 = 1 + (float)0.05 *UnityEngine.Random.value + (float)0.05 *(float)s;
        //float s1 = UnityEngine.Random.value;
        return s1;
    }
    IEnumerator UpdateTerrainCoroutine()
    {
        var heights = new float[terrainData.heightmapWidth, terrainData.heightmapHeight];
        while (true)
        { 
            renderArea *= 0.98;
            var startX = baseX - renderArea / 2.0;
            var startY = baseY - renderArea / 2.0;
            var renderAreaPerWidth = renderArea / terrainData.heightmapWidth;
            var renderAreaPerHeight = renderArea / terrainData.heightmapHeight;
            for (int x = 0; x < terrainData.heightmapWidth; x++)
            {
                for (int y = 0; y < terrainData.heightmapHeight; y++)
                {
                    heights[x, y] = Calculate(
                        startX + x * renderAreaPerWidth,
                        startY + y * renderAreaPerHeight);
                    heights[x, y] = heights[x, y]/ 2;
                }
            }
            terrainData.SetHeights(0, 0, heights);
            yield return null;
        }
    }
}
```
思惑では延々波が続くはずですが、一定の時間で波の周期が長くなってしまいます。
※X,Yをどこかで初期化したい、whileを工夫すればだけど今日はそこまでいきませんでした
まずは、float s1 = UnityEngine.Random.value;の方で動かすと乱数で埋めつくせます。
どんな感じかというと、Terrainの描画高さを２とかにすると、これが案外波っぽい。。。

![ransuu.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/413be9d9-86d3-44ac-55c1-613be5866107.jpeg)
これ近くで見るとやはり乱数というか細かい凸凹なんだけど、Unityが適当に平均化してこう見せてくれるんですね。
![ransuu2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/d35e92d1-10e6-3348-a595-e8a288def30b.jpeg)
###（２）三角関数＋乱数でやってみる
そして本命の三角関数。。これ実は最初は矩形にしか出なくて苦労しました。
ということで、

```cs
float s1 = 1 + (float)0.05 *UnityEngine.Random.value + (float)0.05 *(float)s;
```
で解決しました。
![sain.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/86901922-38fe-344b-b933-0e58887e50c2.jpeg)
。。。あまり変わらないけど、以下動作中
![wave.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/ed10d508-e54d-226a-4f93-32b0edaed537.jpeg)
そしてだんだん周期が長くなる。。。これくらいが続いてほしいけど。。
![sain2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/7d5bd718-2a3d-3659-a0b9-c278bc4c9c1d.jpeg)
###（３）OculusGoで見る
早速、。。こんな感じです。
一応、[前回のFirstPersonController](https://qiita.com/MuAuan/items/46fa8e2a94734fc50e76)を使っているので回せます。

[【Unity】波のイメージを作ってみる♪](https://youtu.be/FN539QqrDQE)
<a href="http://www.youtube.com/watch?feature=player_embedded&v=FN539QqrDQE" target="_blank"><img src="http://img.youtube.com/vi/FN539QqrDQE/0.jpg" 
 </a>
※画像をクリックするとYouTube動画につながります
###まとめ
・Terrainで波イメージで動く海を作成した
・Startで同じことをやると、乱数の大地や波（乱数込み）の大地の作成ができる
　これを時間とともに動かすのもいいかもね

・今のコードだとだんだん周期が長くなりやがて乱数のみになってしまう
・大地に対しては適当にいろいろな処理をすればいろいろ出来そうである
・国土地理院の地図は今のところ針の山しか出来ていない
　※ただし、いろいろなBMP画像で大地を作成できるので楽しい
　　OculusGoでは、作成後毎回Jsを削除する必要がある
###おまけ
とある画像の大地。。こちらが綺麗だったらこちらの記事を書くつもりでしたが、。。
![とある大地.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/4e5d799e-dbdb-4463-e6a5-3c0cf1ccb546.jpeg)