(質問) 選択物の リストを取る方法

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/15 3:29
もヂャ  新米   投稿数: 16
>完全無欠猫 さま
なるほど。あそこから先は バイナリなんですね。
今の状態で見に行ったところで、自分では手に負えないと思います。
リスト内包表記が解らなかったり、既にPythonの入り口でつまづいているので、
あまり欲を出さず できる範囲でコツコツやろうと思います。
ありがとうございました。

>uimac さま
import bmesh についてちょっと調べて来ました。(とはいえまだよく解ってないですが)
教えて頂いたコードは、なぜかうちの環境では Print(s)で何も表示されませんでした。
調べた限りでは、特におかしなところも無いと思うのですが、環境の問題なのか、
実行させる時 何かうっかりミスをしているのか、結局 原因は解らずじまいでした。

あれこれ試してみたところ、少し書き方を変えて
import bpy
import bmesh
bm = bmesh.from_edit_mesh( bpy.context.active_object.data )
for s in bm.select_history:
  print(s)
  print(s.index)
こうしたら、うちの環境でも無事に 選択した順番を取る事ができました。
これで、また ひとつできる事が増えました。 ありがとうございました。



投票数:1 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/28 18:35
もヂャ  新米   投稿数: 16
失礼致します。
頂点座標をグローバルで取得したくなって色々試しているのですが、どうにもうまく行かず、
頂点のグローバル位置を取得する方法をご存知の方がいれば、教えて頂けないかと思い、
また質問させて頂きに来ました。

今作っているスクリプトは、選択した頂点の始点と終点の距離を計測し、
終点(アクティブ)を中心にして、希望する長さにスケーリングする。というものです。

bpy.context.active_object.data.vertices[0].co
で取得できる頂点の位置情報は、
どうやらローカルらしく、スケールの値も反映していません。
このままでは モデルにスケールが入っていると正しく機能しないため、、
グローバルの値が どこかから参照できないかと、
メッシュのデータの中を覗いてみたのですが見つけられませんでした。

エディットモードの Nで表示されるトランスフォームで
選択物のグローバル値が表示できるのですが、
その値の参照方法がわからず、ひとまず そこからの取得は断念しました。

.select で verticesの選択状態を再生できるようになったので、
.indexの情報を使って、調べたいverticesだけを一時的に選択しておいて、
3Dカーソルを スナップさせてグローバルの値を取ろうとしたのですが、
選択の状態を元に戻す時、.select = True で選択状態に変えた場合、
「選択した」という扱いにはならないらしく、.select_history が消えたり、
アクティブになっていたverticesが解除されたりと、
今回の用途に使うためには、少し不都合がありました。

verticesのローカル位置と、active_objectの位置情報は取れているので、
ローカル位置をグローバルに変換してみようかと、情報を調べていたのですが、
今のところ、頭が付いて来なくなって躓いています。
<追記> (教えて頂いた.matrix_worldを使えばできました)


今、自分でできる範囲での解決方法として、
オブジェクトのコピーを作り、そちらで位置情報を取ってから
コピーを削除して戻ってくれば問題を回避できそうだと考えていたのですが、
テストしている最中 オブジェクトのコピーを作った場合、
それを削除をしてもメッシュデータが残る事に気が付き、
いくらリンクが無いデータはセーブされないとはいえ、
頂点の距離を調べるたびに 使わないメッシュデータが増えていくというのも気持ちが悪いので、
今は リンクしていないメッシュデータを掃除する方法が無いか、合わせて調べています。

<追記>
いらなくなったメッシュの削除方法が解りました。
bpy.data.meshes.remove(bpy.data.meshes['Cube.003'])
これでオブジェクトをコピーしてもゴミが残らないようにできるので
今回は、この方向で進めてみようと思います。
失礼致しました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/29 15:13
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
データ構造を調べた方が理解し易いとは思いますが・・・。
どこかで纏まって記述されている所を知りません。(公式のscriptsマニュアルぐらいかも・・・)
AddOnのmeasure panelのスクリプトが参考になるとは思います・・。

objectは親子関係が設定されることもありますので・・。
基本的には親の座標系で記録されます。
objectはorigin位置を原点としています。
その座標系にvertexは存在します。
そのobjectが別のobjectの子であれば、そのobjectのoriginは親objectの座標系内にあります。
(ひょっとすると厳密には表現が違うかもしれませんが・・・・)
こうすれば親が動いても子の座標はいじらなくても計算できます。(Matrixは変わる可能性はありますが・・)

単にvertexのglobal座標が欲しいのであれば
objectのmatrix_worldにvertexの座標を掛ければ変換されます。

例えば
op = D.objects["Plane"]
mo = D.meshes[op.name]
とした場合
mo.vertices[0].coのglobal座標は
op.matrix_world * mo.vertices[0].coで計算できます。

matrixなので、移動、回転、拡大縮小も計算されています。
別途matrix関係等をいじるのであればmathutilsを調べることを勧めます。

蛇足ですが、座標変換なら最初の回答で提示したBlender PythonのTipsサイトで紹介されていると思いましたが・・・
なければ失礼・・・。
投票数:2 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015/1/29 21:52
もヂャ  新米   投稿数: 16
> 完全無欠猫さま

import bpy
op = bpy.context.active_object.matrix_world
mo = bpy.context.active_object.data.vertices[0].co
world_pos = op * mo
print(world_pos)

わぁ。すごい簡単に取れた!
ありがとうございます。

matrix_world なんていうのが 初めからあったんですね。
〜vertices とかあるかと思って そんなのばかり探していました。

あ〜! Blender PythonのTipsサイトに
そのまま Matrixとか、matrix_world の 項目がありますね。
見に行っていた Vertices項目のサンプルコードの中にも
よく見たら matrix_world 使ってるのがあるし・・・

正解を目の前にして 気付かないまま何日も悩んでたなんて。
次からはもっと気をつけます。
失礼しました。
投票数:0 平均点:0.00

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki