No Man's Sky (ノーマンズスカイ) 日本語Wiki
Advertisement

本作の大きな特徴であるプロシージャル生成(Procedural generation)について。


概要[]

本作の宇宙は1800京という膨大な惑星を持っていることになっている。しかしそのデータを全てプログラムファイル内に持つなら、例えば1惑星あたり1byteだけのデータだったとしても1800京バイト(18エクサバイト)が必要になってしまう。世界最大級のGoogleのデータセンター[1]ならともかく、個人で扱う規模では無い。

本作はもともとはソロのゲームでネット接続が無くても遊べる。つまりサーバからダウンロードしているわけでもない。ではそのデータはどこからくるのだろうか。

この膨大な宇宙について具体的なデータは事前に用意してないというのが答えだ。それはアルゴリズムによって自動生成されるものだ。現在の多くのゲームも部分的にこの自動生成が用いられている。しかし本作のように宇宙全体を自動生成で作り出すというゲームは他では見られないものになっている。

本作の自動生成はランダムにその場限りのものを作り出すのではなく、同じ場所に行けば常に同じものがある。これが手続き型生成やプロシージャル生成と呼ばれる技術だ。例えば同じ方程式に同じパラメータを与えれば、いつも同じ答えが返ってくるように、数学的なアルゴリズムを利用すればデータを用意しなくてもどこまでも広がる世界の存在を確定させることができるのだ。本ページではもう少し突っ込んで解説したい。

  1. Googleのデータセンターの総ストレージサイズは公表されていないが10エクサバイトに達するという試算がある。これはとんでもないサイズだ。2020年のHDDとSSDの出荷総容量は1,212エクサバイトという、その十分の一というのは企業であっても容易には持てない。つまり18エクサバイトを個人で所有など論外であることは明らかだろう。しかも惑星のデータが1byteというのはあくまでも仮定の話だ。名称・座標・バイオーム・地形・生物・植物…と本来1byteで済むはずがない。

考え方[]

アルゴリズムでデータを生成すると言ってもなかなか想像がつかないかもしれない。例を交えて段階を追って説明する。

乱数生成器[]

簡単な数当てゲームについて考えてみたい。コンピュータがなにか値を決めて出題し、人間がそれを当てるというものだ。コンピュータがいつも同じ値を出題するとゲームにならないので、何かの方法で毎回違う値を出題する仕組みが必要だ。さらに前回の値と次の値にも法則性が無いものが必要だ。例えば1の次は2、2の次は3と決まっていればやはり純粋な数当てゲームにならない。法則性のない乱雑な数列、つまり乱数列を発生させる仕組みが必要だ。これを「乱数生成器」という。

シード値[]

本当に法則性のない乱数列というのはプログラムでは作れない。単に複雑なだけで疑似的なものというのが実態だ。そんなわけで乱数生成器は放っておけば同じ数列を出力する。これでは意味がないので乱数生成器には数列に変化を与える「シード値」という入力値を与えられるようになっている。乱数生成器は与えられたシード値を元に全く異なった数列を出力できる。
本作はもう一歩踏み込んで、シード値をデータ生成のキーとして扱っている。その詳細は以降を読んで欲しい。

乱数調整と自動生成[]

話は戻るが数当てゲームはゲーム起動からの秒数をカウントしてそれをシード値として乱数を発生させることにした。すると意地悪なプレイヤーはゲーム起動からの秒数を数えてからゲームを開始するかもしれない。
これは俗にいう「乱数調整」というシード値を固定させるテクニック。乱数生成器はシード値が同じならば毎回同じ数列を出力する。つまり同じ出題になる。全問正解は容易いだろう…。
シード値と出題の関係を今一度考えてみよう。例えば20問出題するとしてシード値が確定すると対応する20問の問題が生成できる。シード値が同じならどこで動かしても同じ出題が出てくる。その気になれば何問でも出題できる。生成した数列をどう使うかはプログラム次第だ。同じプログラムである限り、同じ使い方をして同じように動くはずだ。
シード値はデータ生成のキーデータとしてみることができる。これが本作のデータ生成の根本の考え方だ。

本作の基本的な仕組み[]

先ほどのシード値をキーとしたデータ生成を本作がどう使っているのか考察しよう。
本作の宇宙は一つの銀河内となっている。銀河の中には膨大な恒星がそれぞれ星系を成している。星系には惑星があり、惑星上には動物がいて岩石や植物がある。これをトップダウンに生成する。
生成の起点になる銀河のシード値は人間が決める。そして銀河の星々つまり星系[1]を生成するために、銀河のシード値を乱数生成器に与えて乱数列を生成する。生成された数列は星系のシード値の列挙として扱う。
星系のシード値の各桁は星系の位置や星系のパラメータ[2]に対応しているとする。そうやって生成した星系群を表示するとギャラクシーマップに夜空のような星々が広がるはずだ。
星系の中の惑星は星系のシード値を元に生成する。それは惑星のシード値の列挙だ。惑星のシード値からその惑星の生物も岩や植物もシード値として生成する。シード値の各桁からどのような特性を持つのかも決定できる。
同じシード値から作られた惑星上の同じ位置に二人のプレイヤーが降り立った時、双方が見る光景は同じものになるはずだ。同じ場所には同じ植物があり、同じ動物が群れている。乱数列からできていても決してその場限りのものではなく、惑星を一周して同じ地点に戻ってくれば同じ光景が待っている。
本作は無数の惑星があり、いつでも戻ってくることができる。それはまるでゲーム内にそれら無数の惑星データが保持されているように見えるがそうではない。その場で毎回新たに自動生成されているのだ。最初の銀河のシード値からその銀河のすべてを生成する。それが本作の基本的な仕組みだ。
  1. 我々が夜空に見上げる星々は惑星ではなく恒星だ。恒星は星系をなしている。つまり恒星の周りを惑星がまわっている。惑星は自ら発光していないので同じ太陽系の惑星以外はまず見ることはできない。
  2. ギャラクシーマップで見られる情報のほとんどはシード値自体から判明できるようにしているはずだ。シード値のどの部分が何に対応しているかは単に決めの問題だ。XYZの三次元座標、星系のスペクトル、惑星をいくつ持っているのか、惑星の構成(水を持つ惑星があるかも含まれる)、主要な種族、紛争・経済…

開発者の発言[]

「宇宙は一人のプログラマーの電話番号を種(シード)にして始まります。一連のカスケードされた数学的なアルゴリズム (疑似乱数発生器) によって、その数字から多くのシードを生み出します。シードは各ゲーム要素の特性を決定します。生成される数字は一見ランダムに見えますが機械には真のランダム性はありません。人間の頭が生成プロセスの難解さを理解できないだけです。

物理学者は私たちの宇宙が決定論的なのかランダムなのかについていまだに議論しています。一部の科学者は量子力学にはほぼ確実に不確定性が含まれると信じていますが、アルバート・アインシュタインは「神はサイコロを振らない」と言って反対の立場を支持したことで有名です。No Man's Skyもサイコロを振りません。最初のシード番号がプログラム内の空白に入力されると宇宙は不変に確立されます—すべての星、惑星、生物。過去、現在、未来は永久に固定されており、システムへの変更は、システム自体の外部の力つまりプレイヤーによってのみ可能なのです。

ゲームは手続き型の設計なので、作成された瞬間に宇宙全体も存在するようになったともいえますが、別の意味ではゲームはプレイヤーのすぐ近くの環境をレンダリングするだけなので、それを目撃する人間がそこにいなければ何も存在しないとも言えます。 」

―Sean Murray (The Atlantic 2016-02-19)

星系を生成するための仕組みの考察[]

銀河のシード値をただ乱数生成器に与えるだけなら、その銀河を表示できるのは、全ての星系を生成した後になってしまう。これでは時間がかかりすぎてゲームにならない。実際はもっと軽い処理になっていると考えられる。

銀河は領域で区切られている[]

銀河#銀河の基本構造を参照してほしい。「銀河の内部は30~40億の領域に分けられ、1領域のサイズは一辺400光年の立方体。その中に何百もの星系が含まれている。」これがヒントだ。
実際に乱数生成器に渡すシード値は銀河のシード値とこの領域の存在する座標を組み合わせたものだろう。そうすれば1領域当たり数百程度の星系のシード値を生成するだけで済む。

