今話題のチャットAIで惑星を生成させてみた話

最近というかなんというか、少し前からAI界隈がにぎわっていて、画像や動画、さらには会話やプログラム作成の手伝いまでAIが行ってくれるようになった。

中でも「chatGTP」は最新版の「GTP-4」になるとより正確な会話や画像、プログラム精製ができるという…

以前「ジェダイ:フォールンオーダー」についてのレビュー記事を書いてもらったところ、

まさかの主役を「カイロ・レン」に乗っ取られた怪しいレビュー?が出てきたので「これはしばらく様子見だな…」と思って放置していた。

しかし上記の「惑星の生成」記事作成中に「プログラムの作成もできる」と聞いて、「もしかしたら新しい惑星をAI君が作ってくれる?」と考えていたのだが、記事にもある通り手動でクラッシュの連続だったのであまり乗り気ではなかった…

…が、とりあえずchatGTP君にタグを教えて惑星を1つ精製させてみたらそれっぽいコードが出てきたので「planetDefs.xml」内に追加、セーブデータもクラッシュせずに読み込まれていたのでまさかと思い「ワープコントローラー」を見ると…

なんかできちゃった…

というわけで前置きが長くなったが、今回は「chatGTP」の登録方法と惑星の生成手順を紹介していきたい。

chatGTPのアカウントを作る

まずはchatGTPのホームページにアクセスして、アカウントを持っていない場合は「Sign up」持っている場合は「Log in」をクリック、

アカウントを持っていない場合でも「Googleアカウント」や「Microsoftアカウント」を持っていれば、それに紐付ける形でアカウントを作成できるので、その場合は下のボタンをクリック。

無事アカウントの作成が完了してログインすると「chatGTP」のメイン画面に移る。

左の黒いバー内には今まで行った会話のリストがあり、新しく会話を始める場合は一番上の「+New chat」をクリックする。

chatGTPと対話する

というわけでここで「chatGTP」とやり取りしていくのだが、どうすればいいのかさっぱりわからなかったので「餅は餅屋」chatGTP君本人に聞いてみた。

スクショだとわかりずらいので以下書き出し、

自分:ここでプログラムを組むための方法を教えて

chatGTP:プログラムを組むための方法は、一般的に次のステップに沿って進めます。

  1. 問題を理解する:プログラムで解決したい問題を明確にし、必要に応じて詳細を調べます。
  2. 計画を立てる:問題を解決するための計画を立てます。これには、プログラムの構造、使用するデータ構造、アルゴリズムの選択などが含まれます。
  3. コードを書く:計画に基づいて、実際のコードを書き始めます。この段階では、必要に応じてコメントを入れたり、コードを整理したりすることができます。
  4. テストする:書いたコードをテストし、問題がないことを確認します。テストには、入力値を変えたり、エラー処理を含めたりすることが含まれます。
  5. デバッグする:テスト中に発見したバグを修正し、プログラムが期待どおりに動作するようにします。
  6. 繰り返す:必要に応じて、ステップ2から5を繰り返し、プログラムを改善します。

プログラムを書く際には、プログラミング言語を選択し、プログラミングの基本的な概念を学ぶことが必要です。また、コンピュータサイエンスの基礎知識、アルゴリズムの理解、データ構造の知識も役立ちます。さらに、オンラインのプログラミングコミュニティやチュートリアル、教科書などの資料を利用することもおすすめです。

ふむ…一口にプログラムといっても色々あるからな…

自分:xmlを作成したい

chatGTP:XML(Extensible Markup Language)を作成するには、テキストエディタやXMLエディタを使用して手動でXMLファイルを作成することができます。以下は、基本的なXML文書の構造です。

xmlCopy code<?xml version="1.0" encoding="UTF-8"?>
<ルート要素名>
  <子要素名1>子要素の値</子要素名1>
  <子要素名2>子要素の値</子要素名2>
  ...
</ルート要素名>

この構造に従って、次の手順でXMLファイルを作成することができます。

  1. テキストエディタを開き、新しいテキストファイルを作成します。
  2. 最初の行に、XML文書のバージョンとエンコーディングを指定する宣言を追加します。xmlCopy code<?xml version="1.0" encoding="UTF-8"?> ※バージョンやエンコーディングを変更する場合は、上記の例を適宜修正してください。
  3. 次に、ルート要素を追加します。これは、XML文書の最上位にある要素であり、他の要素を含んでいます。ルート要素は、開始タグと終了タグで囲まれた要素名で定義されます。たとえば、以下の例では、ルート要素の要素名が「students」となっています。phpCopy code<students> </students>
  4. ルート要素の内部に、必要な数の子要素を追加します。これらの子要素も、開始タグと終了タグで囲まれた要素名で定義されます。たとえば、以下の例では、2つの子要素「student」と「teacher」を追加しています。phpCopy code<students> <student> <name>John Smith</name> <age>20</age> </student> <teacher> <name>Jane Doe</name> <subject>Mathematics</subject> </teacher> </students>
  5. 保存して、ファイル名を拡張子「.xml」で保存します。これで、XMLファイルが作成されました。

