Re: Pythonでabsolute shape keyを操作
6件表示
すべてのコメント一覧へ
投稿ツリー
-
Pythonでabsolute shape keyを操作 (Alex, 2009/12/4 23:04)
-
Re: Pythonでabsolute shape keyを操作 (yamyam, 2009/12/7 13:42)
-
Re: Pythonでabsolute shape keyを操作 (Alex, 2009/12/7 14:17)
-
Re: Pythonでabsolute shape keyを操作 (T.K., 2009/12/8 6:55)
«
-
Re: Pythonでabsolute shape keyを操作 (Alex, 2009/12/8 7:19)
- Re: Pythonでabsolute shape keyを操作 (yamyam, 2009/12/8 17:52)
-
Re: Pythonでabsolute shape keyを操作 (Alex, 2009/12/8 7:19)
-
Re: Pythonでabsolute shape keyを操作 (T.K., 2009/12/8 6:55)
«
-
Re: Pythonでabsolute shape keyを操作 (Alex, 2009/12/7 14:17)
-
Re: Pythonでabsolute shape keyを操作 (yamyam, 2009/12/7 13:42)
T.K.
投稿数: 10
もしシェープキーを使わなくてもいいのでしたら、Script Links を利用すれば目的を達せられるのではと思います。
参考までに以前作った Script Links 用のスクリプトを示します。やっていることは、
1.特定の名前(ここでは "El Topo")のメッシュオブジェクトを探す(予め作っておかないと NG)。
2.フレーム番号の付いた連番ファイルのうち、現在のフレーム番号に対応するデータファイルから頂点のリストと面のリストを読み込む。
3.1.のメッシュオブジェクトの頂点と面を総入れ替えする。
上記のようなスクリプトを Script タブ内の Scene Script link に追加して実行条件となるイベントを FrameChanged に設定します。これでフレーム番号が変わるたびにスクリプトが実行されるようになります。毎回ファイルを読み直すので非効率的(かなりの力技)ですが、小さなデータファイルであれば問題ないと思います。
シェープキーのありがたいところはフレーム間で頂点位置を補完してくれるところですね。例えばフレーム番号1と11の頂点位置を指定しておけば、途中のフレーム番号2〜10の頂点位置は Blender が自動的に補ってくれます。手持ちのデータファイルが大き目の時間ステップ幅で生成されていて(例えばフレーム番号1と11のデータしかなくて)、可視化の際になめらかに(つまりフレーム番号2〜10のデータを補完して)表示したいのであれば、シェープキーを使うのは確かにひとつの手だと思います。
しかし補完のためだけに苦労して Python でシェープキーを扱うくらいなら(別途単独で動作するプログラムを書くなどして)ふたつのデータファイルの間を補完するデータファイルを追加作成するのが手っ取り早いのではないか、というのが yamyam さんのご指摘だと思います。
参考までに以前作った 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
ログイン
クイックリンク
2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki