ランダムな3D小惑星を作成する


8

あなたが古典的なビデオゲームの小惑星の 3D適応に取り組んでいると想像してください。あなたの仕事は、ランダムな3D小惑星を作成できるアルゴリズムを書くことです。

これは人気のコンテストであり、コードゴルフではありません。素敵なコードを書いて興味深い結果を生み出してください。必要に応じて、その他のクールな機能を追加します。

ルール:

  • アルゴリズムは、外部ソースなどから単にロードするだけでなく、実際にモデルを作成する必要があります。
  • 結果は(疑似)ランダムでなければなりません。アルゴリズムを数回実行すると、異なる結果が生成される必要があります。
  • リアルタイム機能が望ましいですが、必須ではありません。
  • ポリゴン数が少ないですか、多いですか?現実的または定型化された?あなたが決める...
  • 出力は、メモリ内またはWavefront OBJなどのファイルとしてのメッシュである必要があります。どちらの場合も、何らかの方法でレンダリングする必要があります。
  • アルゴリズムを説明して、誰もがそれから学ぶことができるようにします。
  • 結果の画像をいくつか表示します。

回答:


25

ブレンダー+ Python

Blenderの組み込みのPythonスクリプトは、この種のことには最適です。

小惑星の回転のGIFアニメーション

Pythonコンソールを開き、以下を貼り付けます。

import bpy
import random

def asteroid():
    bpy.ops.mesh.primitive_ico_sphere_add()
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.faces_shade_smooth()
    bpy.ops.mesh.select_mode(type='VERT')
    bpy.ops.mesh.select_random()
    bpy.ops.transform.resize(value=(random.uniform(1.1,1.4),random.uniform(1.1,1.4),random.uniform(1.1,1.4)))
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.subdivide(smoothness=1)
    bpy.ops.mesh.select_random()
    bpy.ops.transform.resize(value=(random.uniform(1.05,1.15),random.uniform(1.05,1.15),random.uniform(1.05,1.15)))
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.subdivide(smoothness=1)
    bpy.ops.mesh.select_random()
    bpy.ops.transform.resize(value=(random.uniform(0.92,1.05),random.uniform(0.92,1.05),random.uniform(0.92,1.05)))
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.subdivide(smoothness=1)
    stretch = random.uniform(0.9,1.5)
    bpy.ops.transform.resize(value=(stretch,1,1))
    bpy.ops.transform.rotate(value=(random.uniform(-1.57,1.57)), axis=(random.uniform(-1.57,1.57),random.uniform(-1.57,1.57),random.uniform(-1.57,1.57)))
    bpy.ops.object.mode_set(mode='OBJECT')

asteroid()

次に、3Dカーソルの位置に小惑星が作成されます。

小惑星3Dモデルのワイヤーフレームレンダリング

別の小惑星が欲しいですか?3Dカーソルを別の場所に移動してから、asteroid()もう一度Pythonコンソールに入力します(またはEnter、最後に入力した行を繰り返すだけです)。

プラスチックの塊ではなく、宇宙の岩のように見えるようにするには、適切なマテリアルを適用する必要があります。次の手順資料は非常にうまく機能します。大理石のテクスチャで#635C5B、の拡散色を使用しました#8D887F

スペースロックマテリアルの設定

使い方:

  1. まず、単純な二十面体(bpy.ops.mesh.primitive_ico_sphere_add())を作成します。
  2. 編集モードに入り(bpy.ops.object.mode_set(mode='EDIT'))、スムーズシェーディングを適用して、個々のファセットが互いにブレンドされるようにします(bpy.ops.mesh.faces_shade_smooth())。
  3. オブジェクトの頂点のランダムなサブセットを選択します(bpy.ops.mesh.select_random())。
  4. X、Y、Z方向にランダムにスケーリングします(bpy.ops.transform.resize())。
  5. オブジェクト全体を選択し(bpy.ops.mesh.select_all(action='SELECT'))、滑らかなサブディビジョンを適用して、変形したオブジェクト全体を滑らかに補間することで新しい頂点を追加します(bpy.ops.mesh.subdivide(smoothness=1))。
  6. (手順3〜5をさらに数回繰り返します。)
  7. オブジェクトをX方向にストレッチして、球形を少し小さくします(bpy.ops.transform.resize(value=(stretch,1,1))
  8. ランダム回転変換を適用する(bpy.ops.transform.rotate()
  9. 最後に、編集モードを終了し、オブジェクトを選択したままにします(bpy.ops.object.mode_set(mode='OBJECT'))。

その他の例:

小惑星1小惑星2小惑星3小惑星4


2
聖なるバジェエズ!。
luser droog
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.