ギャラクシーマップのリアルタイム表示の考察[]

ギャラクシーマップは無限に遠くまでの星系が見えているのではなく400~600光年程度しか見えていない。つまり自分がいる領域とその周りの領域[1]を生成すれば表示できるということになる。処理量は銀河全体を処理することと比べれば数億分の1に軽減されたはずだ。
「ゲームはプレイヤーのすぐ近くの環境をレンダリングするだけ」という発言はこのことを意味しているはずだ。
v3.50 Prismsで仕様変更されて夜空が満天の綺麗な書き割りの星空となったが、以前はギャラクシーマップと一致した星空が表示されていた。惑星で過ごしているときに見える夜空、惑星間を飛行しているときに見える宇宙の星々はギャラクシーマップと一致しており、それらはすべて到達可能だというロマンに満ちた仕様になっていた。
  1. 立体なので2x2x2=8領域か?3x3x3=27領域か?

プロシージャル生成を活用しようとした理由[]

「少数開発チームだからこそ、Naughty DogやBioWareでは利用しないであろうプロシージャル技法を使ったが、実はこれまでの開発者人生でもっとも複雑で膨大な仕事量だった」
―Grant Duncan(Hello Games シニアアーティスト) (4Gamer.net 2015-03-07)

プロシージャル生成を利用した背景には省力化の考えがあったようだ。本来、膨大な人的リソースを用いて作り出すオープンワールドのゲームは少人数のインディーズの開発会社では真似ができるものではない。

ただし、ゲームの舞台が無数の組み合わせで作られる場合、そこには無数のテストケースがあると考えられるので、本当に省力化になるのかは疑問がわく。逆を言えばどんなにマンパワーをかけようとすべてのケースのテストはできないのだから、開き直って少人数のチームでも良いとも言える。

本作がバグが多いゲームであることは本質的な問題のため、多少なりとも寛容な気持ちを持とう。大きな開発会社であればもっとテストされた状態でリリースできるだろうが、本質的にバグがなくなることはない。つまり本作のようなマンパワーが活かしにくいゲームは大きな開発会社から出ることはないだろう。

資料[]

以降は少々マニアックな情報を集めた。

L-system[]

本作は乱数生成器のアルゴリズムにL-systemWikipedia favicon(リンデンマイヤーシステム)を用いている。乱数生成器は文字通り乱雑な数列を作り出すものだが、ゲーム内の様々な意味あるものを生成するのにただ乱雑な数値で良いはずがない。Hello Gamesはゲームとして使えるアルゴリズムを探すのにかなり時間をかけたようだ。
L-systemはハンガリーの生物学者アリステッド・リンデンマイヤー(Aristid LindenmayerWikipedia favicon)が発見したフラクタルと記号変換の組み合わせによるもので、植物の成長プロセスや様々な自然物の構造を記述・表現できるアルゴリズムだ。
本作はL-systemを用いて様々な形状や、惑星上のオブジェクトの配置などを決定している。例えば製造工場などの建物は追加の部屋があったりなかったり、どんな風に接続していくのかなど様々だ。これらもL-systemで決定している。本作の根幹となるシステムとなっている。

参考記事[]

2014年の4Gamerの記事に本作とL-systemについての記事がある。

ゲームとしての軽量化[]

本作はゲームとして動けるレベルに軽くするため、生物の姿をゼロから作り出すのではなく、元になる原型(アーキタイプ)をL-systemで組み合わせ・変形具合を決定するというブループリントシステムという独自ツールを使っているようだ。原型を用いているため本作の生成する生物や植物は、細かく見れば違っているけれど、よく似たものを頻繁に見かけるという状況になっているが、v3.0 Origins以降はバリエーションが増えてかなり雰囲気が良くなった。

スーパーフォーミュラ[]

簡単に地形や生物や植物などの形状を自動生成する数式が存在する。それがベルギーの生物学者ヨハン・ゲリス(Johan Gielis)が2000年ごろに発見したスーパーフォーミュラ(SuperformulaWikipedia favicon)だ。[1]
尚、本作はもともと採用していないとされている。

