投稿

ラベル(Blender)が付いた投稿を表示しています

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (7): 独自アイコンの指定

イメージ
前回 までで一応動作するものになりましたが、改良の余地は沢山あります。 それらも一つ一つ調べながらやらないとなので、時間がかかりそうです。 さて、今回は追加メニューで表示するアイコンを独自のものに変えてみたいと思います。 最初にアイコンを作成します。 アイコンのサイズは縦横とも32ピクセルです。他のメニューに合わせて背景を黒、描画色を白にしました。TM_MESH_TERRAIN.png の名前でPNG形式で保存しておきます。 次に作るのは、読み込み用のモジュールです。icon.py としました。内容は下記の通りです。 # -*- coding: utf-8 -*- # # package: terrain_model # file: icon.py import os import bpy from trace import Trace # We can store multiple preview collections here, # however in this example we only store "main" preview_collections = {} def get_icon_id(name): pcoll = preview_collections["custom"] return pcoll[name].icon_id def register(): Trace.print("icon: register()") # Note that preview collections returned by bpy.utils.previews # are regular py objects - you can use them to store custom data. import bpy.utils.previews pcoll = bpy.utils.previews.new() # path to the folder where the icon is # the path is calculated relative to this py file...

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (6): 取り敢えずの完成

イメージ
前回 、スクリプトのファイルを分割して、それぞれの機能が見通し良くなりました。 そこで最後の仕上げに入ります。 まず、距離と緯度との変換のためにヒュベニの公式のモジュールを作ります。ファイル名は、hubeny_formyla.py です。 # -*- coding: utf-8 -*- # # package: terrain_model # file: hubeny_formula.py # Hubeny's Formula # # D = sqrt(Dy * M)^2 + (Dx * N * cos(P))^2) # D: distance (m) # Dy: diff of latitude (radian) # Dx: diff of longitude (radian) # P: average of latitude (radian) # M = Rx * (1 - E^2) / W^3 # W = sqrt(1 - E^2 * sin(P)^2) # N = Rx / W # E = sqrt((Rx^2 - Ry^2) / Rx^2) # # long radius(Rx), short radius(Ry) # WGS84: 6,378,137.000, 6,356,752.314 245 # import math Rx = 6378137.0 Ry = 6356752.314245 E2 = (Rx ** 2 - Ry ** 2) / Rx ** 2 #W = math.sqrt(1 - E2 * math.sin(P) ** 2) #N = Rx / W def angle_from(distance, latitude): ''' parameter: distance (m) latitude (radian) ''' W = math.sqrt(1 - E2 * math.sin(latitude) ** 2) N = Rx / W return distance / N / math.cos(latitude) def distance_from(angle, latitude...

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (5): スクリプトファイルの分割

 前回の終わりに書いた通り、アドオンのスクリプトファイル一つだと辛くなってきたため、ファイルを複数に分割することにしました。 分割する場合、特定のフォルダ配下に __init__.py 他、関係するスクリプトファイルを配置することになります。それで、これまでの terrain_model.py の名前を継承して、フォルダ名を terrain_model として、その下にファイルを置くことにしました。 なお、このterrain_modelフォルダ、 以前(トレース情報の出力) トレース用に作成した trace.py と同じフォルダに置いてあります。なので、 pythonからの自動読み込みできるように設定した フォルダの下です。 では、まず __init__.py から。 # -*- coding: utf-8 -*- # # package: terrain_model # file: __init__.py bl_info = { "name": "New Terrain Model (JP)", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "View3D > Add > Mesh > New Terrain Model (JP)", "description": "Adds a new Terrain Model (JP) Mesh Object", "warning": "", "support": "TESTING", "doc_url": "", "category": "Add Mesh", } __all__ = [ 'translation', 'operator...

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (4): 地理院タイル(標高タイル)の読み込み

イメージ
 さて、いよいよ地理院タイルを読み込んで、地形モデルを作成したいと思います。 地理院タイルタイルの仕様は こちら(標高タイルの作成方法と地理院地図で表示される標高値について) を参照してください。 とは言っても、いきなり仕様通りのメッシュを作るのはハードルが高いので、まずは入力された緯度経度とズーム値で特定される一つの標高タイルを取得してそれをメッシュ化することにします。 スクリプトのコードは以下のようにしました。 # -*- coding: utf-8 -*- bl_info = { "name": "New Terrain Model (JP)", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "View3D > Add > Mesh > New Terrain Model (JP)", "description": "Adds a new Terrain Model (JP) Mesh Object", "warning": "", "support": "TESTING", "doc_url": "", "category": "Add Mesh", } translation_dict = { "ja_JP": { ("*", "Latitude"): "緯度", ("*", "Longitude"): "経度", ("*", ...

