【第2章】天候で遊ぼう
第10回 空のテクスチャーを変化させよう
実は全てのレイアウトファイルに、天空0に昼間、天空1に夕方、リソースID1に夜の背景テクスチャーが組み込んであります。夜間設定の「親子で学ぼう用レイアウト(8初期状態).vrmnx」はSetSunTypeとLoadSkyImageを使って太陽光と背景テクスチャーを変更したものでした。今度は天空0の昼間から天空1の夕方へと徐々に変化させる方法を実践します。
【使用するVRMNX命令】SKY()関数の命令:SetSkyFactor(合成比率)
天球のレイヤーの合成比率を設定します。0.0<=合成比率<=1.0です(0が天球レイヤー0、1が天球レイヤー1)
【やってみよう】「親子で学ぼう用レイアウト(2初期状態).vrmnx」を開き、レイアウトにスクリプトをこのように書こう。書くのが大変ならコピペしよう。
#LAYOUT
import vrmapi
def vrmevent(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['factor'] = 0
vrmapi.LAYOUT().SetView(10)
obj.SetEventTimer(0.1,111)
(中略)
elif ev == 'timer':
if param['eventUID'] == 111:
di['factor'] = di['factor'] + 0.01
vrmapi.LAYOUT().SKY().SetSkyFactor(di['factor'])
(以下省略)
【解説】これで完成したように見えますがこのスクリプトには問題があります。何かといえばdi['factor'] が1以上になっても'timer'イベントが動き続けてしまっているのです。SetSkyFactorは1以上の数値を受け取っても変化もエラーも出しませんから見た目は問題ありませんが、余計な'timer'イベントが動き続けて負荷が掛かっています。ですのでこの'timer'イベントを終了させる命令が必要となります。
【使用するVRMNX命令】色々な部品にある命令:ResetEvent(イベントID)
イベントIDで指定したイベントをリセットします。イベントが不要になった際に実行します。'time'イベントや'after'イベントはイベント発生後、自動的にリセットされていますが、'timer'イベントはリセットされていません。
これを使うと、
#LAYOUT
import vrmapi
def vrmevent(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['factor'] = 0
di['ev111'] = 0
vrmapi.LAYOUT().SetView(10)
di['ev111'] = obj.SetEventTimer(0.1,111)
(中略)
elif ev == 'timer':
if param['eventUID'] == 111:
di['factor'] = di['factor'] + 0.01
vrmapi.LAYOUT().SKY().SetSkyFactor(di['factor'])
if di['factor'] > 1:
obj.ResetEvent(di['ev111'])
vrmapi.LOG('111-End')
(以下省略)
となります。今までSetEventTimerは「obj.SetEventTimer(0.1,111)」のように戻り値を取らずに単独で実行していましたが、今回はこのイベントIDが必要となるので「di['ev111'] = obj.SetEventTimer(0.1,111)」とイベントIDを獲得し「obj.ResetEvent(di['ev111'])」で'timer'イベントを終了しています。
【実践】それでは「運転」を押してビューワーを起動させましょう。10秒間で徐々に昼間から夕方へと空が変わっていけば成功です(^^)/