注意点としては、XMLは文法が厳密であるため、タグの開始と終了を正しく対応させる必要があります。また、属性を持つ要素を定義する場合は、属性を追加する必要があります。属性は、開始タグの中に記述され、属性名と属性値を持ちます。

以上が、基本的なXMLファイルの作成方法です。詳細については、XMLの仕様書やチュートリアルを参照することをおすすめします。

…うん、それはわかってるんだ、そうじゃなくて…

自分:chatGPT でxmlを作りたい

chatGTP:ChatGPT自体は、XMLファイルを作成することはできませんが、プログラムを使用して自動的にXMLファイルを生成することができます。

以下は、Pythonを使用してXMLファイルを作成する方法の例です。

pythonCopy codeimport xml.etree.ElementTree as ET

# ルート要素を定義する
root = ET.Element("students")

# 子要素を定義する
student1 = ET.SubElement(root, "student")
name1 = ET.SubElement(student1, "name")
name1.text = "John Smith"
age1 = ET.SubElement(student1, "age")
age1.text = "20"

student2 = ET.SubElement(root, "student")
name2 = ET.SubElement(student2, "name")
name2.text = "Jane Doe"
age2 = ET.SubElement(student2, "age")
age2.text = "22"

# XMLファイルを作成する
tree = ET.ElementTree(root)
tree.write("students.xml", encoding="UTF-8", xml_declaration=True)

上記のコードでは、xml.etree.ElementTreeモジュールを使用してXMLファイルを作成しています。まず、ルート要素を定義し、それに子要素を追加します。子要素には、テキストを持つ要素(name, age)を作成しています。最後に、XMLファイルを書き出して保存しています。

この例では、students.xmlというファイル名でXMLファイルを保存しています。必要に応じて、ファイル名やエンコーディングを変更してください。

うーん…アプローチの仕方がおかしいのかな?てかそもそもタグの名称とかが独自だからまず…

自分:君にXML用の要素の内容を覚えてもらいたい

chatGTP:はい、覚えておきます。以下は、XML用の要素とその内容の一例です。

  • <element>: 要素を定義するタグ
  • <attribute name="value">: 要素に属性を追加するタグ。nameは属性名、valueは属性の値。
  • <text>Some text</text>: 要素にテキストを追加するタグ。Some textはテキストの内容。
  • <comment>Comment text</comment>: コメントを追加するタグ。Comment textはコメントの内容。
  • <cdata>CDATA text</cdata>: CDATA(Character Data)を追加するタグ。CDATA textはCDATEの内容。
  • <processing-instruction target="value">: 処理命令を追加するタグ。targetは処理命令の対象、valueは処理命令の値。

XMLはタグによって構造化されたテキストファイルであり、各要素にはタグ、属性、テキストなどが含まれます。上記の要素を使って、より複雑なXML文書を作成することができます。

お!好感触、ならここに要素を覚えさせていけば…

自分:<galaxy>: 要素を定義するタグ

chatGTP:はい、<galaxy>はXML文書において要素を定義するタグの一例です。このタグを使用して、XML文書内で”galaxy”という要素を定義することができます。

以下は、<galaxy>タグを使用した例です。

phpCopy code<galaxy>
  <name>Milky Way</name>
  <type>Spiral</type>
  <size>100,000 light-years</size>
  <age>13.2 billion years</age>
</galaxy>

この例では、<galaxy>タグによって、”Milky Way”という銀河を定義しています。<name>、<type>、<size>、<age>というタグが、各々銀河の名前、種類、大きさ、年齢を表しています。

このように、XML文書を作成する際には、<galaxy>のようなタグを使用して要素を定義し、各要素に必要な情報を含めることで、構造化されたデータを表現することができます。

うーん、これだと少し違うな…タグの例を入力してみるか、

自分:<star name=”Sol” temp=”100″ x=”0″ y=”0″ numPlanets=”10″ numGasGiants=”1″ blackHole=”true”>

