座標データから粒子の軌跡を表示する方法

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

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2007/1/3 21:40
umihara  新米   投稿数: 8
こんばんわ。
以前link方法を教えて頂いたumiharaです。
どうにも閃きが来ないので質問させてください。

以前の物体の表示は何とかできたのですが、そこに粒子の軌跡を表示するスクリプトを作らなければならなくなりました。
物体表示と同じだろうと思い、そのスクリプトを流用して取り組んできたのですが、全くと言っていいほど進みません。

悩んでいる点となっているのは、物体表示では座標を[x,y,z]に正規表現で作れたのですが、粒子の軌跡の方がそのようにできないこと。([x,y,z,Code,E,Charge]となってしまう)
それに伴って、座標を表示する事ができません。
そして、空行ごとに粒子を区別して座標同士を線で繋ぐこと。

未だ、線で繋がないで座標だけ表示するということすらできません。
どなたかご享受お願いします。

:download:trace.zip

投票数:5 平均点:4.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2007/1/4 2:57
umihara  新米   投稿数: 8
粒子の軌跡の座標表示ができました。
取得方法がおかしかっただけで、単純にリストから[x,y,z]を抜き出す方法でやりました。以前失敗したのですが、そのときが間違っていたのでしょう・・・。

空行を識別してわける方法は・・・やり方すら思い浮かんでないのでお願いします。
投票数:4 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2007/1/5 1:13
yamyam  管理人 居住地: そうや、うちはおおさかやー  投稿数: 4405
要は me1.verts.extend(coords1) で coords1 を直接渡す前に空行かどうかを調べて分岐すればいいのです。
たとえば、空行の文字数は通常に比べて極端に少ないため、文字数を調べてそれを閾値とします。
正直この辺は完全にBlenderとは関係ない話になってくるので、自分で色々と考えてみて下さい。

線につなぐのは me1.edges.extend() ですかね…調べてないんで自信はないのですが。
投票数:8 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2007/1/6 0:08
まんだ  長老 居住地: むかしは本州の西端  投稿数: 570
umihara さん、こんばんは。

> 空行を識別してわける方法は・・・やり方すら思い浮かんでないのでお願いします。

こういうのはどうでしょうか;
http://blog.livedoor.jp/lab1092/archives/50872555.html

サンプルでは行をそのまま扱っています。そこを拡張するといいでしょう。
(Python2.4で作ってます)
投票数:3 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2007/1/6 1:12
kyk  半人前   投稿数: 25
久々に除いたもので(怒られそうだけど)、つい解を書いてしまったけどまずいかな・・・

まんださんが書いておられますが、今回eval使っているので、この場合空行のとき例外が送出されるので、それを捕まえてメッシュ作成するようにしてみました。

例外はともかく、ファイルをforループにかけると、行のイテレーターとなるので1回のループで完了することと、スライス(co[:3])で望みの部分だけを取得するといったことなど、いろいろ盛り込んで見ましたw

from Blender import *

f = file('trace2.txt')
num, verts = 0, []

for line in f:
    try:
        co = eval(line)
        verts.append(co[:3])
    except SyntaxError:
        if len(verts):
            me = Mesh.New('me%d' % num)
            me.verts.extend(verts)
            me.edges.extend(map(lambda x: (me.verts[x], me.verts[x+1]), range(len(verts)-1)))
            obj = Object.New('Mesh', 'obj%d' % num)
            obj.link(me)
            Scene.GetCurrent().link(obj)
            num, verts = num + 1, []


投票数:6 平均点:6.67
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2007/1/6 11:03
まんだ  長老 居住地: むかしは本州の西端  投稿数: 570
kyk さん、おはようございます。
> 空行のとき例外が送出されるので、それを捕まえて
なるほど、上手にtry文を使えばコンパクトに出来ますね。
実は私、「例外」についてまだ良く分かってなかったり…


投票数:4 平均点:7.50
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2007/1/6 19:02
yamyam  管理人 居住地: そうや、うちはおおさかやー  投稿数: 4405
こんばんは。親切すぎです。(笑)
でも、多くの人にとって非常にいいサンプルとなるでしょう。

例外はよく使用するのですが、lambda 式って未だに使用したことありません。(笑)

投票数:3 平均点:6.67
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2007/1/6 20:01
kyk  半人前   投稿数: 25
こんばんわー

> まんださん
例外 == エラーではないので、例外とする範囲を広げるのと、例外は通過点に戻るために使えるので、いろいろな使い方ができると思いますよー

> YamYamさん

> 親切すぎです。(笑)

気晴らしでした。すんません(笑

> lambda

コードを短くするための必須アイテムですよ?!
けど、

me.edges.extend( [[x, x+1] for x in range(len(verts)-1))])

でよかったみたい^^;
投票数:8 平均点:3.75
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2007/1/6 23:18
umihara  新米   投稿数: 8
返信遅くなりました。

yamyamさん、まんださん、kykさん、ありがとうございました。
正しく表示されましたが、正直スクリプトのほうは勉強不足でぱっと見てわかりません。
これからカラー表示も含めて、調べて学んで行きたいと思います。

本当にありがとうございました。


追加ですいません・・・。

他のスクリプトに適応して気づいたのですが、図のように物体を貫通しているはずの粒子の軌跡が見えないのはblenderの仕様なのでしょうか?
ワイヤーフレームで確認すると貫通している事がわかるのですが・・・。



投票数:4 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2007/1/8 9:30
yamyam  管理人 居住地: そうや、うちはおおさかやー  投稿数: 4405
kykさん:
me.edges.extend( [[x, x+1] for x in range(len(verts)-1))])
何この変態構文?って一瞬思いましたが(笑)、要は[[a,b] c]の形なんですね。勉強になりました。


umiharaさん:
Blender では、Edge(辺)は MaterialButtons([F5])内の RenderPipeline パネル内にある、[ Wire ]を押さないとレンダリングされません。ただし、これを押すと普通の立方体もワイヤフレームでレンダリングされてしまいます。

そのため、以前作成された立方体とは別の Material を割り当てる必要があります。

その方法ですが、まず、自動的に Material 割り当てしていく方法。
            obj = Object.New('Mesh', 'obj%d' % num)
            obj.link(me)
の二行の間に、
            mat = Material.Get('ryusi')
            me.materials += [mat]
を入れてみて下さい。"ryusi" は実際にBlender で予め作成しておいたMaterial の名前です。ダミーで作成した Mesh Object にでも作成しておいて、その後スクリプトを実行して下さい。もちろん別の名前でも構いませんが、上記のシングルクオート内も変更してやって下さい。

以前の立方体の方も同様にすれば、一つの Material が立方体共有の Material として利用できるようになります。

また、もう多数の粒子の Object がある blend ファイルを作成しており、この粒子 Object に対して、同じ Material を割り振る場合。
この場合は、一つの粒子 Object に Material を設定し、他の粒子 Object へコピーしてやることになります。
一つ一つやっていると面倒なので、Blender に同梱されているスクリプト、"Data Copier" で行います。

使用は簡単です。
1) ObjectMode で、すべての粒子 Object を選択し、最後に Material を割り当てた粒子 Object(コピー元)を選択してアクティブにする(明るいピンクになります)。
2) ヘッダの Object メニューから、Scripts→Data Copier を選択します。
3) UI がでてくるので、"Materials" のボタンを押し、"Copy" を押します。最後に選択した Object の Material(へのリンク)が他の選択された Object すべてにコピーされます。

投票数:33 平均点:1.82

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

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

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

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


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