アストラルプリズム

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

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 addon配布 平面に枠をつけるアドオン

平面に枠をつけるアドオンを作った(blender2.8対応) 枠の幅は2種類のが交互につく。 使い方 平面を選択してから3Dビュー→追加→メッシュ→枠 一個のオブジェクトに一個の平面があるもののみ使用可能。 枠の種類は額縁風、風車風、梯子風の3つ。 枠にはすべ…

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

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

Visual Studio code python スクリプトを自動で見やすく書き直す

スクリプトを見やすく書くのって結構大変。 a+b=c にスペースを入れたりして a + b = c のように見やすく書き直してしてくれる機能があるみたい(整形という)。 こういうのみんな手動でやってるのかと思ってた、こんな便利なものあるなんて知らなかった(;´Д…

blender python 平面のへこみを調べる

平面のへこみを調べる方法 bm.faces[0].loops[0].is_convex 凹んでいるときにfalseになる loopにそって円になってるなら右に曲がってるのが凹みになっている 以下理屈だとこうなる import bpy , bmesh obj = bpy.context.object bpy.ops.object.mode_set(mod…

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 ノーマルの向き

ノーマル軸に沿って操作する時の注意 (辺や頂点のノーマル方向は数値で取れない) 物体の面を選択してる場合 面の垂直方向はノーマルZ軸なのは一定。 面の長手方向が自動的にノーマルY軸になる。 何の罠だよ何の罠だよ何の罠だよ!! 変形させた後にノーマ…

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…

Blender python コンソールでは動くのにテキストエディタからだと動かない場合

分からん具合が高まって死にそうになる テキストエディタから実行した時とpythonコンソールで結果が違う場合も同じ 原因 ・前のデータが残ってる ・importするものが足りない ・bmeshにbm.faces.ensure_lookup_table()が必要 ・変更が更新されてない 前のデ…

python 四捨五入と切り上げ、切り捨て

四捨五入 import math math.round(4.5) 結果 4 math.round(4.6) 結果 5 pythonの四捨五入は五捨六入なので要注意 桁の指定は math.round(4.563,2) 結果 4.56 切りあげ math.ceil(2.2) 結果 3 切り捨て math.floor(2.2) 結果 2mathを付けたらながくて困る場合…

Blender python 平面に垂直かつ外向きにオブジェクトを置く

毎度毎度座標系のスクリプトを作ろうとして、ド忘れしてひどい目に合うので、分からないなりに考え方と手順を書く。 それぞれの辺の中心に面に垂直かつ面の外側に向かってモンキーを置きたい 図にするとこんな感じ。 手順 1、面の垂直方向を調べる 2、辺の外…

Blender python mesh・bmeshで取得した値がおかしい

毎回ドはまりして死ぬのでしっかりメモをとっていきたい。 原因 ・コマンドが違う(一度消したデータが残ってる) ・トランスフォームされてる ・matrix_worldを掛ける順番が違う ・ベクトルの掛け算の記号がBlender2.8から@に変わった コマンドが違う mesh…

Blender python用にVisualStudioCodeを使う(注意点)

Blenderのテキストエディタは日本語入力ができないので(外部からコピペは可能)スクリプト作ってて頭おかしくなりそうなのでいい加減何とかしたい 2019.12.22に書いてるので変わるかも。 とりあえずメモ帳でもなんでもいい~ blender側で実は簡単な方法が用…