[Blender3.3] スクリプト開発用の画面レイアウト

イメージ
 全然大した話じゃないです。 これまで、Blenderでのpythonのスクリプトを作成するとき、3DビューポートとテキストエディタとPythonコンソールをわざわざ切り替えながら行ったり来たりしていました。 が、実はそれ用の画面レイアウトは定義されていたんですね。 Blenderのメニューバーの右の方に "scripting" のボタンがあり、これを押せば、右にテキストエディタ、左に3Dビューポートなど必要なウィンドウが開かれるようになっていました。 いままで苦労して切り替えていたのは何だったんだろうと思ったのですが、そろそろテキストエディタでの開発に限界を感じ始めているので、今更感もあるのでした...。

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (3): スケールの適用と多言語対応

イメージ
前回 、シーンの単位の倍率の設定の影響を確認しました。 今回のアドオンは、その単位の倍率の指定によらずに固定的な距離の指定を行いたいことと、距離の指定はkm単位にしたいということで、結局、プロパティ設定の画面でシステムに任せた単位の表示を諦めました。 どうしたかというと、プロパティ名のところに単位を記載しました。実際にはしたのような形で、(km)を名前のところに入れてます。 入力値の単位は固定ですが、当然、メッシュを作成するときはシーンの情報を確認して倍率に従って長さに関する値を決めないといけません。今回、実際に入力された「範囲長さ (km)」とシーンの倍率設定とを鑑みて、適切な大きさの平面メッシュを作成するように直しました。 ついでに、メニュー表示の日本語対応も入れました。 # -*- coding: utf-8 -*- bl_info = { "name": "New Terrain Model (JP)", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "View3D > Add > Mesh > New Terrain Model (JP)", "description": "Adds a new Terrain Model (JP) Mesh Object", "warning": "", "support": "TESTING", "doc_url": "", "category": "Add Mesh", } translation_dict = { "ja_JP": { ("*", "Latitude")...

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (2): スケールの確認

イメージ
前回 、ポップアップ画面でsubtypeにDISTANCEを指定したScopeの値が、スケールの設定でどう変わるか心配だと書きました。 それを試してみました。 まず、初期設定だと単位は1mになっていて、ポップアップ画面でのScopeの値は1000mと表示されています。 ここで、単位を1cmにしてみます。 すると、ポップアップ画面でのScopeの表示は10mになりました。つまり、1000cmですね。スクリプトはいじっていないので、シーン設定の単位が表示に影響していることがわかります。 (2022/11/27追記) その後に調べたところ、シーンプロパティの設定変更時点で、確かにオブジェクトのScope値が変化するのですが、このときオブジェクトのexecute()メソッドは起動されません。そして、オブジェクトのScope値を編集して戻ると、シーンの単位の倍率が1.0(変更前の値)に戻ることが確認されました。なので、オブジェクト作成中の倍率設定の変更は意識不要そうです。 ただ、そうなると、本来的にはその時点の単位の倍率に応じて、ポップアップ画面のScopeの値を変化させないといけないんですが、ポップアップ画面のScopeのプロパティ値を状況に応じて変化させられるか。何となく、初期値は適当な値にでもしておいて、invoke()のところで倍率に応じた値を入れれば良さそうな気がしますが...。今度試してみようかと思います。 【 前回(1) 】 日本の地形モデルメッシュ追加アドオンの開発(2) 【 次回(3) 】

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (1): メニュー追加とポップアップ画面

