柔らか物体クロースオブジェクト比較パラメータ調査(途中経過)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 は数値が低いと弾まないし着地すると凹むような動きをする。



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





 
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  ***********************")    

株式ランキング
株式ランキング にほんブログ村 株ブログ 株 デイトレードへ
にほんブログ村 にほんブログ村 デザインブログ 3DCGへ
にほんブログ村

このブログの人気の投稿

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

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

10/15デイトレは、ジュース代を確保した、日経平均が4万200円超