柔らか物体クロースオブジェクト比較パラメータ調査(途中経過)BlenderPythonスクリプト

クロースClothオブジェクト比較

柔らかい物体になるパラメータはどれかを調査(途中経過)

ファイル:clothButsuriEnzan_TYPE_B物体をぶつける_021.py


動画

Blender4.2、Pythonを使用

クロースやソフトボディなどの物理演算はパラメータが多いしどれくらいの値を入力すればどれくらいの柔らかいオブジェクトが生成できるかわからない。ある程度数値化することで、作業の手間を省く、Pythonスクリプトを使って自動化でクロースオブジェクトの比較調査をする。

クロースの他に柔らか物体を表現するソフトボディがあるがあまりパラメータがない。また使い道がボールとかプリンくらいしかない。

実験は、ボール(クロースモディファイア)を床(板プレーン)に落とす形式。

(途中経過なのでわかりにくかったり何がなんだかわからないかもしれん。色々と試すが明確な値を決められない。知りたいのはこの値を入れると柔らかいとか反発するとか粘りがあるとかなど。もう少し時間をかければよいが時間がかかるとやる気が無くなって放置してしまうおそれがある。このままだとアップを忘れるので途中経過だが、記載しておく)

結果表、ここに記載予定

忘れないうちにわかったことを記載しておく。色々と試すが期待できるような効果を説明できる数値が見つけられない。微妙な数値をチクチクといじって確認する感じで面倒。まさにこれが無料のアプリの悪いところ。動かさないと結果がわからない。パラメータ同士の連携ができていないので、本当はある数値のしきい値を高くしないと効果が現れないのにそのエラーと警告が表示されないので、ユーザーはどのパラメータの数値をいじればよいのかわからない。(無料なんだから文句を言うなby開発者、たぶん)

結果表はできればスプレッドシートできれいにしたいがアクセス数がない割にやることが面倒なのでコードをキャプして貼るだけにするけど見てくれた人には申し訳ない。時間を見つけてきれいな表にする。

英語の意味:Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする   pressure圧力 Stiff硬さ、曲がりにくい

配列にして左から  1tension    2compression   3pressureForce   4factor  distance の順に数値を与えた。 1tension と2compressionは数値が高いほど布が硬い。
2compressionは高くすると中身がぎゅっと詰まったような感じになって弾まない。3pressureForceは空気圧みたいな感じで、ボール内の空気の圧力が高いと膨張して膨らむ。4factor  distance は数値が低いと弾まないし着地すると凹むような動きをする。



