POLICYCONTACT3Dの自動地形生成をやってみました!こんにちは。開発担当のマットです。Generation)とは、世界を作ってくれるプログラムです。Generation)の一種です。簡単に説明すると、コンピュータの乱数生成の特徴を活用して世界を作り出します。乱数生成と「シード」コンピュータというものは、とても予想しやすいものです。決まっているルールに従って、予期不可能なことを一切やりません。コンピュータのファンクション(処理手順)に同じ値を入力すると、毎回出力される結果は必ず同じです。時々、コンピューターに乱数を決めてもらいたい場合があります。サイコロのプログラムを作ろうと思えば、毎回同じ結果だと困りますよね。そのため、乱数を生成するファンクションを呼び出す度に、入力値を変更しなければなりません。多くの乱数ファンクションはコンピューターの機内時計を入力値として使います。時計を使うと、ファンクションの呼び出し時間によって、返ってくる結果が異なりますので、サイコロのプログラム等に乱数を生成することができます。この乱数ファンクションの「入力値」を「シード」(Seed[種])といいます。パーリン・ノイズパーリン・ノイズとはゲーム業界でよく活用されている「ノイズ生成アルゴリズム」です。「ノイズ」とは「雑音」ですが、パーリン・ノイズは「波」のような2D雑音マップを生成してくれます。Perlin氏というコンピュータ科学教授が1983年に開発し、それから、多くのプログラムに使われているノイズ生成機能です。いくつかの引数(ファンクションの設定値)を設定することができ、変更することによって、波の形が変わります。ものすごい雑なノイズを作ることもできますし、なめらかな波のようなノイズも作ることができます。引数を変更すると、波の特徴が変わります。パーリン・ノイズのファンクションに与えるシードを変更することによって、「同様ながら違う」結果が返って来ます。シードを変更すると、波の位置が変わります。パーリン・ノイズを活用して、白いエリアを「高い高度」と解釈し、黒いエリアを「低い高度」と解釈すると、3Dマップを作ることができます。複数のノイズを重ねる事によって、より面白いものを作る事ができます。世界づくり(デザイン)まずは、どのような世界をつくりたいかを決める必要があります。個人的な好みで中心が山となっている島を作ろうと思いましたが、それをどうやって作るかを決めなければなりませんでした。要素まずは、全体的にちょっとなめらかな地形がほしかったので、「Base」という優しいノイズを入れました。次に中心となる山の形となる「Mountain」のノイズも必要だったので、それもデザインに入れて、最後に海岸の形を決める「Edge」も入れることにしました。島づくりに使う3つのノイズマップしかし、この3つのノイズ要素を単純に足すだけだと島にはなりませんので、最終的の地形計算を行うとき、ちょっと特別な処理を行わなければなりません。Baseノイズをマップ全体に適応して、地形をなめらかな形にしてくれます。Mountainに関しては、以下のルールを加えました。「マップの中心に近いほど、マップに影響を及ぼす。」つまり、マップの中心にMountainノイズが地形の高度に影響を及ぼしますので、島の真ん中に山が生成されますが、中心から離れているところでは高い山が生成されません。Edgeに関しては、以下のルールを加えました。「マップの限界に近い程、逆影響を及ぼす。限界に近くない場合、影響を及ぼさない。「逆効果」とは「高度を下げる」とのことなので、マップの限界近くのエリアの高度が低くなります。海を適切な高度に設置すると、島の形になります!世界づくり(実装)最近個人的にUnityでプログラミングをやっていますが、Unityは3Dゲームエンジンでとても使いやすいと思います。今回は地形を作りたいので、Unityでゲームシーンを作って、Terrain(地形)とWater(水)オブジェクトを入れて、Waterの高度を10メートルに設定しました。すると、Terrainの高度が10mを超えていない箇所が海に浸かります。上記の画像を見るとわかるかと思いますが、右側の設定画面でSeed(シード)を「12345」と設定しています。そのシードでマップを生成すると、パーリン・ノイズの乱数生成に使われますので、毎回必ず同じ形の島が生成されます。シードを少しでも変更すると、全く違う島が出来上がります。シードを少しでも変更すると、全く違う島が生成されます。世界づくり(森も入れましょう!)島づくりはなんとなくできましたが、ちょっと寂しいので森も生成しようと思いました。地形と同じ原理で、パーリン・ノイズで木が生える場所を決めるのがいいです。パーリン・ノイズ・マップを使って、ある閾値より白いところに木を生やす、という仕様を決めました。単独に立つといい樹種は、ザラザラな雑音系のノイズ・マップを生成し、森のように、「群れる」木がいい場合は、なめらかな波を作るようノイズの引数を設定します。Unityはデフォルトで、3種類の木を用意してくれるので、それぞれの樹種にノイズ・マップを用意する必要があります。それぞれの樹種に生える箇所の条件も加えてみました。ヤシの木:高度が低い(海に近い)ところのみ。松の木:高度が高くて、傾斜がきついところのみ。楠の木:中間の高度なところのみ。これらのルールで島を生成すると、より良い島が出来上がりました。森も生成した「12346」の島。探検しましょう〜Unityで簡単にファースト・パーソン・キャラクターを導入できますので、作り上げた島にキャラクターを入れて、島を走り回って楽しむことができました!寂しくなくなった世界まとめ「手続き型の生成」はとても有力なツールだと思います。ゲームやシミュレーションに使うことができ、無限コンテンツを生成することができるので、オープン・ワールド系のプログラムに向いていると思います。今回は地形の高度と樹木の配置に使いましたが、それ以外の使い道もたくさんありますので、今後色んなことに使ってみたいと思います。usコンサルティング・Webサービス開発を得意とします。コミュニケーションのあたらしいカタチを創造します。