トンネル部品を連続表示させるPythonスクリプト(自信無し)

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

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2006/11/27 21:18
Heayan  半人前 居住地: Katsushika Tokyo  投稿数: 32
ども、いつもROMしておりますHEAYANと申します。

土木工事の説明ビデオを作る仕事上、シールド機でトンネルを作るシーンを良く作ります。
しかし、調子に乗って作りこんでいると、リング状の部品の数が猛烈に増えて難儀します。

そこでシールド機の動きをFollowPathアニメで表現し、IpoウィンドのSpeedデータを読み出してリングを次々に表示させるスクリプトを作ることを画策しました。

ところが、発想は良かったものの慢性的な勉強不足が祟って『The Blender Python API Reference 日本語版』を見てもチンプンカンプン・・・
結局、三日近く掛けてSpeedのデータを読み出す事はできたのですが、Blenderの2.42でしか動かないスクリプトになってしまいました。

はたしてSpeedデータの読み出し方として正しいコーディングなのでしょうか?
先輩諸兄の皆様、なにとぞご教示ください。

#################################
#				#
# 軌道上を動くマシンにあわせて	#
# トンネルが出来てゆくスクリプト#
#   blender2.42a / Python2.4	#
#	(2006/11/27)		#
#				#
#################################

import Blender
from Blender import Ipo

CF=Blender.Get("curframe")	# 現在のフレームを取得
SF=10				# デバッグ用の表示コマ

SP = 0.006			# 最初の表示ポイント
Pich = 0.002025			# 表示用のリングピッチ

MAX = (1.0,1.0,1.0)		# MAXの定義 縮尺=1.0 
MIN = (0.0,0.0,0.0)		# MINの定義 縮尺=0.0 

RC01 = Blender.Ipo.Get('Speed01') 		# Ipo”Speed01”を取得
RCL  = RC01[Ipo.CU_SPEED].__getitem__(CF) 	# 現フレームにおけるSpeedの値

##############################################
# Get Object Data (オブジェクトデータの取得)#
##############################################

SSeg001 = Blender.Object.Get("S-Seg001")
SSeg002 = Blender.Object.Get("S-Seg002")
SSeg003 = Blender.Object.Get("S-Seg003")
		:
		:
	   (中略)
		:
		:
SSeg459 = Blender.Object.Get("S-Seg459")
SSeg460 = Blender.Object.Get("S-Seg460")

############################
# Tunnel MAX/MIN (On/Off)#
############################

if CF < SF : SSeg001.size= MAX	# 指定コマでデバック用の表示
elif SP+(Pich *	0) < RCL:	# Ipoの数値が指定以上のとき
	SSeg001.size= MAX	# 	→   表示(大きさ=1)
else: 				# それ以外では
	SSeg001.size= MIN	# 	→ 非表示(大きさ=0)
				
if CF < SF : SSeg002.size= MAX
elif SP+(Pich *	1) < RCL:
	SSeg002.size= MAX
else: 		
	SSeg002.size= MIN
				
if CF < SF : SSeg003.size= MAX
elif SP+(Pich *	2) < RCL:
	SSeg003.size= MAX
else: 		
	SSeg003.size= MIN

		:
		:
	   (中略)
		:
		:
				
if CF < SF : SSeg460.size= MAX
elif SP+(Pich *	459) < RCL:
	SSeg460.size= MAX
else: 		
	SSeg460.size= MIN

↓ 簡略化したサンプルのセット ↓
http://eggphoto.agz.jp/heayan/diary/2006/pc/sample01.lzh

↓ スクリプトを使って作ったサンプル動画 ↓



Heayan_1164625540000_tunnel01.wmv
投票数:4 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2006/11/28 16:06
yamyam  管理人 居住地: そうや、うちはおおさかやー  投稿数: 4405
こんにちは。タブがなくなってたので、[code]タグでコード表示させていただきました。

API のことはちょっとわからないのですが(こちらの NEW の[]演算子の件と関係あり?)、とりあえずオブジェクトの取得と判定のところは、
# 初期化に追加

INDEXMAX = 460
SSeg = []

(中略)


# Get Object Data (オブジェクトデータの取得)#
# SSeg[0] = SSeg.001ということに注意

for i in range(0,INDEXMAX):
	SSeg.append(Blender.Object.Get(("S-Seg%d03" % i+1)))

# Tunnel MAX/MIN (On/Off)#

for obj in SSeg:
	if CF < SF : obj.size= MAX		# 指定コマでデバック用の表示
	elif SP+(Pich *	0) < RCL:		# Ipoの数値が指定以上のとき
		obj.size= MAX		# →   表示(大きさ=1)
	else: 				# それ以外では
		obj.size= MIN		# → 非表示(大きさ=0)
の方が楽だと思いました。多分HEAYANさんもわかってらっしゃると思いますが。
投票数:11 平均点:7.27
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2006/11/28 21:50
Heayan  半人前 居住地: Katsushika Tokyo  投稿数: 32
yamyamさん、こんxxは。
RESありがとうございました。
早速チャレンジしてみます。

引用:
の方が楽だと思いました。多分HEAYANさんもわかってらっしゃると思いますが。

恥ずかしながら、よく分からないでやっております
『for』『配列』などを使えばCoolなコーディングができるだろうと想像はしておりましたが、ビール漬けの脳みそでは太刀打ちできなかったモノですから・・・


投票数:13 平均点:9.23

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

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

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

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


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