blenderのpythonスクリプト入門してみた_その02

# 続きを3年後に書くとは……
* [blenderのpythonスクリプト入門してみた_その01](https://qiita.com/muripo_life/items/42d7f49aa99077f52cb0)

三年前にBlenderのPython コンソールに触り、3年ぶりに触る機会がでてきたので、続きを書いていきたいと思います。

# Blenderのバージョン
Blender2.8.1a:大幅なUIとAPIの変更があったみたいです。

# Blender上のデバック環境
以下のような配置にしました。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102634/4e277d8e-c6fa-dbb1-e88f-5473bc623b0f.png)

図の表示の左下に `Text Editor` 右下に `Python Editor` を配置しました.  

# 最低限の点データを表示してみる.
スクリプトは、参考の[Blender + Pythonでポイントクラウドを可視化する](http://ksknw.hatenablog.com/entry/2019/10/29/192026)記事を参考にしました。

```python
import bpy
import numpy as np

def render(points):
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete(True)

    mat = bpy.data.materials.new("BLUE")
    mat.diffuse_color = (.33, .43, .95, 1)

    bpy.ops.mesh.primitive_plane_add(location=(0, 0, -1))
    plane = bpy.context.object
    plane.scale = (100, 100, 1)

    for x, y, z in points:
        bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z))
        sphere = bpy.context.object
        sphere.scale = (0.02, 0.02, 0.02)
        sphere.data.materials.append(mat)

    for loc, rot in [[(0, -5, 5), (-np.pi * 1 / 4, 0, np.pi)],
                     [(0, 5, 5), (np.pi * 1 / 4, 0, -np.pi)],
                     [(-5, 0, 5), (-np.pi * 1 / 4, 0, np.pi / 2)],
                     [(5, 0, 5), (-np.pi * 1 / 4, 0, -np.pi / 2)]]:
        light_data = bpy.data.lights.new(name="light", type="AREA")
        light_data.energy = 500
        light_object = bpy.data.objects.new(name="light", object_data=light_data)
        bpy.context.collection.objects.link(light_object)
        bpy.context.view_layer.objects.active = light_object
        light_object.location = loc
        light_object.rotation_euler = rot

    bpy.ops.object.camera_add(location=(3.25, -2.48, 0.745))
    camera_rotations = (np.pi * 78 / 180, 0, 52.5 * np.pi / 180)
    bpy.data.objects["Camera"].rotation_euler = camera_rotations

    bpy.context.scene.render.resolution_x = 500
    bpy.context.scene.render.resolution_y = 500
    bpy.context.scene.render.resolution_percentage = 100
    bpy.context.scene.camera = bpy.context.object
    # bpy.context.scene.render.image_settings.file_format = "PNG"
    bpy.ops.render.render(write_still=True)

if __name__ == "__main__":
    points = np.loadtxt("C:\\Blender_works\\min_sample.csv", delimiter=",")
    render(points)
```


![display2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102634/d19fb604-c04b-ffce-7f8f-034a2af12fbd.png)

# 1000件程度のデータを可視化してみる.
## データ作成スクリプト
```python
import numpy as np
import pandas as pd
N = 1000
df =pd.DataFrame({
    "x": np.random.uniform(0.0, 10., N),
    "y": np.random.uniform(0.0, 10., N),
    "z": np.random.uniform(0.0, 10., N)
})
df.to_csv("./random_data.csv", header=False, index=False)
```

![display3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102634/6a12d556-a40b-179d-ee5d-0fe79573edc8.png)

# 次回は
Jupyter notebookの連携などを調べていこうと思います。

# 参考
* [Blender 2.81a Python API Documentation](https://docs.blender.org/api/current/index.html)
* [Blender + Pythonでポイントクラウドを可視化する](http://ksknw.hatenablog.com/entry/2019/10/29/192026)