【第4章】色々なオブジェクトで遊ぼう
第17回 カメラでズーミングしてみよう(カメラ)
FOVを変えることでズームインしたりズームアウトしたりしてみよう。
【使用するVRMNX命令】カメラの命令:GetFOV(fov)
FOVを取得します。FOVとはField of View(視野)の略語です。
【使用するVRMNX命令】カメラの命令:SetFOV(fov)
FOVを設定します。(5 <= fov <=270) FOVに大きな値を設定すると視野が広がります。広角レンズと同じ効果が得られます。
【やってみよう】「親子で学ぼう用レイアウト(15初期状態).vrmnx」を開き、カメラにスクリプトをこのように書こう。書くのが大変ならコピペしよう。完成品は「親子で学ぼう用レイアウト(17).vrmnx」です。
#OBJID=10
import vrmapi
def vrmevent_10(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['ev121'] = 0
di['ev122'] = 0
di['fovup'] = 5
di['fovdown'] = 135
di['initFov'] = obj.GetFOV()
obj.SetEventKeyDown('Q',118)
obj.SetEventKeyDown('W',119)
obj.SetEventKeyDown('E',120)
(中略)
elif ev == 'timer':
if param['eventUID'] == 121:
di['fovup'] = di['fovup'] + 1
obj.SetFOV(di['fovup'])
if di['fovup'] > 135:
obj.ResetEvent(di['ev121'])
vrmapi.LOG('121-End')
di['fovup'] = 5
if param['eventUID'] == 122:
di['fovdown'] = di['fovdown'] - 1
obj.SetFOV(di['fovdown'])
if di['fovdown'] < 5:
obj.ResetEvent(di['ev122'])
vrmapi.LOG('122-End')
di['fovdown'] = 135
(中略)
elif ev == 'keydown':
if param['eventUID'] == 118:
di['ev121'] = obj.SetEventTimer(0.01,121)
if param['eventUID'] == 119:
di['ev122'] = obj.SetEventTimer(0.01,122)
if param['eventUID'] == 120:
obj.SetFOV(di['initFov'])
【解説】FOVを5から135へとズームアウトさせるための値はdi['fovup']、FOVを135から5へとズームインさせるための値はdi['fovdown']とし、ビューワー起動時の初期値をdi['initFov']に保存しています。Qキーが押されたらズームアウトしていきdi['fovup']が135を超えたところでイベントをリセット。次回に備えて初期値に戻しています。Wキーが押されたらズームインしていきdi['fovdown']が5を下回ったところでイベントをリセット。次回に備えて初期値に戻しています。Eキーはカメラを初期FOV値に戻します。なおFOVが大きすぎると画像が反転してしまうので135に止めています。
【実践】それでは「運転」を押してビューワーを起動させましょう。Qキーでズームアウト、Wキーでズームイン、Eキーで元に戻れば成功です(^^)/
【使用するPython命令】range(スタート値,ストップ値,ステップ数)
スタート値から始まり、ステップ数で増減し、ストップ値で終わる数列が生成される。range(3, 9, 2)なら[3, 5, 7, 9]
【余談】実は当初このようにfor文を使おうとしていました。
#OBJID=10
import vrmapi
def vrmevent_10(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['initFov'] = obj.GetFOV()
obj.SetEventKeyDown('Q',118)
obj.SetEventKeyDown('W',119)
obj.SetEventKeyDown('E',120)
(中略)
elif ev == 'keydown':
if param['eventUID'] == 118:
for fov in range(5,135,1):
obj.SetFOV(fov)
if param['eventUID'] == 119:
for fov in range(135,5,-1):
obj.SetFOV(fov)
if param['eventUID'] == 120:
obj.SetFOV(di['initFov'])
ところが実行するとfor文の処理が一瞬で終わってしまうため、最後の表示状態だけになり使い物になりませんでした。やはりfor文はリスト処理でしか使えなさそうです。
←戻る 目次 進む→