アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

blender-bpy

Blender addon配布 襖を作るアドオン

襖を作るアドオンです。 なんとなく日本家屋っぽいものを作ろうとしたときに窓とか襖とか同じような形状が多くないですか? 多いですよね。なのでこういうのあれば楽だろうなと思って作りました。 多角形でもできるようにとかどんな角度でもとやってたら結構…

blender python 何が遅いのか調べてみた

自作アドオンが遅い。 何が遅いのか調べてみたメモ ops系が遅いのはすでに調査済み 結論として遅くなる原因はblender関連だけでその他はひどく遅くなることはなかった。 テスト用にめちゃめちゃ沢山print文つけてるとか、オブジェクトを取得する際に名前で取…

Blender python 一番下の辺のindexを取得する。

それぞれの辺の中点を比較して一番zが低い値を一番下としている スクリプトの最初位にやってて間違えてて、後の設定全部直す羽目になってて今半泣き状態。 一番最後の番号の時は最初の番号の頂点の中点をとる。 import bpy,bmesh from mathutils import Mat…

Blender python 指定した辺をUVテクスチャの下方向にする

指定した辺をUVテクスチャの下方向にする。 ただしオブジェクトは一枚の板ポリの場合 import bpy,bmesh from mathutils import Matrix #指定した辺(ループ) loop_no = 5 plane = bpy.context.object msh = plane.data p_mat = plane.matrix_world.copy() n…

Blender bpy Marix_worldでオブジェクトを操る

Matrixを使ってオブジェクトを操る グローバル座標での移動 正直言うとグローバル座標ではobj.location、obj.rotation、obj.scaleを使った方が楽だし早い。 グローバル座標でオブジェクトをZ方向に1移動する obj.location = obj.location + Vector((0,0,1)) …

blender python 最速伝説

blender bpyでops系が遅いのはわかってるがdata系ではmesh、bmesh、Matrix・・・どれが早いのか実際に調べてみた簡単に立方体をグローバルY方向に3移動を100回繰り返す 長いので最初に結論。・オブジェクトモードならobj.locationとmatrix_world.translation…

blender python 角度の値がおかしい時

平面をオブジェクトモードで拡大縮小してから編集モードで回転させてcalc_angle()で角の角度を取得すると値がおかしい。 3Dビューのビューポートオーバーレイで面の角度表でも同じ現象が起きてる どの辺も90°になるはずなのだが・・・内部が同じかどうかは…

normalをグローバル座標に変換する

matrix_world を掛ければいいかと思ってたらそうでもなかった。 import bpy obj = bpy.context.object mat = obj.matrix_world msh = obj.data norm = msh.polygons[0].normal mx_inv = mat.inverted() mx_norm = mx_inv.transposed().to_3x3() world_norm =…

Blender python オブジェクトの一番下にエンプティを置く

自作アドオンで何回か使いそうな気がするのでいくつか作っておこうと思う オブジェクトの原点にてエンプティを置く(回転はローカル座標の回転方向) オブジェクトの中心にエンプティを置く(回転はローカル座標の回転方向) オブジェクトの一番下の辺の真ん…

blender python アドオンの動きを軽くする

アドオンにいろんな機能をつけようと思うとどんどん重たくなってしまう。 実はbpy.ops系は重たいのだ・・・。回避方法 ・何でもかんでもモジュールを呼ばない ・アドオン使用時の数値入力するところを別の場所に作る ・bpy.ops系を使わない 何でもかんでもモ…

blender python UV頂点座標の取り方メモ

uvの頂点データの編集方法がよく分からないimport bpy,bmesh obj = context.active_object msh = obj.data bm = bmesh.from_edit_mesh(msh)uv_layer = bm.loops.layers.uv.active bm.faces[0].loops[0][uv_layer].uvという謎のコマンドでUVの頂点座標が取得…

Blender python アドオン使用時の数値入力欄の作り方(オペレータプロパティの使い方)

↓自作アドオンを使うときにこういうのを表示したい オペレータプロパティという名前だそうですね。 使う方法 ・チェックボックスなど使う入力欄の種類ごとにインポートが必要 ・下のアドオン基本構造の「ここからここまで」のところに使用する入力欄の設定を…

Blender python頂点間の距離を取得する5つの方法

頂点1と頂点3の距離を知りたい 方法は5つある。 ・公式から計算する ・calc_lengthで辺2の長さを取得する(ローカル座標のみ) ・.lengthを使う ・numpyを使う ・scipyを使う(blenderにPIP必要) 公式から計算する この場合はそんなに長くないし確実にやっ…

Blender python bmeshのデータ更新のタイミング

bmeshのデータ更新について調べてみた。 オブジェクトモードと編集モードでは更新タイミングが違うので要注意。長くなるので結論だけ先に書く ################################## オブジェクトモードで使う場合 命令文: bm = bmesh.new() bm.from_mesh(pla…

Blender python bmeshを重ねて使ったらBlender落ちた

オブジェクトモードのままbmeshをいじるのと編集モードでいじるのを同じbmという名前にしたら落ちた。 (どこで落ちるか調べるように作ったやつなので中身に意味はない) def内のbpy.ops系が動かなくなった件を調べようと作ったがops系が動かない現象再現せず…

