柔らか物体クロースオブジェクト比較パラメータ調査(途中経過)BlenderPythonスクリプト
クロースClothオブジェクト比較
柔らかい物体になるパラメータはどれかを調査(途中経過)
ファイル:clothButsuriEnzan_TYPE_B物体をぶつける_021.py
動画
Blender4.2、Pythonを使用
クロースやソフトボディなどの物理演算はパラメータが多いしどれくらいの値を入力すればどれくらいの柔らかいオブジェクトが生成できるかわからない。ある程度数値化することで、作業の手間を省く、Pythonスクリプトを使って自動化でクロースオブジェクトの比較調査をする。
クロースの他に柔らか物体を表現するソフトボディがあるがあまりパラメータがない。また使い道がボールとかプリンくらいしかない。
実験は、ボール(クロースモディファイア)を床(板プレーン)に落とす形式。
(途中経過なのでわかりにくかったり何がなんだかわからないかもしれん。色々と試すが明確な値を決められない。知りたいのはこの値を入れると柔らかいとか反発するとか粘りがあるとかなど。もう少し時間をかければよいが時間がかかるとやる気が無くなって放置してしまうおそれがある。このままだとアップを忘れるので途中経過だが、記載しておく)
結果表、ここに記載予定
忘れないうちにわかったことを記載しておく。色々と試すが期待できるような効果を説明できる数値が見つけられない。微妙な数値をチクチクといじって確認する感じで面倒。まさにこれが無料のアプリの悪いところ。動かさないと結果がわからない。パラメータ同士の連携ができていないので、本当はある数値のしきい値を高くしないと効果が現れないのにそのエラーと警告が表示されないので、ユーザーはどのパラメータの数値をいじればよいのかわからない。(無料なんだから文句を言うなby開発者、たぶん)
結果表はできればスプレッドシートできれいにしたいがアクセス数がない割にやることが面倒なのでコードをキャプして貼るだけにするけど見てくれた人には申し訳ない。時間を見つけてきれいな表にする。
英語の意味:Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする pressure圧力 Stiff硬さ、曲がりにくい
以下スクリプトで、ボール(クロースモディファイア)を床(板プレーン)新規作成して物理演算設定を与える。
import os import bpy import math import copy import time import inspect#関数名を出力するためだけのもの #2024/10/9 #print文はBlenderのメニューバーの Window > Toggle System Consoleを実行するとDOS窓が表示される #板 原点 def funcMakePlane(resizeValue,loc): #resizeValue =value=(-5, -5, -5) リサイズのところのX軸側を大きくする予定 bpy.ops.mesh.primitive_plane_add(size=2, enter_editmode=False, align='WORLD', location=loc, scale=(1, 1, 1)) 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) #bpy.ops.rigidbody.object_add() #bpy.context.object.rigid_body.type = 'PASSIVE' bpy.ops.object.modifier_add(type='COLLISION') bpy.context.object.collision.absorption = 0.1 #BOX Cube def funcMakeBox(resizeValue,loc): #BOXの生成位置の変更はlocation=(0, 2.5, 1)を変更する。サイズは現在value=(7.0, 1, 1)X軸に大きくしてる。正確に測っていない。2024/10/18 bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=loc, rotation=(0, 0, 0), scale=(1, 1, 1)) bpy.ops.transform.resize(value=resizeValue, orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL',\ constraint_axis=(True, False, False), 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) bpy.ops.object.modifier_add(type='COLLISION') bpy.context.object.collision.absorption = 0.1 #球体 Cloth設定の引数が多すぎ def funcMakeSphere(loc,tension_stiffness,compression_stiffness,uniform_pressure_force,pressure_factor,collision_settings_distance_min): #glocation=loc#(0, 0, 2)Z軸に2m固定、X軸に並べていく bpy.ops.mesh.primitive_uv_sphere_add(radius=1, enter_editmode=False, align='WORLD', location=loc, scale=(1, 1, 1)) #bpy.data.window_managers["WinMan"].[2] = 1 #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)) #Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする pressure圧力 Stiff硬さ、曲がりにくい #bpy.context.space_data.context = 'MODIFIER' bpy.ops.object.modifier_add(type='CLOTH') bpy.context.object.modifiers["Cloth"].settings.tension_stiffness = tension_stiffness#15 bpy.context.object.modifiers["Cloth"].settings.compression_stiffness = compression_stiffness#15 bpy.context.object.modifiers["Cloth"].settings.use_pressure = True bpy.context.object.modifiers["Cloth"].settings.uniform_pressure_force = uniform_pressure_force#0.05 bpy.context.object.modifiers["Cloth"].settings.pressure_factor = pressure_factor#30 bpy.context.object.modifiers["Cloth"].collision_settings.distance_min = collision_settings_distance_min#0.015 #end def #All def funcMatome(): bpy.ops.object.mode_set(mode='OBJECT') gXlocation=0#球体のX座標位置初期値は原点 gParamaterList=[]#クロースのパラメータ用配列 #球体だけ複数作成、X軸に並べる 15個を超えると原点に戻す。なお30個以上の要素数は想定していない。理由は多すぎるから。 #Tension引張力 compression 圧縮,押し縮める押しつぶす小さくする pressure圧力 Stiff硬さ、曲がりにくい # 1tension 2compression 3pressureForce 4factor distance gParamaterList.append([100, 15, 0.05, 30, 0.015])#(1)Tension大きめで硬い gParamaterList.append([100, 15, 0.05, 5, 0.015])#(1)硬い (4)factor弱めで凹む弾まない gParamaterList.append([15, 15, 0.05, 30, 0.015])#デフォルト設定 gParamaterList.append([15, 15, 0.1, 30, 0.015])#(3)pressureForce gParamaterList.append([15, 15, 0.5, 30, 0.015])#(3)pressureForce 0.5以上で大きいと瞬時に膨張膨らむ 強め gParamaterList.append([15, 15, 1.0, 30, 0.015])#(3)pressureForce もっと強め gParamaterList.append([15, 15, 1.0, 60, 0.015])#(3)pressureForce もっと強めで膨張(4)factor大きくすると弾む gParamaterList.append([15, 15, 0.05, 5, 0.015])#(4)factor弱めで凹む弾まない gParamaterList.append([15, 5, 0.05, 5, 0.015])# gParamaterList.append([5, 5, 0.05, 30, 0.015])#柔らか gParamaterList.append([5, 15, 0.05, 10, 0.015])#(2)compressionを少し多め gParamaterList.append([5, 40, 0.05, 10, 0.015])#(2)を大きくしたことで少し中が詰まったような柔らかさが減っている(ぎゅっと押し込んだような感じ) gParamaterList.append([5, 5, 0.05, 10, 0.015])#柔らかで、弾力がない雰囲気 gParamaterList.append([5, 5, 0.05, 5, 0.015])# gParamaterList.append([5, 5, 0.008, 5, 0.015])#(3)pressureForceかなり低め(4)弱いで、ポニョポニョブヨブヨ #16個目からはこっちに記載 #板生成 gKakudai=len(gParamaterList)#数が多くなる事にX軸に対して板のサイズをX軸方向に拡大していく resizeValue =(-2*gKakudai, -10, -5) #Y軸にも拡大 loc =(0.5*gKakudai, 0.0, 0.0)#ずらすX座標はあいまいなので調整が必要 funcMakePlane(resizeValue,loc) #球体揺れアニメーションを作成するつもりが当該物理演算物体は外部制御による任意に動かせないので、別の物体をぶつけるかボーンで制御させる #別の物体をぶつける方法で試す #BOX Cubeをつくりぶつける 球体の数に合わせてCubeサイズを変更する、X軸に細長 boxResizeValue =(1.2*gKakudai, 1, 1) #次はここから2024/10/18 デフォルト(7.0, 1, 1)を想定 boxLocation =(1*gKakudai, 2.5, 1)# location=(0, 2.5, 1) Cube位置を変更する funcMakeBox(boxResizeValue,boxLocation) #球体生成 loc=(0,0,0) ylocation=1.0#手前の奥行き zlocation=4.0#高さ yMoveLocation=-2.0 defaultFrame=20 localFrame=defaultFrame for i in range(len(gParamaterList)): 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: print("class const") self.kyori= kyori#オブジェクトのX座標 self.objName= objName#Obj type name:Cylinder self.list= list#Wiggle2のStiffのパラメータ配列、ボーンの数だけ必要なので、ボーンの数はこの配列の要素数で自動で取得 self.number= 0 def __del__(self): print("del デストラクタ、何もしないけど") def myNamePrint(self):# class 自分自身 出力 function_name = inspect.currentframe().f_code.co_name# この部分は関数中でPrintで使える class_name = self.__class__.__name__ print('{}.{}'.format(function_name, class_name)) #end Class if __name__ == "__main__": print("*************************************************") print("*************************************************") print("****************** Start ***********************") #main GO # 3Dカーソルの位置を元に戻す bpy.context.scene.cursor.location=(0.0,0.0,0.0) funcMatome() print("****************** end ***********************") 15:>
株式ランキング
にほんブログ村
にほんブログ村