以下スクリプトで、ボール(クロースモディファイア)を床(板プレーン)新規作成して物理演算設定を与える。





  1. import os
  2. import bpy
  3. import math
  4. import copy
  5. import time
  6. import inspect#関数名を出力するためだけのもの
  7. #2024/10/9
  8. #print文はBlenderのメニューバーの Window > Toggle System Consoleを実行するとDOS窓が表示される
  9.  
  10. #板 原点
  11. def funcMakePlane(resizeValue,loc):
  12. #resizeValue =value=(-5, -5, -5) リサイズのところのX軸側を大きくする予定
  13. bpy.ops.mesh.primitive_plane_add(size=2, enter_editmode=False, align='WORLD', location=loc, scale=(1, 1, 1))
  14. 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)
  15. #bpy.ops.rigidbody.object_add()
  16. #bpy.context.object.rigid_body.type = 'PASSIVE'
  17. bpy.ops.object.modifier_add(type='COLLISION')
  18. bpy.context.object.collision.absorption = 0.1
  19.  
  20. #BOX Cube
  21. def funcMakeBox(resizeValue,loc):
  22. #BOXの生成位置の変更はlocation=(0, 2.5, 1)を変更する。サイズは現在value=(7.0, 1, 1)X軸に大きくしてる。正確に測っていない。2024/10/18
  23. bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=loc, rotation=(0, 0, 0), scale=(1, 1, 1))
  24. bpy.ops.transform.resize(value=resizeValue, orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL',\
  25. constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', \
  26. proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'},\
  27. use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False)
  28. bpy.ops.object.modifier_add(type='COLLISION')
  29. bpy.context.object.collision.absorption = 0.1
  30.  
  31. #球体 Cloth設定の引数が多すぎ
  32. def funcMakeSphere(loc,tension_stiffness,compression_stiffness,uniform_pressure_force,pressure_factor,collision_settings_distance_min):
  33. #glocation=loc#(0, 0, 2)Z軸に2m固定、X軸に並べていく
  34. bpy.ops.mesh.primitive_uv_sphere_add(radius=1, enter_editmode=False, align='WORLD', location=loc, scale=(1, 1, 1))
  35. #bpy.data.window_managers["WinMan"].[2] = 1
  36. #bpy.ops.mesh.primitive_uv_sphere_add(radius=1, enter_editmode=False, align='WORLD', location=(0, 0, 1), rotation=(0, 0, 0), scale=(1, 1, 1))
  37. #Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする   pressure圧力 Stiff硬さ、曲がりにくい
  38. #bpy.context.space_data.context = 'MODIFIER'
  39. bpy.ops.object.modifier_add(type='CLOTH')
  40. bpy.context.object.modifiers["Cloth"].settings.tension_stiffness = tension_stiffness#15
  41. bpy.context.object.modifiers["Cloth"].settings.compression_stiffness = compression_stiffness#15
  42. bpy.context.object.modifiers["Cloth"].settings.use_pressure = True
  43. bpy.context.object.modifiers["Cloth"].settings.uniform_pressure_force = uniform_pressure_force#0.05
  44. bpy.context.object.modifiers["Cloth"].settings.pressure_factor = pressure_factor#30
  45. bpy.context.object.modifiers["Cloth"].collision_settings.distance_min = collision_settings_distance_min#0.015
  46. #end def
  47.  
  48. #All
  49. def funcMatome():
  50. bpy.ops.object.mode_set(mode='OBJECT')
  51.  
  52. gXlocation=0#球体のX座標位置初期値は原点
  53. gParamaterList=[]#クロースのパラメータ用配列
  54. #球体だけ複数作成、X軸に並べる 15個を超えると原点に戻す。なお30個以上の要素数は想定していない。理由は多すぎるから。
  55. #Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする   pressure圧力 Stiff硬さ、曲がりにくい
  56. # 1tension 2compression 3pressureForce 4factor distance
  57. gParamaterList.append([100, 15, 0.05, 30, 0.015])#(1)Tension大きめで硬い
  58. gParamaterList.append([100, 15, 0.05, 5, 0.015])#(1)硬い 4factor弱めで凹む弾まない
  59. gParamaterList.append([15, 15, 0.05, 30, 0.015])#デフォルト設定
  60. gParamaterList.append([15, 15, 0.1, 30, 0.015])#(3pressureForce
  61. gParamaterList.append([15, 15, 0.5, 30, 0.015])#(3pressureForce 0.5以上で大きいと瞬時に膨張膨らむ 強め
  62.  
  63. gParamaterList.append([15, 15, 1.0, 30, 0.015])#(3pressureForce もっと強め
  64. gParamaterList.append([15, 15, 1.0, 60, 0.015])#(3pressureForce もっと強めで膨張(4factor大きくすると弾む
  65. gParamaterList.append([15, 15, 0.05, 5, 0.015])#(4factor弱めで凹む弾まない
  66. gParamaterList.append([15, 5, 0.05, 5, 0.015])#
  67. gParamaterList.append([5, 5, 0.05, 30, 0.015])#柔らか
  68.  
  69. gParamaterList.append([5, 15, 0.05, 10, 0.015])#(2)compressionを少し多め
  70. gParamaterList.append([5, 40, 0.05, 10, 0.015])#(2)を大きくしたことで少し中が詰まったような柔らかさが減っている(ぎゅっと押し込んだような感じ)
  71. gParamaterList.append([5, 5, 0.05, 10, 0.015])#柔らかで、弾力がない雰囲気
  72. gParamaterList.append([5, 5, 0.05, 5, 0.015])#
  73. gParamaterList.append([5, 5, 0.008, 5, 0.015])#(3pressureForceかなり低め(4)弱いで、ポニョポニョブヨブヨ
  74.  
  75. #16個目からはこっちに記載
  76.  
  77.  
  78. #板生成
  79. gKakudai=len(gParamaterList)#数が多くなる事にX軸に対して板のサイズをX軸方向に拡大していく
  80. resizeValue =(-2*gKakudai, -10, -5) #Y軸にも拡大
  81. loc =(0.5*gKakudai, 0.0, 0.0)#ずらすX座標はあいまいなので調整が必要
  82. funcMakePlane(resizeValue,loc)
  83.  
  84. #球体揺れアニメーションを作成するつもりが当該物理演算物体は外部制御による任意に動かせないので、別の物体をぶつけるかボーンで制御させる
  85. #別の物体をぶつける方法で試す
  86. #BOX Cubeをつくりぶつける 球体の数に合わせてCubeサイズを変更する、X軸に細長
  87. boxResizeValue =(1.2*gKakudai, 1, 1) #次はここから2024/10/18 デフォルト(7.0, 1, 1)を想定
  88. boxLocation =(1*gKakudai, 2.5, 1)# location=(0, 2.5, 1) Cube位置を変更する
  89. funcMakeBox(boxResizeValue,boxLocation)
  90.  
  91. #球体生成
  92. loc=(0,0,0)
  93. ylocation=1.0#手前の奥行き
  94. zlocation=4.0#高さ
  95. yMoveLocation=-2.0
  96. defaultFrame=20
  97. localFrame=defaultFrame
  98. for i in range(len(gParamaterList)):
  99. if i <15: -="" 0="" 2024="" 30="" __init__="" alse="" blender-softbody="" bpy.context.scene.frame_end="300" bpy.context.scene.frame_set="" bpy.data.objects:="" bpy.ops.object.modifier_add="" cgbox.jp="" classcapcelparamatercloth:="" data_path="location" def="" defaultframe="" else:="" end="" for="" frameposition="" funcmakesphere="" funcmatome="" gparamaterlist="" gxlocation="" https:="" i="" if="" in="" index_id2="" kyori="" list="" loc="" localframe="0" obj.keyframe_insert="" obj.location.y="ylocation#初期値" obj.name:="" obj.select_set="" obj="" objname="" oft="" print="" rue="" self="" str="" type="SOFT_BODY" ube="" ylocation="" zlocation=""> None:
  100. print("class const")
  101. self.kyori= kyori#オブジェクトのX座標
  102. self.objName= objName#Obj type name:Cylinder
  103. self.list= list#Wiggle2のStiffのパラメータ配列、ボーンの数だけ必要なので、ボーンの数はこの配列の要素数で自動で取得
  104. self.number= 0
  105.  
  106. def __del__(self):
  107. print("del デストラクタ、何もしないけど")
  108.  
  109. def myNamePrint(self):# class 自分自身 出力
  110. function_name = inspect.currentframe().f_code.co_name# この部分は関数中でPrintで使える
  111. class_name = self.__class__.__name__
  112. print('{}.{}'.format(function_name, class_name))
  113. #end Class
  114.  
  115. if __name__ == "__main__":
  116. print("*************************************************")
  117. print("*************************************************")
  118. print("****************** Start ***********************")
  119. #main GO
  120. # 3Dカーソルの位置を元に戻す
  121. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  122.  
  123. funcMatome()
  124.  
  125. print("****************** end ***********************")
  126.  
株式ランキング
株式ランキング にほんブログ村 株ブログ 株 デイトレードへ
にほんブログ村 にほんブログ村 デザインブログ 3DCGへ
にほんブログ村

このブログの人気の投稿

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

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

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