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

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

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

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

Blender

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

Q&A

解決済

1回答

1909閲覧

pythonでblenderにオブジェクトを配置するときに、自動でオブジェクトを連結したい

katamari57

総合スコア5

Python

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

Blender

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

0グッド

0クリップ

投稿2019/10/13 09:59

編集2019/10/13 10:01

前提・実現したいこと

blenderでpythonによるスクリプティングでオブジェクトを扱っています。
for文で規則的にオブジェクトを複数生成し、それらを自動で1つのオブジェクトとして結合したいのですが、うまくいきません。
下にソースコードを貼ります。

発生している問題・エラーメッセージ

該当のソースコード

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete(True)

bpy.ops.mesh.primitive_cube_add(location=(1,0,0))
bpy.context.object.name="preSelectedObject"
bpy.ops.mesh.primitive_cube_add(location=(3,0,0))
bpy.context.object.name="preSelectedObject"
bpy.ops.mesh.primitive_cube_add(location=(5,0,0))
bpy.context.object.name="preSelectedObject"

bpy.data.objects[preSelectedObject].select=True
bpy.ops.object.join()

試したこと

bpy.ops.mesh.primitive_cube_add()を実行すると、以前の選択が解除されて、新たに作成した物体のみを選択及びアクティブにするようです。
なので、選択を解除されない方法があればそれで解決します。(1)

私はその方法を知らないので、生成したオブジェクトに名前をつけて(現在アクティブのオブジェクト情報が入っているbpy.context.object)、後からその名前によってオブジェクトを選択(bpy.data.objects["名前"].select=True)して、選択されているオブジェクトを統合(bpy.ops.object.join())しました。
結果は、1個めと3個めのオブジェクトが統合され、2個目のオブジェクトは統合されませんでした。
blenderの名前の仕様によると、同じ名前をつけることはできず、同じ名前を指定した場合は次のようになるようです。(name,name.001,name.002,...)
この事から、名前による選択は1個めのオブジェクトのみとなり、アクティブの3個めのオブジェクトと1個めのオブジェクトだけがつながったのだと思います。
名前によってオブジェクトを選択する(bpy.data.objects["名前"].select=True)の、名前部分を一部一致のような条件で指定する方法があれば、それで解決します。(2)

また、他の方法があれば教えて欲しいです。(3)

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

blender 2.79b

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

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

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

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

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

guest

回答1

0

ベストアンサー

作成したオブジェクトをリストに追加しておき、最後にリストの中のオブジェクトを選択すれば良さそうです。

import bpy bpy.ops.object.select_all(action="SELECT") bpy.ops.object.delete(True) objects = [] bpy.ops.mesh.primitive_cube_add(location=(1,0,0)) objects.append(bpy.context.object) bpy.ops.mesh.primitive_cube_add(location=(3,0,0)) objects.append(bpy.context.object) bpy.ops.mesh.primitive_cube_add(location=(5,0,0)) objects.append(bpy.context.object) for object in objects: object.select=True bpy.ops.object.join()

【参考】 シンプルに書くとこんな感じになります。

import bpy bpy.ops.object.select_all(action="SELECT") bpy.ops.object.delete(True) cube_num = 3 objects = [] for i in range(0, cube_num): pos_x = (i * 2) + 1 bpy.ops.mesh.primitive_cube_add(location=(pos_x,0,0)) objects.append(bpy.context.object) for object in objects: object.select=True bpy.ops.object.join()

投稿2019/10/14 05:17

Kapustin

総合スコア1186

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問