前提
ここに質問の内容を詳しく書いてください。
(例)
blenderのScripring(python)を利用して、
3×3×3の27個の球を結合して動かすようにするにはどのようにすればいいですか?
物理演算も利用したいため、材質はACTIVEにしたい。
実現したいこと
blenderのScripring(python)を利用して、
3×3×3の球の27個の球を二つ作成させて動くようにさせて、ぶつけ合ってはじくようにしたい。
発生している問題・エラーメッセージ
結合した球を動かそうとすると、全てはじけ飛んでしまう。
ソースコード
import bpy #Python から Blender を操作するためのモジュール import math #数学関数を使うためのモジュール import random bpy.ops.object.select_all(action='SELECT') #全てのオブジェクトを選択 bpy.ops.object.delete(True) #選択した全てのオブジェクトを削除 #光源の設定 bpy.ops.object.light_add( type="SUN", #光源の種類(POINT:点光源,SUN:平行光線, #SPOT:スポットライト,AREA:エリアライト) location=( 0, 0, 10), #光源の位置 rotation=( 0, 0, 0 ), #光源の角度 ) #光源の設定(追加) bpy.context.object.data.energy = 100 #光源の強さ(デフォルト値は 10) bpy.context.object.data.color=(0,1,0) #光源の色(赤,緑,青) #カメラの設定 bpy.ops.object.camera_add( location=( 10, -10, 10 ), #カメラの位置 rotation=( math.pi/3.2, 0, math.pi/4), #カメラの方向 ) #カメラのクリッピング設定 bpy.context.object.data.clip_start = 0.1 #カメラのクリッピング開始位置 bpy.context.object.data.clip_end = 100 #カメラのクリッピング終了位置 #レンダリングの設定 scene = bpy.context.scene #シーンオブジェクトデータを変数 scene に代入 scene.render.resolution_x = 1280 #レンダリング画像の X 方向の解像度 scene.render.resolution_y = 720 #レンダリング画像の Y 方向の解像度 scene.render.resolution_percentage = 100 #レンダリングする画像サイズの百分率 #材質の設定 material = bpy.data.materials.new('Color') #材質データの作成(Color の部分は材質名) material.diffuse_color = (1.0, 0.0, 0.0, 1.0) #材質データの色(赤,緑,青,透過度) #プリミティブの追加 #関数(球の追加) def add_uv_sphere(location,color): #関数の宣言(引数は location と color) #材質の設定 material = bpy.data.materials.new('Color') #材質データの作成 material.diffuse_color = (color) #材質データの色(引数で受け取った値) #プリミティブの追加(球) bpy.ops.mesh.primitive_uv_sphere_add( location=(location) #プリミティブの設定(引数で受け取った値) ) bpy.context.object.data.materials.append(material) #材質の反映 bpy.ops.object.modifier_add(type="SUBSURF") #モディファイア処理 bpy.ops.rigidbody.object_add( type='ACTIVE' ) bpy.context.object.rigid_body.mass = 10 #剛体の重さの設定 bpy.context.object.rigid_body.friction = 0.5 #剛体の摩擦の設定(0.0-1.0) bpy.context.object.rigid_body.restitution = 1.0 #剛体の弾性の設定(0.0-1.0) add_uv_sphere((0,0,15),(1.0, 0.0, 0.0, 1.0)) #球の追加(Z 軸 10 で赤色に設定) add_uv_sphere((0.5,0.5,1),(0.0, 0.0, 1.0, 1.0)) #球の追加(原点からずらして青色に設定) #プリミティブの追加(平面) bpy.ops.mesh.primitive_plane_add( location=(0,0,0) ,#プリミティブの設定(位置) rotation=(0, 0, 0) ) bpy.ops.transform.resize(value=(10,10,1)) #平面を拡大 bpy.ops.rigidbody.object_add( #剛体の設定 type='PASSIVE' #剛体をパッシブに設定(動かない) ) #3×3 で原点を中心に並べて 9 つの球の追加 for x in range(3): for y in range(3): for z in range(3): add_uv_sphere((x*1, y*1, z*1+1),(random.random(), random.random(),random.random(), 1.0)) bpy.context.object.data.materials.append(material) #材質の反映 bpy.ops.object.modifier_add(type="SUBSURF") #モディファイア処理 bpy.ops.rigidbody.object_add( type='ACTIVE' ) bpy.context.object.rigid_body.mass = 10 #剛体の重さの設定 bpy.context.object.rigid_body.friction = 0.5 #剛体の摩擦の設定(0.0-1.0) bpy.context.object.rigid_body.restitution = 1.0 #剛体の弾性の設定(0.0-1.0) bpy.context.scene.cursor.location=(0,0,0) #カーソルの座標を設定(この場合原点) bpy.ops.object.origin_set(type='ORIGIN_CURSOR') #カーソル位置をオブジェクト原点に bpy.context.scene.frame_start = 0 #レンダリング動画の最初のフレームの設定 bpy.context.scene.frame_end = 240 #レンダリング動画の最後のフレームの設定 bpy.context.scene.frame_set(0) #最初のキーフレーム番号を設定 obj = bpy.context.view_layer.objects.active #動かすオブジェクトをアクティブ化 obj.keyframe_insert(data_path='location') #キーフレームで「移動」を可能にする obj.keyframe_insert(data_path='rotation_euler') #キーフレームで「回転」を可能にする bpy.context.scene.frame_set(240) #最後のキーフレーム番号を設定 obj.location.x += 5 #オブジェクトの移動を設定(z 軸+5) obj.location.y += 5 #オブジェクトの移動を設定(z 軸+5) obj.rotation_euler[2] += math.pi*2 #オブジェクトの回転を設定(z 軸 360 度) obj.keyframe_insert(data_path='location') #キーフレームで「移動」を反映する obj.keyframe_insert(data_path='rotation_euler') #キーフレームで「回転」を反映する #グループ化(Z 座標が 1 のオブジェクトを対象) for obj in bpy.data.objects: #全てのオブジェクトを調べる loc_z = (obj.location.z) #オブジェクトの Z 座標を取得 if loc_z >= 1 and loc_z <= 10: #そのオブジェクトの Z 座標が 1 の場合 obj.select_set(True) #選択状態にする bpy.ops.object.join() #選択したオブジェクトを統合 bpy.context.scene.frame_start = 0 #レンダリング動画の最初のフレームの設定 bpy.context.scene.frame_end = 240 #レンダリング動画の最後のフレームの設定 bpy.context.scene.render.image_settings.file_format = 'FFMPEG' #ファイル形式を設定 bpy.context.scene.render.ffmpeg.format = 'MPEG4' #コンテナの設定 bpy.context.scene.render.filepath = "C:\\tmp\\sample6_1.mp4" #ファイル名を設定
0 コメント