忘却まとめ

Blenderの中級者・上級者向けの踏み込んだ情報や、アドオン・3DCGに関する情報を記事にします

パーティクルヘアーからカーブを作成するスクリプト・ヘアーのポイント位置を取得する方法【Blender / Python】

Python

更新日:

パーティクルヘアーのポイントを取得して、カーブのスプラインを作成する方法を紹介する。

ちなみに下記のサンプルスクリプトの処理は、通常の機能だけでも同様のことができる(パーティクルモディファイアのメニューからメッシュに変換したあとカーブに変換する。ウェイトは引き継げない)。

スクリプト

# カーブ作成
cv_data = bpy.data.curves.new("cv","CURVE")
cv_obj = bpy.data.objects.new("cv",cv_data)
cv_obj.data.bevel_depth = 0.1
cv_obj.data.dimensions = '3D'
bpy.context.collection.objects.link(cv_obj)

# パーティクルオブジェクト
dg = context.evaluated_depsgraph_get()
pt_obj = context.object.evaluated_get(dg)
pt_obj_mw = pt_obj.matrix_world
act_pt = pt_obj.particle_systems.active

# パスを回す
for path in act_pt.particles:
    newcv = cv_obj.data.splines.new('POLY')
    # ポイントを追加する(既に2ポイントはあるので引く必要がある)
    if len(path.hair_keys) > 2:
        newcv.points.add(len(path.hair_keys)-1)
    # ポイントの位置・ウェイト・半径を設定する
    for i,ky in enumerate(path.hair_keys):
        new_co = pt_obj_mw @ ky.co
        new_co = cv_obj.matrix_world.inverted() @ new_co
        new_co = (
        new_co[0],
        new_co[1],
        new_co[2],
        1
        )
        pt = newcv.points[i]
        pt.co = new_co
        pt.radius = ky.weight
        pt.weight_softbody = ky.weight

上のスクリプトでは、
cvというカーブオブジェクトを作成し、
アクティブオブジェクトのアクティブなパーティクルヘアーのポイントの
位置・ウェイト・半径を引き継いだカーブスプラインを作成する。

参考

パーティクルヘアーのポイント位置は、coだけではうまく取得できないため、evaluated_depsgraph_getというモディファイアやコンストレイントなどの影響を受けた最終的なオブジェクトの結果を得ることができる要素を使うことで位置を得ることができる模様。

python - Making sense of hair_key coordinates - Blender Stack Exchange

アドオンの制作依頼はこちら

-Python

Copyright© 忘却まとめ , 2021 All Rights Reserved Powered by STINGER.