イメージ
これまでは準備ばかりでしたが、そろそろアドオンの開発を進めたいと思います。 最初に作るのは、日本の地形モデルのメッシュを追加するアドオンです。まだまだアドオン開発に不慣れで、試行錯誤しながらですので、一気に完成にはなりませんことご容赦ください。 使うデータですが、過去調べていた  日本の地形図データ  から、地理院の地形図タイルを使うことにします。PLATEAUについては、そもそもBlenderでも使えるデータが入っていますしね。あと、地形図タイルを使うことの利点は、日本国内ならどこでも好きな場所のデータが手に入ることです。 今回のアドオンの仕様ですが、オブジェクトの作成時に緯度、経度、範囲、ズームの値を指定して、それに合わせて地形図タイルのデータを取得しオブジェクトを作成して表示させることを目指します。 まずは、入力のポップアップを作るところから。 Blenderのテキストエディタを開いて、「テンプレート」から「Python > Addon Add Object」を開いて、名前を付けて保存します。ここでは、最終的に地形モデルのアドオンにするつもりなので、terrain_model_jp.py として作成します。 テンプレートを若干手直しして、下記の内容にします。 bl_info = { "name": "New Object2", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "View3D > Add > Mesh > New Object2", "description": "Adds a new Mesh Object", "warning": "", "support": "TESTING", "doc_url": "", ...

[Blender3.3] Pythonスクリプトの読み込みフォルダを追加したい

イメージ
 先に、 トレース出力用のオブジェクト(Trace)を作成しました が、これを都度プログラムに書き込むのも面倒です。 と言うことで、importできるようにします。 やり方は簡単で、スクリプトの置いてあるフォルダを環境変数PYTHONPATHに追加するだけです。 私は自分のDocumentsフォルダの中に3DCGフォルダを作成し、その中にMyScriptsを作成してそこにpythonのファイルを置いているので、%USERPROFILE%\Documents\3DCG\MyScript と書きました。 これを設定した後にBlenderを起動すれば良いのです。 試しに、BlenderのPythonコンソールを起動して入力すると、以下の結果となりました。 >>> import sys >>> import pprint >>> pprint.pprint(sys.path) ['C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\scripts\\startup', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\scripts\\modules', 'C:\\Users\\user\\Documents\\3DCG\\MyScripts', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\python310.zip', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\python\\DLLs', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\python\\lib', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3...

[Blender3.3] Pythonプログラムのトレース情報の出力

Pythonにはデバッガもありますが、簡単にデバッグしようとする際には、トレース出力できると便利です。 Pythonの中身の調査を兼ねて、トレース出力用のクラス(Trace)を作ってみました。 Blenderのテキストエディタで以下の内容を打ち込み、ファイル名 "trace.py" で保存します。 import inspect class Trace: activated = False def on(): Trace.activated = True def off(): Trace.activated = False def print(*argv, **kwargv): if (Trace.activated): stack = inspect.stack() traceback = inspect.getframeinfo(stack[1][0]) print('%s:%d %s: ' % (traceback.filename, traceback.lineno, traceback.function), end="") print(*argv, **kwargv) if __name__ == "__main__": import datetime now = datetime.datetime.now() print("** test start at %s **" % now) print("test 1") Trace.print("trace print, False") print("test 2") Trace.on() Trace.print("trace print, True") Trace.print("1...

[Blender3.3] pythonでの__name__について

イメージ
 Blenderのアドオンでは、常に以下の文を入れるようにとされています。 if __name__ == "__main__": register() 記事によっては、この2行はおまじないのように書かれていますが、そこはきちんと把握しておきたいのが人情というもの。この __name__ の値がいつどういう値になるのかを調べてみます。 まず、コンソール付きで起動したBlenderの中でテキストエディターを開き、以下の一行だけを入力します。 print("This is '" + __name__ + "'.") この状態で「テキスト>スクリプト実行」あるいはalt+pを押下すると、以下の行がコンソールに現れます。 This is '__main__'. つまり、テキストエディターの中でスクリプト実行するときには __name__ の値は __main__ になっているということが分かりました。 では、次に中身のないアドオンを一つ作ります。今回の目的からすれば、内容はなんでも構わないわけなので、一番簡単に、以下の通りのものを test_print.py として作成しました。 bl_info = { "name": "Test Print", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "none", "description": "Test Print in Add-on", "warning": "", "support": "TESTING", "doc_url": "", "category": "obj...

[Blender] Blenderをコンソール付きで起動する

イメージ
 Blenderのアドオンを開発するとき、デバッグプリントなどで print() 文を使うケースが出てくると思います。 print()文の出力はコンソールに出ますが、Windows上でBlenderを起動し、Blenderのテキストエディタ上でpythonを実行してもコンソールが現れず、print()文の結果が確認できません。 それだと不便なのでBlenderをコントロール付きで起動できるようにします。 まず、blender.exeのショートカットを作成します。 次に、ショートカットの名前を適当に変えます。ここでは、blender_consoleにしておきます。 それから、このblender_consoleプロパティを開いて、「ショートカット」タブの「リンク先」のファイル名の前に "cmd.exe /c " と書きます。"/c" の前後には半角スペースを入れておきます。 この状態で「OK」してプロパティウィンドウを閉じます。 こうして作ったショートカットから起動すると、コンソール付きでBlenderが起動します。 このショートカットはタスクバーにピン留めもできますので、そうすれば、タスクバーからいつでもコンソール付きでBlenderが起動できるようになります。 <追記> 上記のままだと、コンソールがShiftJISとなってしまい、Blenderからの文字出力(UTF-8)と異なるため、文字化けすることがあります。これを避けるには、"cmd.exe /c"のところを、"cmd.exe /c chcp 65001&&"とします(&は二つです)。つまり、Blender起動前にコードセットを切り替えるように書いておけば、文字化けが避けられます。

[Blender3.3] GridのMeshをPythonを使って追加する

 参考にしたWebページは下記です。 Meshes with Python & Blender: The 2D Grid - Sinestesia このページは英語なので簡単に書いておくと、GridのMeshを作るには、bpy.types.Meshのfrom_pydata()を使うようです。 (Blender APIのページ) Mesh.from_pydata(vertices, edges, faces) 参考ページの例ではverticesとfacesを使えばedgesの指定は[]で大丈夫そう。 注意点は以下の2点。 (1) verticesで指定した頂点は、Meshの左下を0として、そこから上へと進み、上の端に到達すると、次は0の右側から再び上へと進むこと。 (2) facesの指定は、verticesで指定した頂点の配列中の位置を使うが、位置の指定は対象となるfaceの頂点を反時計回りの順番で行うこと。 (オブジェクトの原点と、座標系の原点などとの関係性は今後検証予定)

(要確認) [CLIP STUDIO PAINT] Blenderのモデルを使って絵が描けるらしい

 この記事は完全に備忘録です。 イラストや漫画が作れるCLIPでは、Blenderのモデルデータも使うことができるそうです。 イラスト マンガ制作アプリ CLIP STUDIO PAINT(クリスタ) 今時点、自分のレベルがお世話になれるほどまで到達していないので、将来お世話になれるようにと願って記録しておきます。

[Blender3.3] 基本操作: 移動のG

 Blenderのオブジェクトの編集モードでのショートカットGは、移動ですが、その移動操作中に追加の指定が可能です。 頂点を選択したときのGの移動の追加指定は以下。(頂点以外は試していないので...) ・X, Y, Z: それぞれの軸に移動先を固定 ・マウスの中ボタン: マウス位置により(指定された座標系の)X, Y, Z軸方向のどれか ・G: 隣接する辺上を移動 で、ここまではBlenderのマニュアルに記載があるのですが、G Gと二度打ちして辺上を移動している最中に C を押すと、移動方向がその辺を含む直線上に固定されるという記載が見つけられずにいます。

[Blender3.3] mmd_toolsはどれが最新?

 キャラクターのモデルを探すとMMD形式のものが色々とあります。 このMMD形式のファイルは、素のBlenderでは読み込めません。読む込むにはmmd_toolsが必要です。 で、調べているとmmd_toolsには複数あるようで、どれが良いのか混乱するので、調べた結果をまとめておきます。なお、今後も変化する可能性があるので、あくまで本日(2022/9/24)時点の情報です。 ・https://github.com/sugiany/blender_mmd_tools これが大元のようですが、7年くらい前で更新が停止。 ・https://github.com/powroupi/blender_mmd_tools 上記より新しいと思われるのがこれですが、これもまた更新が停止した模様です。これのホームでは、下記に移行したとのアナウンスが記載されていました。 ・https://github.com/UuuNyaa/blender_mmd_tools これが最新で有効なmmd_toolsみたいです。Blender3.3LTSに対応しています。インストール方法など、wikiにて詳細に述べられています。 MMD Tools | MMD & Blender Wiki | Fandom (このWikiページの最上部の表示は広告であり、記事の一部ではないので、十分ご注意を) また、読み込んだMMDデータの扱いについては、それぞれのデータの著作権表示その他を十分読んで理解した上で、それに従ってください。大体は個人的に研究する分には問題ないと思いますが、再配布や商用利用については制限がついていると思いますので、注意が必要です。