質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Blender

Blenderとは、オープンソースの3DCGソフトウェアです。フリーでありながら、3Dモデル作成、レンダリング、アニメーション、コンポジットなどのハイエンドに匹敵する高い機能を持ち、さらにゲームエンジンも搭載しています。

Q&A

解決済

1回答

952閲覧

ワンボタンで球とそれに位置をコンストレイントしたベジェ円を同時生成するblenderアドオンを作りたい。

S.K12

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Blender

Blenderとは、オープンソースの3DCGソフトウェアです。フリーでありながら、3Dモデル作成、レンダリング、アニメーション、コンポジットなどのハイエンドに匹敵する高い機能を持ち、さらにゲームエンジンも搭載しています。

0グッド

0クリップ

投稿2021/07/31 10:27

前提・実現したいこと

ワンボタンで球とそれに位置をコンストレイントしたベジェ円を同時生成するblenderアドオンを作りたい。

下記の画像のようなものをワンボタンで作りたいです。
イメージ説明

発生している問題

blenderでアドオンを作る事が初めてでして、

「オブジェクトを生成するコード」

Python

1bpy.ops.curve.primitive_bezier_circle_add()

「位置コンストレイントを設定する(?)コード」

Python

1bpy.types.CopyLocationConstraint(target="任意のターゲット")

の2つは手探りで調べて何となくわかったのですが、

例えばオブジェクトAに「オブジェクトコンストレイント」を適用して、更にターゲットをオブジェクトBに設定する場合、
オブジェクトBをターゲットにする方法は分かっても、オブジェクトAにコンストレイントを適用するというコードをどう書けばよいかわからずに困っています。

直接の回答に繋がらずとも、調べ方や参考になるサイトだけでもあれば教えていただけると助かります。

作ったソースコード

問題があると思われる個所↓

Python

1bpy.ops.curve.primitive_bezier_circle_add() #ベジェ円の生成 2bpy.types.CopyLocationConstraint(target= bpy.ops.object.metaball_add ()) #拘束と球の生成

全文↓

Python

1import bpy 2 3 4# 球と円の生成 5class SAMPLE21_OT_CreateObject(bpy.types.Operator): 6 7 bl_idname = "object.sample21_create_object" 8 bl_options = {'REGISTER', 'UNDO'} 9 10 # メニューを実行したときに呼ばれる関数 11 def execute(self, context): 12 bpy.ops.curve.primitive_bezier_circle_add() #ベジェ円の生成 13 bpy.types.CopyLocationConstraint(target= bpy.ops.object.metaball_add ()) #拘束と球の生成 14 15 return {'FINISHED'} 16 17 18# メニューを構築する関数 19def menu_fn(self, context): 20 self.layout.separator() 21 self.layout.operator(SAMPLE21_OT_CreateObject.bl_idname) 22 23# Blenderに登録するクラス 24classes = [ 25 SAMPLE21_OT_CreateObject, 26] 27 28# アドオン有効化時の処理 29def register(): 30 for c in classes: 31 bpy.utils.register_class(c) 32 bpy.types.VIEW3D_MT_mesh_add.append(menu_fn) 33 34 35# アドオン無効化時の処理 36def unregister(): 37 bpy.types.VIEW3D_MT_mesh_add.remove(menu_fn) 38 for c in classes: 39 bpy.utils.unregister_class(c) 40 41# メイン処理 42if __name__ == "__main__": 43 register()

補足情報(FW/ツールのバージョンなど)

Python3.9.4 bit64
blender2.91

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記のコードでコンストレイントを設定できます。
UIでの操作をそのままスクリプトに落としているだけです。
メタボールは使ったことがないので通常のメッシュのUV球にしています。

import bpy # ベジェ曲線/円のオブジェクトを生成 bpy.ops.curve.primitive_bezier_circle_add() circle_object = bpy.context.object # UV球のオブジェクトを生成 bpy.ops.mesh.primitive_uv_sphere_add(enter_editmode=False, align='WORLD', radius=0.75) uv_sphere_object = bpy.context.object # 生成したオブジェクトを選択 uv_sphere_object.select_set(True) circle_object.select_set(True) # UV球にCOPY_LOCATIONのコンストレイントを設定する bpy.context.view_layer.objects.active = uv_sphere_object # アクティベイト bpy.ops.object.constraint_add_with_targets(type='COPY_LOCATION')

アドオンではなく単なるスクリプトです。アドオン化も同じコードで対応可能です。
2.93.1 で確認しました。

投稿2021/08/07 17:08

KphP9

総合スコア76

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

S.K12

2021/08/08 11:37

有難うございます。頂いたコードで動かしてみたところ、問題なく動作しました。 使用するオブジェクトを選択した後に片方をアクティベイトしなくてはいけなかったのですね。 アクティベイトって何に使うのかよくわかっていなかったので助かりました。 また、スクリプトとアドオンはほぼ同じものだと思っていたので調べてみます。 本当に有難うございました。
KphP9

2021/08/09 14:55

> また、スクリプトとアドオンはほぼ同じものだと思っていたので調べてみます。 私の書き方が悪かったかもしれません。 アドオンは規定のパスに配置されたPythonスクリプトで、中にbl_infoが定義されているものです。 よってS.K12さんと私が書いたものは単なるPythonスクリプトでアドオンではないです。 S.K12さんのコードは BlenderのUIやPythonコンソールなどから呼び出し可能なオペレータ(bpy.types.Operator)ですが、私のものはテキストエディタからしか実行できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問