Blenderで紙作る_05(FGO)
VSCodeからBlenderに戻ってきた。
でも配置の計算も重いしリジッドボディの計算も重すぎて落ちた。
↓の状態でわくわくしてシミュレーション開始したら落ちた。
つらい…
シミュレーションで落ちるのは頂点増やしまくってるからだと思いますが
↓頂点増やしてる原因のモディファイアをビュー上全部オフにして再度複製&シミュレーションしました。
そしたらペラペラの平面で作ってるせいで落ちたら床に溶けました。
ソリッドだけONにすべきかな…
というか複製オブジェクトをまとめて操作する手段がほしいですね…
毎回複製再生成するには計算が遅いのでなさそうなら前のコード改造が必要かも…
→→調べたらリジッドボディコピー方法はあったので解決。
リジッドコピー用ベースオブジェクトを、メッシュ使うオブジェクトとは別にとっておいてコピーすればいいや。
リジッド側で衝突マージン設定したらいい感じになりました。
ついでにコードも改善したので計算が早くなってニッコリ。
前からこんな感じに変えました。
・オブジェクト作成と同時に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
テンション上がってきたのでプロシージャルテクスチャをノードで組みました。
ノード作成時の意図やらは忘れそうなので解説付き画像を作成。(波テクスチャ4つもいらないことに気づいたので解説付きでは2つに減ってます)
まだまだ作りたいオブジェクトはあるけど次は試しにちゃんとカメラ置いてレンダリングしてみようかなー
この記事が気に入ったらサポートをしてみませんか?