Blenderで紙作る_05(FGO)

VSCodeからBlenderに戻ってきた。

でも配置の計算も重いしリジッドボディの計算も重すぎて落ちた。
↓の状態でわくわくしてシミュレーション開始したら落ちた。
つらい…

画像1

シミュレーションで落ちるのは頂点増やしまくってるからだと思いますが
↓頂点増やしてる原因のモディファイアをビュー上全部オフにして再度複製&シミュレーションしました。

画像3

そしたらペラペラの平面で作ってるせいで落ちたら床に溶けました。
ソリッドだけONにすべきかな…

画像2

というか複製オブジェクトをまとめて操作する手段がほしいですね…
毎回複製再生成するには計算が遅いのでなさそうなら前のコード改造が必要かも…
→→調べたらリジッドボディコピー方法はあったので解決。

画像4

リジッドコピー用ベースオブジェクトを、メッシュ使うオブジェクトとは別にとっておいてコピーすればいいや。

画像5

リジッド側で衝突マージン設定したらいい感じになりました。
ついでにコードも改善したので計算が早くなってニッコリ。
前からこんな感じに変えました。
・オブジェクト作成と同時にBVHTree作って保持するようにした
・シーンにlinkしてからmatrix_world取得するのやめて、
 matrix_worldにmathutils使って計算で配置後のmatrix_world求めることで
 unlinkのままでも重なり検出できるようにした

コード的にはこの辺ですね。


import math
import random
from typing import List, Tuple

import bpy
from bpy.types import Collection, Object, Scene
from mathutils import Euler, Matrix, Vector
from mathutils.bvhtree import BVHTree

class ObjWithBvh:
   """
   blenderのオブジェクト+BVH
   作成時にBVH計算して保持
   """

   def __init__(self, obj: Object, location=[0.0, 0.0, 0.0], rotation=[0.0, 0.0, 0.0]) -> None:
       self.obj = obj
       self.bvh = ObjWithBvh._create_bvh(obj, location, rotation)

   @staticmethod
   def _create_bvh(obj: Object, location, rotation):
       """
       参考:https://katsumi3.hatenablog.com/entry/2020/03/20/183925
       Blenderオブジェクト+位置情報+回転情報からBVH作成する
       シーンにリンクしてなくてOK
       拡大は非対応なので必要であれば実装する
       """

       loc_matrix = Matrix.Translation(location)
       rot_matrix = Euler(rotation).to_matrix().to_4x4()

       mat = obj.matrix_world @ loc_matrix @ rot_matrix
       vert = [mat @ v.co for v in obj.data.vertices]
       poly = [p.vertices for p in obj.data.polygons]
       bvh = BVHTree.FromPolygons(vert, poly)
       return bvh


テンション上がってきたのでプロシージャルテクスチャをノードで組みました。

画像6

画像7

ノード作成時の意図やらは忘れそうなので解説付き画像を作成。(波テクスチャ4つもいらないことに気づいたので解説付きでは2つに減ってます)
まだまだ作りたいオブジェクトはあるけど次は試しにちゃんとカメラ置いてレンダリングしてみようかなー

この記事が気に入ったらサポートをしてみませんか?