BlenderPythonスクリプト、柔らか物体クロースオブジェクト、マテリアル追加、Collisionは重い

 柔らか物体クロースオブジェクト記録

ファイル:fall_Cloth_Otoshi_colorMaterial_003.py

BlenderPythonスクリプトでは、複数の色マテリアルを新規作成(属性はなし)、オブジェクトに付与した。以前作ったスクリプトは、マテリアルを新規作成してそのまま新規オブジェクトに付与するスクリプトだった。今回は、先にマテリアルを新規作成して後で、オブジェクトに付与するもの。単にappendすればよいだけだった。

なお、クロースは初期設定で250フレームまでしか計算してくれない。これはクロースのCashキャッシュのところに、End終了フレーム指定があるのでここを変更することで250フレームを超えて計算してくれる。

今回15個ほどクロースオブジェクトを上方から落下させて物理演算の計算をさせたらかなり時間がかかった。Collisionが原因で、15個に個別にCollision衝突判定を加えているから処理が重い、遅い。Collisionがないときはサクッと終わる。当然の計算処理だろう。1フレーム再生するのに、1秒から5秒もかかった(通常は滑らかに秒24フレーム再生されるのに、数フレームから0.2フレームという処理の遅さ)。なので、個数は少なめにして実験したほうが良さそう。CPUがCorei7だからかもしれん。一度計算させたらキャッシュに残るからあとは速い

画像、映像




