A rudimentary BlenderPython script to represent object density in 3D space
I wrote a rudimentary BlenderPython script that expresses the distribution density of a mesh object (CUBE) in Blender3D space. Backed by ChatGPT. Creating 3D heatmaps is no longer a dream.
Blender3D空間におけるメッシュオブジェクト(CUBE)の分布密度を表現する初歩的BlenderPythonスクリプトを作成しましたので、メモします。ChatGPTの支援を受けました。3Dヒートマップ作成が夢ではなくなりました。
1 オブジェクト密度表現の初歩的BlenderPythonスクリプト
このスクリプトは次の要件を満たすBlenderPythonスクリプトです。
1 Blenderで多数のCUBEが密集して配置され、それらが選択されています。
2 1つ1つのCUBEについて、他のすべてのCUBEとの距離を計測し、その距離の逆数をもとめ、さらにその逆数の合計をもとめ、その値をr値とします。
3 全CUBEのr値の平均値(s値)と標準偏差値(t値)を求めます。
4 1つ1つのCUBEに新たに区分値(u値)を与えます。区分値(u値)は次の式に示すとおり、平均値(s値)と標準偏差値(t値)から計算します。
r>(t+s)あるいはr=(t+s)の時 u=0
(t+s)>r>sあるいはr=sのときu=1
s>r>(t-s)あるいはr=(t-s)のときu=2
(t-s)>rのときu=3
5 全CUBEに新しいマテリアルを作成し、そのマテリアルにノードを追加してベースカラーを設定します。
6 ベースカラーの設定は
u=0のときRGB値(1,0,0,1) 赤
u=1のときRGB値(0.8,0.2,0.2,1) 薄赤
u=2のときRGB値(0.1,0.2,0.8,1) 薄青
u=0のときRGB値(0,0,1,1) 青
とします。
7 全CUBEのr値、平均値(s値)と標準偏差値(t値)、全CUBEの区分値(u値)をprintします。
- import bpy
- from mathutils import Vector
- import statistics
- def calculate_r_value(cube_obj):
- r_value = 0.0
- all_cubes = bpy.context.selected_objects
- for other_cube in all_cubes:
- if other_cube != cube_obj and other_cube.type == 'MESH':
- distance = (other_cube.location - cube_obj.location).length
- if distance != 0:
- r_value += 1 / distance
- return r_value
- # 選択されたオブジェクトがCUBEであることを確認
- selected_objects = bpy.context.selected_objects
- cube_objects = [obj for obj in selected_objects if obj.type == 'MESH']
- if not cube_objects:
- print("No CUBE objects selected.")
- else:
- r_values = []
- for cube in cube_objects:
- r_value = calculate_r_value(cube)
- r_values.append(r_value)
- print(f"r value for {cube.name}: {r_value}")
- # 平均値と標準偏差値の計算と表示
- mean_value = statistics.mean(r_values)
- std_deviation = statistics.stdev(r_values)
- print(f"Mean value (s value): {mean_value}")
- print(f"Standard deviation (t value): {std_deviation}")
- for cube in cube_objects:
- r_value = calculate_r_value(cube)
- if r_value > (mean_value + std_deviation) or r_value == (mean_value + std_deviation):
- u_value = 0
- elif (mean_value + std_deviation) > r_value > mean_value or r_value == mean_value:
- u_value = 1
- elif mean_value > r_value > (mean_value - std_deviation) or r_value == (mean_value - std_deviation):
- u_value = 2
- elif r_value < (mean_value - std_deviation):
- u_value = 3
- print(f"u value for {cube.name}: {u_value}")
- # マテリアルの作成とベースカラーの設定
- material = bpy.data.materials.new(name=f"{cube.name}_Material")
- material.use_nodes = True
- principled_bsdf = material.node_tree.nodes.get("Principled BSDF")
- if u_value == 0:
- principled_bsdf.inputs["Base Color"].default_value = (1, 0, 0, 1)
- elif u_value == 1:
- principled_bsdf.inputs["Base Color"].default_value = (0.8, 0.2, 0.2, 1)
- elif u_value == 2:
- principled_bsdf.inputs["Base Color"].default_value = (0.1, 0.2, 0.8, 1)
- elif u_value == 3:
- principled_bsdf.inputs["Base Color"].default_value = (0, 0, 1, 1)
- if cube.data.materials:
- cube.data.materials[0] = material
- else:
- cube.data.materials.append(material)
オブジェクト密度表現の初歩的BlenderPythonスクリプト 3Dモデル例の動画
0 件のコメント:
コメントを投稿