Google SketchUpで日影アニメーション!?
以前、Google SketchUpで緯度・経度や方位の指定を行うRubyスクリプトを作成しました。で、Google SketchUpでほぼ正確な日影のシミュレーションができるようになったわけですが、日影アニメーションも作成してみたいと思ったので少し考えておりました。SketchUpのページタブ(?)機能を使用すると、SketchUp上で日影アニメーションのようなことはできるのですが、ムービーを作れないかと。
で、またまた簡単なRubyスクリプトを作成してみました。ムービーといっても、拙作のShadow Simulatorのように日付と開始・終了時刻、時間間隔(分単位)を指定することにより、連続してJPEG形式の静止画ファイルを書き出すというものです。ですから、実際にムービーを作成するには、別途、Windows ムービー メーカーやAVI Makerなどの静止画からムービーを作成するソフトウエアが必要になります。
以下のスクリプトをSketchUpのPluginsフォルダにShadowImages.rbという名前で保存してからSketchUpを起動すると、[Tools]メニューに[ShadowImages]というメニューが追加されます。スクリプトを実行する前に、影を表示し(当然!)、以前作成した緯度・経度や方位の指定を行うRubyスクリプトや天越ブログさんの位置情報記入スクリプトなどで緯度・経度などを指定しておいてください。
スクリプトを実行して日付と開始・終了時刻、時間間隔(分単位)を指定すると、JPEG形式の静止画ファイルがマイドキュメントフォルダに"ShadowImages_0800.jpg"のような名前で作成されると思います。相変わらずRuby自体よくわかっていないのと、エラー処理なども特にしていませんので、うまく動作しい場合があるかもしれません。あと、大規模なあるいは複雑な形状の建物だとどうなるかわかりません。(^^ゞ 取り敢えずウチではうまく動いていて、それなりに役立っているような気が...
※ 以下のスクリプトはインデントが全角スペースになっています。半角スペースに置換して利用してください。すみません。
class ShadowImages
def initialize
model = Sketchup.active_model
shadowinfo = model.shadow_info
prompts = ["Year", "Month", "Day", "StartTime", "EndTime", "Interval(min)"]
values = [Time.now.year, Time.now.month, Time.now.day, 8, 16, 60]
results = inputbox prompts, values, "ShadowImages"
return if not results
cyear = results[0]
cmonth = results[1]
cday = results[2]
stime = results[3]
etime = results[4]
interval = results[5]
path = ENV["USERPROFILE"] + "\\My Documents\\ShadowImages_"
t = stime.prec_f
while t <= etime.prec_f
chour = t.truncate
cmin = ((t - chour) * 60).truncate
# csec = (((t - chour) * 60 - cmin) * 60).round
csec = 0.0
ctime = Time.gm cyear, cmonth, cday, chour, cmin, csec
shadowinfo["ShadowTime"] = ctime
Sketchup.set_status_text "Current Time: " + ctime.to_s
# UI.messagebox "Current Time: " + ctime.to_s
fname = sprintf("%02d", chour) + sprintf("%02d", cmin) + ".jpg"
view = model.active_view
view.write_image path + fname
# view.write_image filename, <width>, <height>, <antialias>, <compressionFactor>
t += interval.prec_f / 60
end
UI.messagebox "Finish!"
end
end
if (not file_loaded?("ShadowImages.rb"))
add_separator_to_menu("Tools")
UI.menu("Tools").add_item("ShadowImages") { ShadowImages.new }
end
file_loaded("ShadowImages.rb")
http://pub.ne.jp/tb.php/420790