Pythonでabsolute shape keyを操作

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

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/12/4 23:04
Alex  新米   投稿数: 14
 はじめまして。
 Pythonを使って、データを読み込んで、コンター図を作っています。値をz値で与えて、全体にグラデーションのテクスチャを与えることで、コンターを表現しています。これにさらに、時系列の複数のデータを使って、absolute vertex keyでアニメーションを作りたいんですが、これって可能でしょうか?Pythonのマニュアルのようなものを見ていると、absolute vertex keyの各keyでそれぞれのvertexにアクセスする方法が無いように思えるんですが...。
 漠然とした質問ですみませんが、何かご存知の方がいらっしゃればよろしくお願いします。
投票数:3 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/12/7 13:42
yamyam  管理人 居住地: そうや、うちはおおさかやー  投稿数: 4405
はじめまして。フレームごとにそれぞれのデータを形状に反映し、それをなめらかにアニメーションしたいというわけですか?
恐らく自分でフレーム毎に補間してMeshに出力された方が早いと思います。
投票数:7 平均点:2.86
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/12/7 14:17
Alex  新米   投稿数: 14
 アドバイスありがとうございます。

>はじめまして。フレームごとにそれぞれのデータを形状に反映し、それをなめらかにアニメーションしたいというわけですか?
 そうです。その通りです。

>恐らく自分でフレーム毎に補間してMeshに出力された方が早いと思います。
 ちょっと私の勉強不足のせいか、上記の方法はよく分かりません(というか、私の説明が不足しており、相互理解がうまく行っていない?)。各時間のデータは、csv形式で作って、32×6の値をもっており、手打ちでデータ入力はちょっと不可な気がします...。そこで、absolute shape keyの各キーにそれぞれの時間におけるデータ値を自動的に割り当てようと思っているんですが。
 例えば、absolute shape key各キーの作成はマニュアルでやるとして、各キーごとにメッシュのz座標値をpython scriptで読み込み割り当てる、という半自動の方法でもいいんですが。

 お手透きの時にでもよろしくお願いします。
投票数:9 平均点:4.44
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/12/8 6:55
T.K.  新米   投稿数: 10
もしシェープキーを使わなくてもいいのでしたら、Script Links を利用すれば目的を達せられるのではと思います。

参考までに以前作った Script Links 用のスクリプトを示します。やっていることは、
1.特定の名前(ここでは "El Topo")のメッシュオブジェクトを探す(予め作っておかないと NG)。
2.フレーム番号の付いた連番ファイルのうち、現在のフレーム番号に対応するデータファイルから頂点のリストと面のリストを読み込む。
3.1.のメッシュオブジェクトの頂点と面を総入れ替えする。

import Blender
import Blender.Window
import Blender.Mesh
import sys

def read_file(filename):
	# 省略

def main():
	# Find a placeholder mesh object
	me = Blender.Mesh.Get("El Topo")
	if me is None:
		sys.stderr.write("Error: Mesh \"El Topo\" not found\n")
		return
	# Read a .bin file corresponding to the current frame number
	frameno = Blender.Get("curframe")
	try:
		verts, tris = read_file("C:/tmp/suzanne/track%04d.bin" % frameno)
	except IOError, e:
		sys.stderr.write("Error: %s\n" % str(e))
		return
	# Replace the vertices and faces of the placeholder mesh object
	editmode = Blender.Window.EditMode()
	if editmode:
		Blender.Window.EditMode(0)
	me.verts.delete(range(len(me.verts)))
	me.verts.extend(verts)
	me.faces.extend(tris)
	for fa in me.faces:
		fa.smooth = 1
	me.recalcNormals()
	if editmode:
		Blender.Window.EditMode(1)

if __name__ == "__main__":
	main()

上記のようなスクリプトを Script タブ内の Scene Script link に追加して実行条件となるイベントを FrameChanged に設定します。これでフレーム番号が変わるたびにスクリプトが実行されるようになります。毎回ファイルを読み直すので非効率的(かなりの力技)ですが、小さなデータファイルであれば問題ないと思います。

シェープキーのありがたいところはフレーム間で頂点位置を補完してくれるところですね。例えばフレーム番号1と11の頂点位置を指定しておけば、途中のフレーム番号2〜10の頂点位置は Blender が自動的に補ってくれます。手持ちのデータファイルが大き目の時間ステップ幅で生成されていて(例えばフレーム番号1と11のデータしかなくて)、可視化の際になめらかに(つまりフレーム番号2〜10のデータを補完して)表示したいのであれば、シェープキーを使うのは確かにひとつの手だと思います。

しかし補完のためだけに苦労して Python でシェープキーを扱うくらいなら(別途単独で動作するプログラムを書くなどして)ふたつのデータファイルの間を補完するデータファイルを追加作成するのが手っ取り早いのではないか、というのが yamyam さんのご指摘だと思います。
投票数:5 平均点:6.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/12/8 7:19
Alex  新米   投稿数: 14
 T.K.さん、ありがとうございます。
 今、出先なので、家に帰ったら早速試してみます。
 yamyamさんの言われているところも理解しました。確かにそれもひとつの手ですね。
投票数:6 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/12/8 17:52
yamyam  管理人 居住地: そうや、うちはおおさかやー  投稿数: 4405
@T.K.さん
フォローありがとうございます。Script Link のことぐらいは書けばよかったと反省しています。

@Alexさん
頂点数と対応するパラメータが固定であれば、頂点のz値を動かすだけで済むかもしれません(例:各計測値の平面上の位置が Mesh のグリッドと対応しているなど)。あるサンプル値のあるフレームでの値と、次のサンプル値のあるフレームでの値の差をとって、あとは間のフレームで値を線形補間し、対応する頂点のZ値を変更、代入してやればアニメーションできると思います。クラスについては下記を参照してみて下さい。
http://www.geocities.co.jp/SiliconValley-Cupertino/2019/blender/PythonDocJpn/Mesh.MVertSeq-class.html
投票数:6 平均点:5.00

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

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

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

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


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