【第4章】色々なオブジェクトで遊ぼう
第19回 カメラを動かしてみよう(モーションパス)
モーションパスとは「地上カメラ」「音源」「エミッター」「自動車」を移動させるための道筋です。Ver.6.0.0.430にて私がアイマジック社に要望した命令の追加や修正がありました。アイマジック社には厚く御礼申し上げます。しかしながら、まだ動作的に納得がいかない所もあるので、アイマジック社が推奨するプロパティを使用する方法と強引にスクリプトだけでやる方法との2つの方法を説明したいと思います。
【使用するVRMNX命令】レイアウトの命令;GetMotionPath(モーションパスのID)
指定IDのモーションパスオブジェクトを取得します。オブジェクトIDの代わりに部品に設定した名前でも取得できます。
【使用するVRMNX命令】モーションパスの命令:SetMotionTimeS(モーション時間)
(新命令)モーション時間を設定します。モーション時間の単位は秒。※これを実行するとStartを使っていなくてもモーションを開始してしまいます。
【使用するVRMNX命令】モーションパスの命令:SetOffset(回転オフセット角度)
(修正済み命令)回転オフセット角度を設定します。※動作するようになりましたが、動作範囲は0~360で、プロパティの-180~180とは設定範囲が違うところに注意が必要です。
【使用するVRMNX命令】モーションパスの命令:Start()
モーションを開始します。
【使用するVRMNX命令】モーションパスの命令:Stop()
モーションを停止します。
【使用するVRMNX命令】モーションパスの命令:InitTragetPos()
ターゲットの位置を初期状態に戻します。
【使用するVRMNX命令】モーションパスの命令:SetTargetID(ターゲットのID)
(新命令)ターゲットの部品IDを指定します。モーションパスが制御できる「地上カメラ」「音源」「エミッター」「自動車」以外を指定した場合は設定できません。なお、この命令で指定されたターゲットは座標(0,0,0)に強制移動させられるようなので注意。
ということで、まずはターゲットのみプロパティで設定する方法です。
【やってみよう】プロパティを設定してある「親子で学ぼう用レイアウト(19-1初期状態).vrmnx」を開き、レイアウトにスクリプトをこのように書こう。書くのが大変ならコピペしよう。完成品は「親子で学ぼう用レイアウト(19-1).vrmnx」です。
#LAYOUT
import vrmapi
def vrmevent(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['MP'] = vrmapi.LAYOUT().GetMotionPath(70)
vrmapi.LAYOUT().SetView(10)
obj.SetEventKeyDown('K',124)
obj.SetEventKeyDown('L',125)
di['MP'].SetOffset(270)
di['MP'].SetMotionTimeS(10.0)
di['MP'].Stop()
(中略)
elif ev == 'keydown':
if param['eventUID'] == 124:
di['MP'].Start()
if param['eventUID'] == 125:
di['MP'].Stop()
di['MP'].InitTragetPos()
【解説】モーションパスのインスタンスを辞書型変数に入れて、オフセットやモーション時間の設定をしています。そしてSetMotionTimeSを実行すると動き出してしまうのでStop命令をかけています。各キーを押すことで動作させています。
【実践】それでは「運転」を押してビューワーを起動させましょう。Kキーを押したらカメラが水平移動し、Lキーを押したら元のカメラ位置に戻れば成功です(^^)/ 戻ったカメラ位置がズレてる気もしますが仕様っぽいので成功としておいてください。モーションパスの命令はまだ不完全な部分が残っています。
(水平移動中はこのように見えます)
次はSetTargetIDを使ってカメラを移動させますが、初期位置が変わってしまうのでもう1つカメラを追加し、固定カメラ(ID=10)と移動カメラ(ID=71)の2台体制とします。
【やってみよう】「親子で学ぼう用レイアウト(19-2初期状態).vrmnx」を開き、レイアウトにスクリプトをこのように書こう。書くのが大変ならコピペしよう。完成品は「親子で学ぼう用レイアウト(19-2).vrmnx」です。
#LAYOUT
import vrmapi
def vrmevent(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['MP'] = vrmapi.LAYOUT().GetMotionPath(70)
vrmapi.LAYOUT().SetView(10)
obj.SetEventKeyDown('K',124)
obj.SetEventKeyDown('L',125)
di['MP'].SetTargetID(71)
di['MP'].SetOffset(270)
di['MP'].SetMotionTimeS(10.0)
di['MP'].Stop()
(中略)
elif ev == 'keydown':
if param['eventUID'] == 124:
di['MP'].Start()
vrmapi.LAYOUT().SetView(71)
if param['eventUID'] == 125:
di['MP'].Stop()
vrmapi.LAYOUT().SetView(10)
【解説】SetTargetIDで移動カメラを取得してそれを動かし、動作を止めたら固定カメラに戻るようにしています。
【実践】それでは「運転」を押してビューワーを起動させましょう。Kキーを押したらカメラが水平移動し、Lキーを押したら元のカメラ位置に戻れば成功です(^^)/ これが本来やりたかった動きですね。
←戻る 目次 進む→