blender-bpy
襖を作るアドオンです。 なんとなく日本家屋っぽいものを作ろうとしたときに窓とか襖とか同じような形状が多くないですか? 多いですよね。なのでこういうのあれば楽だろうなと思って作りました。 多角形でもできるようにとかどんな角度でもとやってたら結構…
自作アドオンが遅い。 何が遅いのか調べてみたメモ ops系が遅いのはすでに調査済み 結論として遅くなる原因はblender関連だけでその他はひどく遅くなることはなかった。 テスト用にめちゃめちゃ沢山print文つけてるとか、オブジェクトを取得する際に名前で取…
それぞれの辺の中点を比較して一番zが低い値を一番下としている スクリプトの最初位にやってて間違えてて、後の設定全部直す羽目になってて今半泣き状態。 一番最後の番号の時は最初の番号の頂点の中点をとる。 import bpy,bmesh from mathutils import Mat…
指定した辺を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…
Matrixを使ってオブジェクトを操る グローバル座標での移動 正直言うとグローバル座標ではobj.location、obj.rotation、obj.scaleを使った方が楽だし早い。 グローバル座標でオブジェクトをZ方向に1移動する obj.location = obj.location + Vector((0,0,1)) …
blender bpyでops系が遅いのはわかってるがdata系ではmesh、bmesh、Matrix・・・どれが早いのか実際に調べてみた簡単に立方体をグローバルY方向に3移動を100回繰り返す 長いので最初に結論。・オブジェクトモードならobj.locationとmatrix_world.translation…
平面をオブジェクトモードで拡大縮小してから編集モードで回転させてcalc_angle()で角の角度を取得すると値がおかしい。 3Dビューのビューポートオーバーレイで面の角度表でも同じ現象が起きてる どの辺も90°になるはずなのだが・・・内部が同じかどうかは…
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 =…
自作アドオンで何回か使いそうな気がするのでいくつか作っておこうと思う オブジェクトの原点にてエンプティを置く(回転はローカル座標の回転方向) オブジェクトの中心にエンプティを置く(回転はローカル座標の回転方向) オブジェクトの一番下の辺の真ん…
アドオンにいろんな機能をつけようと思うとどんどん重たくなってしまう。 実はbpy.ops系は重たいのだ・・・。回避方法 ・何でもかんでもモジュールを呼ばない ・アドオン使用時の数値入力するところを別の場所に作る ・bpy.ops系を使わない 何でもかんでもモ…
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の頂点座標が取得…
↓自作アドオンを使うときにこういうのを表示したい オペレータプロパティという名前だそうですね。 使う方法 ・チェックボックスなど使う入力欄の種類ごとにインポートが必要 ・下のアドオン基本構造の「ここからここまで」のところに使用する入力欄の設定を…
頂点1と頂点3の距離を知りたい 方法は5つある。 ・公式から計算する ・calc_lengthで辺2の長さを取得する(ローカル座標のみ) ・.lengthを使う ・numpyを使う ・scipyを使う(blenderにPIP必要) 公式から計算する この場合はそんなに長くないし確実にやっ…
bmeshのデータ更新について調べてみた。 オブジェクトモードと編集モードでは更新タイミングが違うので要注意。長くなるので結論だけ先に書く ################################## オブジェクトモードで使う場合 命令文: bm = bmesh.new() bm.from_mesh(pla…
オブジェクトモードのままbmeshをいじるのと編集モードでいじるのを同じbmという名前にしたら落ちた。 (どこで落ちるか調べるように作ったやつなので中身に意味はない) def内のbpy.ops系が動かなくなった件を調べようと作ったがops系が動かない現象再現せず…
角棒の厚みや太さを変えずに端面を角度を指定して変更したいので作ってみた 角棒の長手方向をローカルのX軸とする 直方体のみ使用可能(二回目からは指定した角度での辺の移動量しか動かない) import bpy , bmesh from math import radians , tan obj = bpy…
輪になってるメッシュで今の頂点座標を隣の頂点座標に足して・・・最後の頂点と一番最初の頂点座標に足すというのをしたい時用。 これはしっかりメモとりたい・・・。というようなfor文を書くには import bpy , bmesh obj=bpy.context.object bpy.ops.object…
手動だとカーソルを介してオブジェクトの原点を移動するんだけどカーソルを動かすの超めんどいのでMatrix_worldを使って移動する。手順としては ・編集モードで全部の頂点(メッシュ)を新しく設定したい原点位置からの距離に移動 ・オブジェクトモードでオ…
編集モードにしてからbmesh.from_edit_mesh(obj.data)してたけど編集モードにしなくてもbmesh使える。 頂点の座標だけ取ってすぐ別のオブジェクトを編集したいときとかに便利。こんなのあるなんて知らなかったよ…。編集モードを使う場合 import bpy, bmesh o…
meshの順番(index)を表示させるアドオンidCheckerを作った。(Blender2.81向け) 普通のモデリングでは全く必要ないが、あらかじめ用意しておいたオブジェクトの頂点をスクリプトでいじるのに役に立つ...と思う。 初めてgithubを登録して初めてスクリプト…
UIにボタンを追加したいけど検索すると唐突にclassが現れ混乱したので書く。BlenderAPIリファレンスによれば、ボタンを追加するにはclassを使わないといけないらしい。 そして以下の手順が必要らしい。 ・bpy.types.Operatorを使ったクラスを作る ・drawを使…
多角形の内角を知りたい。 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…
3Dビュー→追加→メッシュ→立方体で作られるメッシュと同じものを作りたい。この立方体実はBlenderを起動したときに出てくる立方体とは面の向きが違うのでちょっと注意が必要なのである。 bpy.ops系の場合 一行で済む bpy.ops.mesh.primitive_cube_add(enter_…
図の通り、回転する軸を指定して回転させたい 手動の場合 編集モードで回転させたい軸を選択して メッシュ→スナップ→カーソル→選択物 にして トランスフォームピポットポイントを3Dカーソルにして 後はrを押して回転させればいい。 pythonスクリプトの場合 …
マトリックスワールドの定義は分かったものの使い方がよく分からなかった。 以下のリンクを読んだらよく分かった。大抵自分が悩んでる事は先人がQ&Aしてるので感謝。 とりあえずめもめも。 余談だけどグーグル翻訳が優秀で解説サイトを読むのがホントに楽に…
座標軸を表すマトリックスワールドを理解しとけば三角関数やら複雑な式を使わなくてもメッシュの移動や変形が楽になるハズ。定義 マトリックスワールドとはある座標軸の傾きと原点からの距離を表したもの解説 図のように任意の座標軸をエンプティとすると分…
pythonコンソールでオートコンプリート機能を使うとインフォメーションウィンドウより詳しい事が分かる。 上の緑色がpythonコンソールでbpy.ops.transform.resize(と入力した後ctrl+スペースキー 青色が3Dビューで拡大縮小を使用したもの ちゃんとドキュメ…
メモメモ・・・ 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) ..…
指定したベクトル(ここではノーマル)の方向に頂点を移動する。 new_locのところまでは頂点の値はグローバル座標なので、マトリックスワールドを逆さ(invert)させたものを掛けてローカル座標に直している obj=bpy.data.objects['立方体.003'] mw=obj.matr…
bpy.ops系は遅いのですよ・・・。 あとどれがアクティブでセレクトなのかとか後で改造するときに調べるの大変なのでなるべくbpy.data系を使っていきたい今日この頃・・・ 拡大縮小 import bpy #bpy.ops系(ローカル座標基準の場合のみ) bpy.ops.transform.res…