chatGTP:<star>タグには、name、temp、x、y、numPlanets、numGasGiants、blackHoleという属性が含まれています。これらの属性は、<star>タグで定義される星に関する情報を表しています。

  • name属性は、星の名前を表します。
  • temp属性は、星の表面温度を表します。
  • x、y属性は、星の位置を表します。
  • numPlanets属性は、星の周りを公転している惑星の数を表します。
  • numGasGiants属性は、星の周りを公転しているガス惑星の数を表します。
  • blackHole属性は、星がブラックホールであるかどうかを表します。

以下は、<star>タグを使用した例です。

phpCopy code<star name="Sol" temp="5778" x="0" y="0" numPlanets="8" numGasGiants="2" blackHole="false">
  <planet name="Mercury" type="Rocky" distance="0.39 AU" numMoons="0" />
  <planet name="Venus" type="Rocky" distance="0.72 AU" numMoons="0" />
  <planet name="Earth" type="Rocky" distance="1 AU" numMoons="1" />
  <planet name="Mars" type="Rocky" distance="1.52 AU" numMoons="2" />
  <planet name="Jupiter" type="Gas Giant" distance="5.2 AU" numMoons="79" />
  <planet name="Saturn" type="Gas Giant" distance="9.58 AU" numMoons="82" />
  <planet name="Uranus" type="Ice Giant" distance="19.18 AU" numMoons="27" />
  <planet name="Neptune" type="Ice Giant" distance="30.07 AU" numMoons="14" />
</star>

この例では、<star>タグによって、”Sol”という星を定義しています。また、<planet>タグを使用して、”Sol”の周りを公転している惑星に関する情報を含めています。各々の<planet>タグには、name、type、distance、numMoonsという属性が含まれています。このように、XML文書を作成する際には、属性を含めることで、より詳細な情報を表現することができます。

おー!!大分いい感じ!それじゃあ「planet name」のタグを入力してみたらどう反応するかな?

自分:<planet name=”Planet A”> <fogColor>1,1,1</fogColor> <skyColor>0,0,1</skyColor> <atmosphereDensity>100</atmosphereDensity> <gravitationalMultiplier>100</gravitationalMultiplier> <orbitalDistance>1000</orbitalDistance> <orbitalTheta>180</orbitalTheta> <rotationalPeriod>24000</rotationalPeriod> <biomeIds>0</biomeIds> <planet name=”Planet A moon”> <fogColor>1,1,1</fogColor> <skyColor>1,0.5,0.5</skyColor> <atmosphereDensity>180</atmosphereDensity> <gravitationalMultiplier>100</gravitationalMultiplier> <orbitalDistance>150</orbitalDistance> <orbitalTheta>190</orbitalTheta> <rotationalPeriod>100</rotationalPeriod> <biomeIds>94</biomeIds> </planet>

chatGTP:このXMLコードは、2つの<planet>要素を含んでいます。最初の<planet>要素は、”Planet A”という名前の惑星に関する情報を表しています。各属性には、fogColor、skyColor、atmosphereDensity、gravitationalMultiplier、orbitalDistance、orbitalTheta、rotationalPeriod、biomeIdsが含まれています。これらの属性は、”Planet A”の異なる側面に関する情報を表しています。

  • fogColor属性は、惑星の霧の色を表します。
  • skyColor属性は、惑星の空の色を表します。
  • atmosphereDensity属性は、惑星の大気密度を表します。
  • gravitationalMultiplier属性は、惑星の重力を表します。
  • orbitalDistance属性は、惑星がその星の周りを公転する軌道の距離を表します。
  • orbitalTheta属性は、惑星がその星の周りを公転する軌道の角度を表します。
  • rotationalPeriod属性は、惑星の自転周期を表します。
  • biomeIds属性は、惑星の特定の生物群集のIDを表します。

2番目の<planet>要素は、”Planet A moon”という名前の衛星に関する情報を表しています。この要素にも、先ほどと同じ属性が含まれていますが、それらは衛星の異なる側面に関する情報を表しています。また、この要素は、先ほどの<planet>要素の内部にあり、”Planet A”の衛星であることを示すために、<planet>要素の内部で再帰的に定義されています。

全部のタグの内容を理解している!?そしたら直接聞いたら早いのでは?

自分:Advanced RocketryのplanetDefsファイルを作りたい、ブラックホール有のダイヤモンドブロックで構成されて月が1つの2連星

