LoginSignup
3
2

More than 1 year has passed since last update.

Pythonで木から森を作ろう

Last updated at Posted at 2021-12-01

この記事は、Blender Advent Calendar 2021の2日目の記事です。「ささらBch ローポリの森」を参考にして作成しました。

  • macOSのBlender2.93で動作確認してますが、Windowsでも動くはずです。
  • 記事中の文言は、言語設定を日本語にしたものです。英語にしている方は適宜読み替えてください。

完成物のサンプル

下記のようなモデルをPythonを使って作成します。

forest.png

対象読者

  • Blenderでモデルを作ったことがある方
  • Pythonを使ったことがある方

ローポリの木を作ろう

最初に、森の元になる1本の木を作りましょう。
Blenderを起動してください。初期状態の立方体は使わないので削除してください。

※ macOSでBlenderのPythonを使う場合、コンソールからBlenderを起動すると、コンソールでエラーメッセージを確認できて便利です。

  • Shift + Aメッシュ円錐で円錐を作成します。左下の設定は下記のようにしてください。

スクリーンショット 2021-11-06 5.39.27.jpg

  • 3Dビューのシェーディングマテリアルプレビューにしてください。
  • マテリアルを新規作成し、名前をダブルクリックしてgreenにしてください。
  • Shift + DZ.5 [Enter]Shift + Rで上に2つ複製します。下記のようになります。

スクリーンショット 2021-11-06 6.56.23.jpg

  • Shift + Aメッシュ円柱で円柱を作成します。左下の設定は下記のようにしてください。

スクリーンショット 2021-11-06 5.48.04.jpg

  • マテリアルを新規作成し、名前をbrownにしてください。ベースカラーを適当に茶色(例:16進数で806030)にしてください。

  • 作成した4つのオブジェクトを選択し、Ctrl + Jで1つのオブジェクトにします。

  • 右上のアウトライナーで、名前をダブルクリックしてtreeに変えてください。

  • Ctrl + A全トランスフォームでトランスフォームをリセットしてください。

  • プロパティ画面のオブジェクトプロパティの一番下のカスタムプロパティを開いて追加を押してください。

    • 編集を押してください。
      • プロパティ名をcolorに、プロパティ値を[0.05, 0.2, 0.05, 1.0]にしてください。デフォルト値も同じ値にしてください。
      • プロパティ値を変えることで、下部にサブタイプが表示されます。サブタイプをLinear Colorに変えてください。
      • 下図のようになっていればOKを押します。

スクリーンショット 2021-11-06 6.11.07.jpg

  • マテリアルでgreenを選んでください。
  • ワークスペースをShadingにします。
  • Shift + A入力属性で属性を作成します。
  • タイプをオブジェクトに、名前を["color"]にします。下記のようにカラーベースカラーにつなぎます。

スクリーンショット 2021-11-06 6.04.10.jpg

  • ワークスペースをLayoutにします。
  • 木が完成です。

地面を作ろう

  • Shift + Aメッシュグリッドでグリッドを作成します。左下の設定は下記のようにしてください。

スクリーンショット 2021-11-06 6.15.58.jpg

  • マテリアルを新規作成し、名前をgroundにしてください。ベースカラーを適当にこげ茶色(例:16進数で302010)にしてください。
  • 編集モードに入ります。
  • メッシュメニュートランスフォームランダム化で、少しデコボコにします。
  • オブジェクトモードに戻ります。
  • 地面が完成です。

森をつくろう

  • 管理しやすいように森を入れるためのコレクションを作りましょう。
    • アウトライナーで右クリックから新規コレクションを選び、名前を下記のようにforestに変えてください。

スクリーンショット 2021-11-06 6.31.23.jpg

  • ワークスペースをScriptingにします。
  • 新規を押し、下記を記述します。
import bpy
import random

n = 2000
R = 40

tr = bpy.data.objects["tree"]
c = bpy.data.collections["forest"]
for _ in range(n):
    obj = bpy.data.objects.new("new_tree", tr.data)
    x = (random.random() * 2 - 1) * R
    y = (random.random() * 2 - 1) * R
    s = random.random() * 0.3 + 0.7
    obj.location = x, y, random.random() * 0.4
    obj.scale = s, s, s
    obj.rotation_euler.z = random.random() * 360
    obj["color"] = (
        random.random() * 0.05,
        random.random() * 0.1 + 0.15,
        random.random() * 0.05,
        1,
    )
    c.objects.link(obj)
  • テキストメニュースクリプト実行を押して完成です。

参考:BlenderでPythonを実行する方法

コードの解説

  • treeを2000個、リンク複製しています。
  • リンク複製なので、メッシュは同一のメッシュオブジェクトです。リンク複製にすることで高速に作成でき、ファイルサイズも小さくできます。
  • 複製したオブジェクトの位置、サイズ、角度、色を変えています。
  • 通常のマテリアルだと、色を変えたい場合、別のマテリアルにすることになります。ここでは、マテリアルのノードでカスタムプロパティで色を指定することにより、同一のマテリアルで色を変えられるようにしています。
    • カスタムプロパティは、オブジェクトの属性なのでリンク複製でも変更可能です。
    • 複製したカスタムプロパティのサブタイプは、Linear Colorになっていません。Linear Colorにするのがややこしそうなので、このままにしています。

※ パーティクルを使ってオブジェクトを配置することも可能ですが、今回はPythonを使ってみました。

レンダリングしよう

モデルの範囲が広いので、ライトはサンが良いでしょう。ライトとカメラを調整してレンダリングしてみましょう。

完成例:Forest using Python - sketchfab

以上

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2