見出し画像

Rosso Laboratory

第17回 カメラでズーミングしてみよう(カメラ)

【第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文はリスト処理でしか使えなさそうです。
←戻る 目次 進む→
PVアクセスランキング にほんブログ村


ランキングに参加中。クリックして応援お願いします!

名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「Pythonスクリプト」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事