BlenderPythonスクリプト、複数の色マテリアルを新規作成(属性はなし)


  1. import os
  2. import bpy
  3. import math
  4. import copy
  5. import time
  6. import inspect#関数名を出力するためだけのもの
  7. #2024/10/21
  8. #print文はBlenderのメニューバーの Window > Toggle System Consoleを実行するとDOS窓が表示される
  9. #15個にクロースとCollisionを与えたので非常にアニメーションキャッシュ作成に時間がかかった。15個にCollisionを与えないと
  10. #サクッと終わるので、Collisionが処理を重くしてる。
  11.  
  12. #Cloth物体を落として パチンコ台みたいに落ちる様子を観察する
  13. #落下物は高さを調整して落とす
  14.  
  15. #\ / みたいな板を配置して上から落としていく
  16.  
  17. #板 原点
  18. def funcMakePlane(resizeValue,loc):
  19. #resizeValue =value=(-5, -5, -5) リサイズのところのX軸側を大きくする予定
  20. bpy.ops.mesh.primitive_plane_add(size=2, enter_editmode=False, align='WORLD', location=loc, scale=(1, 1, 1))
  21. bpy.ops.transform.resize(value=resizeValue, orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False)
  22. #bpy.ops.rigidbody.object_add()
  23. #bpy.context.object.rigid_body.type = 'PASSIVE'
  24. bpy.ops.object.modifier_add(type='COLLISION')
  25. bpy.context.object.collision.absorption = 0.1
  26.  
  27. #BOX Cube
  28. def funcMakeBox(resizeValue,loc):
  29. #BOXの生成位置の変更はlocation=(0, 2.5, 1)を変更する。サイズは現在value=(7.0, 1, 1)X軸に大きくしてる。正確に測っていない。2024/10/18
  30. bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=loc, rotation=(0, 0, 0), scale=(1, 1, 1))
  31. bpy.ops.transform.resize(value=resizeValue, orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL',\
  32. constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', \
  33. proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'},\
  34. use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False)
  35. bpy.ops.object.modifier_add(type='COLLISION')
  36. bpy.context.object.collision.absorption = 0.1
  37.  
  38. #球体 Cloth設定の引数が多すぎ,color,colorNameを追加、2024/10/21
  39. def funcMakeSphere(loc,tension_stiffness,compression_stiffness,uniform_pressure_force,pressure_factor,collision_settings_distance_min,materialColor):
  40. #glocation=loc#(0, 0, 2)Z軸に2m固定、X軸に並べていく
  41. bpy.ops.mesh.primitive_uv_sphere_add(radius=1, enter_editmode=False, align='WORLD', location=loc, scale=(1, 1, 1))
  42. #オブジェクトにマテリアルの要素を追加する
  43. #bpy.context.object.data.materials.append(mat)
  44. bpy.context.object.data.materials.append(bpy.data.materials[materialColor])
  45. #サンプル
  46. #bpy.ops.material.new()
  47. #bpy.data.materials[1].name='Material.001'
  48. #bpy.data.materials['Material.001'].diffuse_color=(1,0,0,1)
  49. #bpy.context.object.data.materials.append(bpy.data.materials['Material.001'])
  50.  
  51. #サンプル
  52. #DataMaterials = bpy.data.materials
  53. #for key, value in DataMaterials.items():
  54. # print(f"[{key}] {value}")
  55. #Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする   pressure圧力 Stiff硬さ、曲がりにくい
  56. #bpy.context.space_data.context = 'MODIFIER'
  57. bpy.ops.object.modifier_add(type='CLOTH')
  58. bpy.context.object.modifiers["Cloth"].settings.tension_stiffness = tension_stiffness#15
  59. bpy.context.object.modifiers["Cloth"].settings.compression_stiffness = compression_stiffness#15
  60. bpy.context.object.modifiers["Cloth"].settings.use_pressure = True
  61. bpy.context.object.modifiers["Cloth"].settings.uniform_pressure_force = uniform_pressure_force#0.05
  62. bpy.context.object.modifiers["Cloth"].settings.pressure_factor = pressure_factor#30
  63. bpy.context.object.modifiers["Cloth"].collision_settings.distance_min = collision_settings_distance_min#0.015
  64. bpy.context.object.modifiers["Cloth"].point_cache.frame_end = 900#ここは、球体の数で可変にしたい。今は固定で対応
  65.  
  66. bpy.ops.object.modifier_add(type='COLLISION')
  67.  
  68. #end def
  69.  
  70. def funcMakeTulip():
  71. pass
  72.  
  73. def funcMakeMaterial():
  74. #ディクショナリで連想配列
  75. #赤 0.906,0.102,0.132,1.0
  76. # 橙 0.8,0.31,0.04,1.0
  77. # 黄0.8,0.78,0.245,1.0
  78. # 緑0.038,0.8,0.053,1.0
  79. # 青0.077,0.724,0.8,1.0
  80. # 藍0.047,0.055,0.8,1.0
  81. # 紫0.487,0.051,0.8,1.0
  82. #pink 0.907,0.681,0.837,1.0
  83. #白0.8,0.8,0.8,1.0
  84. #黒0.0,0.0,0.0,1.0
  85.  
  86. #マテリアルを事前に作成しておく ディクショナリが見やすい
  87. gDipColorList={}
  88. gDipColorList["red"] =(0.906, 0.102, 0.132,1.0)
  89. gDipColorList["orange"] =(0.8, 0.31, 0.04,1.0)
  90. gDipColorList["yellow"] =(0.8, 0.78, 0.245,1.0)
  91. gDipColorList["green"] =(0.038, 0.8, 0.053,1.0)
  92. gDipColorList["bulue"] =(0.077, 0.724, 0.8,1.0)
  93. gDipColorList["indigo"] =(0.047, 0.055, 0.8,1.0)
  94. gDipColorList["purple"] =(0.487, 0.051, 0.8,1.0)
  95. gDipColorList["pink"] =(0.907, 0.681, 0.837,1.0)
  96. gDipColorList["white"] =(0.8, 0.8, 0.8,1.0)
  97. gDipColorList["black"] =(0.0, 0.0, 0.0,1.0)
  98. gColorList=[]#面倒だけど、番号で管理したい。他に良い方法があれば変更。今は面倒コードでいく2024/10/21
  99. gColorList.append(gDipColorList["red"] )
  100. gColorList.append(gDipColorList["orange"] )
  101. gColorList.append(gDipColorList["yellow"] )
  102. gColorList.append(gDipColorList["green"] )
  103. gColorList.append(gDipColorList["bulue"] )
  104. gColorList.append(gDipColorList["indigo"] )
  105. gColorList.append(gDipColorList["purple"] )
  106. gColorList.append(gDipColorList["pink"] )
  107. gColorList.append(gDipColorList["white"] )
  108. gColorList.append(gDipColorList["black"] )
  109.  
  110. #keyList=list(gDipColorList.keys())#red,orangeのキー名を取得して、マテリアル名にする
  111. for m in gDipColorList.keys():
  112. mat = bpy.data.materials.new(m)
  113. mat.diffuse_color = gDipColorList[m]#color#t_color#(0.8, 0.8, 0.8, 1.0)
  114. # マテリアルスロットを追加する
  115. #bpy.ops.object.material_slot_add()
  116. ## 作成したマテリアルスロットに新規マテリアルを設定する
  117. bpy.context.object.active_material = mat
  118.  
  119. #All
  120. def funcMatome():
  121. bpy.ops.object.mode_set(mode='OBJECT')
  122.  
  123. funcMakeMaterial()#マテリアル作成
  124.  
  125. materialColor= []#多分配列なので今はダミー
  126. dataMaterials = bpy.data.materials
  127. for key, value in dataMaterials.items(): #わざわざマテリアルを取得する必要があるかは疑問だけど今思いつくのはFor文
  128. if key=="Dots Stroke":
  129. pass
  130. else:
  131. materialColor.append(key)
  132. #print(key)
  133.  
  134. gXlocation=0#球体のX座標位置初期値は原点
  135. gParamaterList=[]#クロースのパラメータ用配列
  136. #球体だけ複数作成、X軸に並べる 15個を超えると原点に戻す。なお30個以上の要素数は想定していない。理由は多すぎるから。
  137. #Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする   pressure圧力 Stiff硬さ、曲がりにくい
  138. # 1tension 2compression 3pressureForce 4factor distance
  139. gParamaterList.append([100, 15, 0.05, 30, 0.015])#(1)Tension大きめで硬い
  140. gParamaterList.append([100, 15, 0.05, 5, 0.015])#(1)硬い 4factor弱めで凹む弾まない
  141. gParamaterList.append([15, 15, 0.05, 30, 0.015])#デフォルト設定
  142. gParamaterList.append([15, 15, 0.1, 30, 0.015])#(3pressureForce
  143. gParamaterList.append([15, 15, 0.5, 30, 0.015])#(3pressureForce 0.5以上で大きいと瞬時に膨張膨らむ 強め
  144.  
  145. gParamaterList.append([15, 15, 1.0, 30, 0.015])#(3pressureForce もっと強め
  146. gParamaterList.append([15, 15, 1.0, 60, 0.015])#(3pressureForce もっと強めで膨張(4factor大きくすると弾む
  147. gParamaterList.append([15, 15, 0.05, 5, 0.015])#(4factor弱めで凹む弾まない
  148. gParamaterList.append([15, 5, 0.05, 5, 0.015])#
  149. gParamaterList.append([5, 5, 0.05, 30, 0.015])#柔らか
  150.  
  151. gParamaterList.append([5, 15, 0.05, 10, 0.015])#(2)compressionを少し多め
  152. gParamaterList.append([5, 40, 0.05, 10, 0.015])#(2)を大きくしたことで少し中が詰まったような柔らかさが減っている(ぎゅっと押し込んだような感じ)
  153. gParamaterList.append([5, 5, 0.05, 10, 0.015])#柔らかで、弾力がない雰囲気
  154. gParamaterList.append([5, 5, 0.05, 5, 0.015])#
  155. gParamaterList.append([5, 5, 0.008, 5, 0.015])#(3pressureForceかなり低め(4)弱いで、ポニョポニョブヨブヨ
  156.  
  157. #16個目からはこっちに記載
  158. #チューリップ生成
  159.  
  160. #板生成
  161. #gKakudai=len(gParamaterList)#数が多くなる事にX軸に対して板のサイズをX軸方向に拡大していく
  162. resizeValue =(-5, -10, -5) #Y軸にも拡大
  163. loc =(0.0, 0.0, 0.0)#ずらすX座標はあいまいなので調整が必要
  164. funcMakePlane(resizeValue,loc)
  165. #球体生成
  166. loc=(0,0,0)
  167. ylocation=1.0#手前の奥行き
  168. zAddLoction=10.0#g=9.8m = 10m
  169. zlocation=0.0#高さ
  170.  
  171. zlocation=zAddLoction
  172. #yMoveLocation=-2.0
  173. #defaultFrame=20
  174. #localFrame=defaultFrame
  175. iCount=0
  176. #keyList=list(gDipColorList.keys())#red,orangeのキー名を取得して、マテリアル名にする
  177. for i in range(len(gParamaterList)):
  178. #原点のZ上方にオブジェクトを配置して落とす。変更するのはzLocationのみ
  179. loc=(gXlocation, 0, zlocation)#球体作成、配置、設定Z軸に初期3m固定、X軸に並べていく
  180. print("gParamaterList[i][0]="+str(gParamaterList[i][0]))
  181. funcMakeSphere(loc,gParamaterList[i][0],gParamaterList[i][1],gParamaterList[i][2],gParamaterList[i][3],gParamaterList[i][4],materialColor[iCount])
  182. #print(materialColor[iCount])
  183. #gXlocation+=2.1
  184. zlocation+=zAddLoction
  185. #10個ごとに、色を最初REDに戻す、色が増えたら「9」を変更して。
  186. if i==0:
  187. iCount+=1
  188. elif (i % 9) == 0:
  189. iCount=0
  190. else:
  191. iCount+=1
  192. #end for
  193. bpy.context.scene.frame_end =int(60*len(gParamaterList))#250フレームで物理演算の動きが止まってしまったなんで?クロースの「cash」の終了ENDを変更
  194.  
  195. #end def
  196.  
  197. #class 各種パラメータ、設定値をカプセル化にして、更に配列にカプセルを挿入させることでコードの視認性をたかめる
  198. #funcMatome()内で使用する ※ 2024/10/17現在クラスは使っていない
  199. class ClassCapcelParamaterCloth:
  200. def __init__(self,kyori,objName,list) -> None:
  201. print("class const")
  202. self.kyori= kyori#オブジェクトのX座標
  203. self.objName= objName#Obj type name:Cylinder
  204. self.list= list#Wiggle2のStiffのパラメータ配列、ボーンの数だけ必要なので、ボーンの数はこの配列の要素数で自動で取得
  205. self.number= 0
  206.  
  207. def __del__(self):
  208. print("del デストラクタ、何もしないけど")
  209.  
  210. def myNamePrint(self):# class 自分自身 出力
  211. function_name = inspect.currentframe().f_code.co_name# この部分は関数中でPrintで使える
  212. class_name = self.__class__.__name__
  213. print('{}.{}'.format(function_name, class_name))
  214. #end Class
  215.  
  216.  
  217.  
  218. if __name__ == "__main__":
  219. print("*************************************************")
  220. print("*************************************************")
  221. print("****************** Start ***********************")
  222. #main GO
  223. # 3Dカーソルの位置を元に戻す
  224. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  225.  
  226. funcMatome()
  227.  
  228. print("****************** end ***********************")
  229.  
  230.  
  231.  
株式ランキング
株式ランキング にほんブログ村 株ブログ 株 デイトレードへ
にほんブログ村 にほんブログ村 デザインブログ 3DCGへ
にほんブログ村

このブログの人気の投稿

国税庁確定申告でエラーになったところ株式譲渡が赤字の場合には、配当を申告不要とすることはできません

メモ、BlenderPythonスクリプトで参考になるオブジェクトや頂点の選択ツリー選択スクリプトリンクメモ

楽天証券、信用取引口座から楽天FX口座へ振替手順