chatGTP:Advanced RocketryのplanetDefsファイルを作成する場合は、以下の手順に従うことができます。

  1. ファイルを作成する まず、テキストエディターを使用して新しいファイルを作成します。ファイル名は”planetDefs.xml”とし、保存先はAdvanced Rocketryのconfig/advancedRocketry/フォルダー内に保存します。
  2. ファイルの開始タグを追加する 次に、以下のコードをファイルに追加します。これにより、ファイルの開始タグが追加されます。
xmlCopy code<?xml version="1.0" encoding="UTF-8"?>
<planetDefs>
  1. 惑星の定義を追加する 次に、ダイヤモンドブロックで構成されたブラックホールを中心に、1つの月を持つ2連星系の惑星を定義するために、以下のコードを追加します。
phpCopy code   
   <planet name="DiamondBlackHolePlanet">
        <parentPlanet>DiamondBlackHoleStar</parentPlanet>
        <gasGiant>false</gasGiant>
        <atmosphereDensity>0</atmosphereDensity>
        <gravitationalMultiplier>4</gravitationalMultiplier>
        <orbitalDistance>160</orbitalDistance>
        <orbitalTheta>155</orbitalTheta>
        <rotationalPeriod>48000</rotationalPeriod>
        <seaLevel>120</seaLevel>
        <biomeIds>0,1,2</biomeIds>
        <oreGen>
            <block name="diamond_block" weight="2" minY="0" maxY="20"/>
        </oreGen>
        <ringComposition>
            <block name="diamond_block" weight="50"/>
            <block name="iron_block" weight="30"/>
            <block name="gold_block" weight="20"/>
        </ringComposition>
        <specialBlock>
            <block name="diamond_block"/>
        </specialBlock>
        <starId>DiamondBlackHoleStar</starId>
    </planet>

これにより、DiamondBlackHolePlanetという名前の惑星が作成されます。この惑星は、DiamondBlackHoleStarという名前の星の周りを公転します。この惑星は、ガス惑星ではなく、大気密度はゼロで、重力は4倍です。また、この惑星は、DiamondBlackHoleStarから160の軌道距離に位置し、155度の角度で公転します。惑星は、48,000の自転周期を持ち、海抜は120です。惑星には、0、1、2のバイオームがあり、鉱石生成にはダイヤモンドブロックが使われます。また、惑星にはダイヤモンドブロック、鉄ブロック、金ブロックで構成されたリングがあり、特別ブロックとしてダイヤモンドブ(ここで内容が途切れている)

…なんかできた!

というわけで「planetDefs.xml」に追加記述して探索してみる

そして冒頭の通りに惑星が無事追加されたので、早速行って探索してみる、

DiamondBlackHolePlanet

見た目は月面のように真っ白、とりあえずロケットで地上に降りてみる…

海面

…とまさかの海!しかも深い…

よくよくchatGTPを見返すと海面の高さのタグ「sealevel」が120に…

とりあえず「宇宙ステーション」に戻りタイトルに、「sealevel」タグをいじって海面の高さを低くする。

60ぐらいにして再びロード、地上に降りてみる。

海面高度降下

ついでにウェイポイントを設定・表示されるMOD「Xaero’s Minimap」を導入して探索したら上記の画像のようになっていた、

…どうやら海洋バイオームだったらしい、これ海面数値そのままだったら海の中に森が生えてるシュールな光景だったのでは?

ちなみに「chatGTP」では「重力が4倍」と解説されていたので、ジャンプしても飛べないのかと思ったらどうやら「ー4倍」のようでめっちゃふわふわなジャンプになった。

採掘結果

ちなみに地下を軽く掘り進めても、「ダイヤモンドブロック」は発見できなかった…

結論:思い通りの惑星を作ることは難しいが、既存の発想にとらわれない面白い惑星を探索できる

というかよくよくchatGTPにオーダーした内容を確認してみると2連星になってないし、惑星内に月も確認できない…

おそらくもっと細かくタグの意味を学習させると、自由自在に希望の惑星のコードを出力してくれると思われるが、これはこれで「常識にとらわれない未知の惑星」を探索しているようでとても味わい深くなっている。

今回作成した惑星に限っても、

  • ロケット周りの水抜きor水中拠点の作成
  • 水中森林の探索
  • ランダム精製された独創的なオブジェクトの発見

と、楽しめる要素は多い、

構造物

太陽が遠く常に暗い惑星のため見え辛いが海中に謎のオブジェクトが浮いている。

こういった機械に任せた「常識にとらわれず作成された星」を探索して、開拓していくのもまた宇宙開発の醍醐味かもしれない。

コメント

タイトルとURLをコピーしました