blender python 角度を指定してshearする

角棒の厚みや太さを変えずに端面を角度を指定して変更したいので作ってみた 角棒の長手方向をローカルのX軸とする 直方体のみ使用可能(二回目からは指定した角度での辺の移動量しか動かない) import bpy , bmesh from math import radians , tan obj = bpy…

blender python forの最後にゼロ番目の値を使いたい

輪になってるメッシュで今の頂点座標を隣の頂点座標に足して・・・最後の頂点と一番最初の頂点座標に足すというのをしたい時用。 これはしっかりメモとりたい・・・。というようなfor文を書くには import bpy , bmesh obj=bpy.context.object bpy.ops.object…

blender python オブジェクトの原点を座標指定して移動する

手動だとカーソルを介してオブジェクトの原点を移動するんだけどカーソルを動かすの超めんどいのでMatrix_worldを使って移動する。手順としては ・編集モードで全部の頂点(メッシュ)を新しく設定したい原点位置からの距離に移動 ・オブジェクトモードでオ…

blender python bmeshをオブジェクトモードで使う方法

編集モードにしてからbmesh.from_edit_mesh(obj.data)してたけど編集モードにしなくてもbmesh使える。 頂点の座標だけ取ってすぐ別のオブジェクトを編集したいときとかに便利。こんなのあるなんて知らなかったよ…。編集モードを使う場合 import bpy, bmesh o…

Blender python meshの順番(index)を表示するアドオン

meshの順番(index)を表示させるアドオンidCheckerを作った。(Blender2.81向け) 普通のモデリングでは全く必要ないが、あらかじめ用意しておいたオブジェクトの頂点をスクリプトでいじるのに役に立つ...と思う。 初めてgithubを登録して初めてスクリプト…

Blender python UIにボタンを追加する

UIにボタンを追加したいけど検索すると唐突にclassが現れ混乱したので書く。BlenderAPIリファレンスによれば、ボタンを追加するにはclassを使わないといけないらしい。 そして以下の手順が必要らしい。 ・bpy.types.Operatorを使ったクラスを作る ・drawを使…

blender python 多角形の内角を知りたい

多角形の内角を知りたい。 bmeshを使う場合 一枚のポリゴンの場合 import bpy, bmesh from math import degrees obj = bpy.context.object bpy.ops.object.mode_set(mode = 'EDIT') bm = bmesh.from_edit_mesh(obj.data) bm.faces.ensure_lookup_table() rad…

Blender pythonでメッシュから立方体を作る。

3Dビュー→追加→メッシュ→立方体で作られるメッシュと同じものを作りたい。この立方体実はBlenderを起動したときに出てくる立方体とは面の向きが違うのでちょっと注意が必要なのである。 bpy.ops系の場合 一行で済む bpy.ops.mesh.primitive_cube_add(enter_…

Blender python マトリックスワールドで回転させる

図の通り、回転する軸を指定して回転させたい 手動の場合 編集モードで回転させたい軸を選択して メッシュ→スナップ→カーソル→選択物 にして トランスフォームピポットポイントを3Dカーソルにして 後はrを押して回転させればいい。 pythonスクリプトの場合 …

Blender pythonマトリックスワールドの使い方の解説が分かりやすいリンク

マトリックスワールドの定義は分かったものの使い方がよく分からなかった。 以下のリンクを読んだらよく分かった。大抵自分が悩んでる事は先人がQ&Aしてるので感謝。 とりあえずめもめも。 余談だけどグーグル翻訳が優秀で解説サイトを読むのがホントに楽に…

Blender python マトリックスワールドとは

座標軸を表すマトリックスワールドを理解しとけば三角関数やら複雑な式を使わなくてもメッシュの移動や変形が楽になるハズ。定義 マトリックスワールドとはある座標軸の傾きと原点からの距離を表したもの解説 図のように任意の座標軸をエンプティとすると分…

blender python コマンドのメモ

pythonコンソールでオートコンプリート機能を使うとインフォメーションウィンドウより詳しい事が分かる。 上の緑色がpythonコンソールでbpy.ops.transform.resize(と入力した後ctrl+スペースキー 青色が3Dビューで拡大縮小を使用したもの ちゃんとドキュメ…

Blender python mesh について

メモメモ・・・ obj = bpy.context.object msh = bpy.data.meshes[obj.data.name] #面に含まれる頂点のidをまとめて出力 msh.polygons[0].vertices[0:] #ループでidを使いたい時 p = msh.polygons[0] for i , id in enumerate(p.vertices): ... print(id) ..…

Blender python 指定したベクトルの方向に頂点を移動

指定したベクトル(ここではノーマル)の方向に頂点を移動する。 new_locのところまでは頂点の値はグローバル座標なので、マトリックスワールドを逆さ(invert)させたものを掛けてローカル座標に直している obj=bpy.data.objects['立方体.003'] mw=obj.matr…

Blender python なるべくbpy.opsを使わない方法

bpy.ops系は遅いのですよ・・・。 あとどれがアクティブでセレクトなのかとか後で改造するときに調べるの大変なのでなるべくbpy.data系を使っていきたい今日この頃・・・ 拡大縮小 import bpy #bpy.ops系(ローカル座標基準の場合のみ) bpy.ops.transform.res…