特許問題[]

ゲリスはスーパーフォーミュラを利用するアプリケーションについて特許[2]を取っており、本作発売直前にスーパーフォーミュラを利用していると思われるのにライセンスが未取得だと大々的に発言した。本作開発段階のインタビューの中で開発者にしてHelloGamesの社長であるショーン・マレーがスーパーフォーミュラを試しているシーンがあったからだと思われる。これを受けたショーン・マレーは本作は利用していないと発言している。
このスーパーフォーミュラの特許だが2020年5月に期限切れとなった。これを受けて本作の2020年夏の大型アップデートにてスーパーフォーミュラが組み込まれるという噂があった。新たなエイリアン惑星が導入され地形生成も改善するという話で、実際にOriginsはそのようなアップデートだったが、スーパーフォーミュラが組み込まれたかどうかは明らかになっていない。
  1. 2013年より開催されている日本のカーレースのことではない。
  2. 数式そのものの特許を取ることなどまずできないが、それを利用するアプリケーションという特許ならば取ることが可能。

惑星の自動生成についての講演[]

Hello Gamesの元リードプログラマーであるイネス・マッケンドリック(Innes McKendrick[1]による講演の動画。開発者向けの技術的な講演。2017年の公演なのでv1.3 Atlas Rises時点の仕様について。
No_Man's_Skyにおける継続的な世界生成

No Man's Skyにおける継続的な世界生成

日本語に自動翻訳して見る場合の注意は「生成(Generation)」が「世代」と訳されること。No Man' Skyのタイトルが含まれる文は否定形になってしまうこと。
頻繁にボクセル[用語]という言葉が出てくるが、これは二次元画像における画素であるピクセル[用語]の立体版で、ブロック状の最小単位の体積を表す。プレイヤーがよく地形操作機で破壊しているのがボクセルだ。
球体でシミュレーションし、立体構造に保存する

球体でシミュレーションを実行し、データは立方体構造に保存する

このビデオで大きなトピックとしては、惑星上のデータは実は立方体の表面に配置して管理されており、座標変換の式を用いて惑星の球体表面にマッピングしているということだ。他の多くのオープンワールドのゲームではデザインを簡素化するために地面が巨大な球体の一部であることを排除しているが、本作は宇宙船で地表から飛び立ってシームレスに惑星を一周することができるゲームのため、球体である惑星の表面は正しく処理しなければならない。そこでこのようなデータ処理を行うことで管理を容易にしているようだ。
座標変換があるということは、球体の中心に近づくまたは外側に離れていくと、立方体との座標変換の誤差が大きくなっていくと考えられる。これが地形操作機で地下深く掘り進むのに制限が設けられている理由だろうし、基地を大気圏外まで高く作ることができない理由でもあるだろう。また惑星を完全に削って無くしてしまうということはできない。
地形の起伏

球体表面を歪めて大まかな地形を作り出す

地形操作機で地下深く掘り進むと破壊不能な地肌が現れるが、多くのケースで傾斜しているはずだ。それは球体を歪めることで山や谷の地形を表現しているからだ。こうすることでプレイヤーの活動領域を広げ、破壊可能なボクセルの数を減らしている。v1.3 Atlas Risesのころ大気圏の高さはわずかしかなかったため巨大な山があれば図のように上層も歪めないと飛行不能になる可能性があった。v1.5 Next以降は大気圏は高度約2000uまで広げられているので、上層の扱いは変わっているかもしれない。
このようにこのビデオには本作の処理のやり方が詳細に説明されている。他にも様々な情報があるので気になった人はぜひ見て欲しい。
  1. イネス・マッケンドリックはトランスジェンダーでヘーゼルと名乗ってゲームに登場したこともあるという。現在はHello Gamesを退職している。

そのほか[]

I Made A No Man’s Sky Clone In One Week! - YouTube
YouTube、英語。No Man's Skyっぽい惑星・星系・移動方法を1週間で作ってみた、という動画。おおまかな仕組み・考え方についてテンポよく俯瞰させてもらえる。
Advertisement