忍者ブログ

slack diary

鉄道模型シミュレーター(VRM)を紹介するホームページ「CaldiaのVRM Room」の更新情報と、Caldia本人の日常ぐだぐだ日記。

VRMNX 太陽再現スクリプト レビューと改造

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

VRMNX 太陽再現スクリプト レビューと改造

レイアウトで写真を撮る際に逆光だなーとか影が横から欲しいなーと思ったとき、VRMNXでは天候や太陽の角度などがビュワーから自由に変更できます。
地味に非常にありがたい機能ですが、この光源(=太陽)をフレーム毎に少しずつ動かせばオープンワールドのような「時の流れ」を表現できるのでは、と思っていました。
作成しようとしたとき、傾きとかを計算するのが大変だなーと感じたので未着手だったのですが、ありがたい事に同じことを考えた方がVRMレイアウト公開所にアップロードされているのを見つけたので紹介したいと思います。

C-PONさんの「太陽再現スクリプト」は季節による太陽高度の傾き変化も計算に含めたリアルタイム天球シミュレーションになっています。
基本的な数値は自作のImGuiから参照や操作が可能。
太陽の動きに合わせて背景の変更や現在時刻を示す時計もスプライトで描画されています。

サンプルレイアウトはスターターキットで動きます。
夜になると列車が駅に停まります。


以下は「太陽再現スクリプト」を流用してCaldiaが遊ぶ用に改造した内容になります。

1.時計のオミット

現時点の最新バージョン(6.0.0.223)ではスプライトの終了処理に不具合があるらしく、自環境ではビュワー終了時に異常終了となります。。
後述の仕様を取り込むと目まぐるしく動くこと、他のレイアウトへ導入する際にスプライト用のリソースを追加する手間を省くため等の理由から、時計を非表示にします。

以下の部分をコメントアウトします。

    #global sprite
    #sprite = obj.CreateSprite()
    #sprite.LoadSystemTexture(lodict['clrs'])
    #if lodict['stokei']:
    #    stokei(obj)

2.ゲーム速度の倍化

太陽再現スクリプトは現実と同じ速度で動きますが、そこまでのんびり過ごすのはせっかちな現代人には厳しいです。
鉄道博物館のジオラマ運転や一般的なゲームでも、1日の表現はもっと短いサイクルで回しています。
いくつかのゲームを確認したところ、概ね30秒か1分でゲーム内の1時間、つまり6分~12分で1日になるものが多いようです。
今回は1日を6分、120倍でゲーム内時間を進むようにします。
変数「lodict['hayasa']」が時間の加速度を表しているので、ここを「120」に変更します。

lodict['hayasa'] = 120 #時間の加速度1で現実速度


3.処理の省略(負荷軽減)とタイミング調整

「lodict['anime']」を天球書き換え用に用意します。


    # 太陽と天球のアニメーション速度(秒) 現実速度1なら10分で動作
    lodict['anime'] = 1200 / lodict['hayasa']


これはtenkyuメソッドで毎フレームで「100/lodict['hayasa']」を計算している処理を初回のみで済ませる負荷軽減策になります。
ついでに文字数を削減するため「vrmapi.LAYOUT().SKY()」を「sky」変数に代入します。
処理に変化はありませんが、全体の文字数が減り、可読性が向上します。


# 天球書き換え
def tenkyu(obj):
    sky = vrmapi.LAYOUT().SKY()
    lodict=obj.GetDict()
    if lodict['lat'] < 18 and lodict['iro']==0:
        lodict['iro']=1
        sky.LoadSkyImage(1,lodict['yuurs'])
        sky.SetAnimeSkyFactor(1.0, lodict['anime'])
        sky.SetSunType(6, lodict['anime'])
    if lodict['lat'] < -6 and lodict['iro']==1:
        lodict['iro']=1.5
        sky.SetSunType(5, lodict['anime'])
    if lodict['lat'] < -10 and lodict['iro']!=2:
        lodict['iro']=2
        sky.LoadSkyImage(0,lodict['yorrs'])
        sky.SetAnimeSkyFactor(0, lodict['anime'])
        sky.SetSunType(3, lodict['anime'])
    if lodict['lat'] > -7 and lodict['iro']==2:
        lodict['iro']=1.8
        sky.LoadSkyImage(1,lodict['yuurs'])
        sky.SetAnimeSkyFactor(1, lodict['anime'])
        sky.SetSunType(1, lodict['anime'])
    if lodict['lat'] > 12 and lodict['iro']!=0:
        lodict['iro']=0
        sky.LoadSkyImage(0,lodict['hirrs'])
        sky.SetAnimeSkyFactor(0, lodict['anime'])
        sky.SetSunType(0, lodict['anime'])


条件分岐の数値も細かく弄っています。
ゲーム速度を加速したことで既存のアニメーションタイミングでは一瞬で天球が切り替わってしまうため、
もっと時間を掛けて緩やかに変化するようにしています。
また、現実では日の出前や日没後も太陽光は回折して届くため、明るい時間が長くなるように調節しています。

4.処理の追加外出し

太陽再現スクリプトは「sunsim.py」という外部ファイルに処理が固められていますが、天球リソース指定などの一部処理はレイアウトスクリプトに書かれています。
レイアウトファイルに記述するスクリプトを可能な限り減らしたいので、残りのコードも「sunsim.py」へ移動させます。

def vrmevent(obj,ev,param):
    sunsim.vrmevent(obj,ev,param)


def vrmevent(obj,ev,param):
    if ev =='init':
        init(obj)
        obj.SetEventFrame()
    elif ev == 'frame':
        window(obj)


def init(obj):
    lodict=obj.GetDict()
    lodict['hirrs']=1 #天球昼リソース番号
    lodict['yuurs']=2 #天球夕リソース番号
    lodict['yorrs']=3 #天球夜リソース番号



パワーユニットくん」や「ファイル連携システム」で採用しているように「vrmevent」をsunsim側で再定義しています。
これでレイアウトオブジェクトには実質2行で組み込めるようになります。
以上の改造により、6分で1日の時間経過をアニメーションで楽しめるようになります。
他にも雲や霧を表示させたり、複数の天球テクスチャをランダムで変化させたりする仕組みも楽しそうです。
上記改造コードはC-PONさんが許可頂ければgithubにでもアップロードしようと思います。
PR

コメント

1. お恥ずかしい限りです

Caldiaさん、はじめまして。件のレイアウトを作成したC-PONです。本日記事掲載に気付きました。
趣味の独学で作った稚拙なスクリプトを取り上げていただき、至極お恥ずかしい限りです。
如何せん重いのは分かっていてもどう改善すればいいのかわからない状態だったので大変ためになります。
そもそも天球画像自体もCaldiaさんのところから頂いたものなのでこちらも感謝です。
(厳密には作成者Hagu-Rさんとのことですが引退されているのでしょうか…)
readmeにも記載していた通り"改造・転用は自由ですが作者は一切の責任を負いません。"なので是非普及してやってください。
というかオンライン版のサーバー移転に伴い元の公開場所は確実に消滅するでしょうね…
もっとVRMが普及してほしいと思ってはいるのですがまず大本営に積極性が全然感じられませんし
逆に言えばそんな状態でもよくここまで続いたもんだと思うほどです。
今回のサーバー移転を機に事態が良い方向へ向かうことを願うばかりです。

2. ご連絡感謝

C-PONさん、はじめまして。
しばらくブログ放置していました。
ご連絡頂けて嬉しいです。
天球テクスチャも利用頂きありがとうございます。

記事内の修正は単なるリファクタリングにすぎず、どんな形であれやりたいことをVRMNXのPythonコードに落とし込むという0から1を生み出す所業を成されたC-PONさんは誇られていいと思います。
ボーッと眺めていても時間の経過が楽しいので、過去のVRMオンライン運転会でも紹介させてもらいました。

元のレイアウト公開先も確かに今年いっぱいで終わりそうな雰囲気ですね。
自分もたまたまC-PONさんのレイアウトを発見できましたが、Webサイトは検索性もイマイチだったため、他の沢山あるであろう公開レイアウトやリソースが消えてしまうことを残念に思います。
VRM Cloudサービスのように、自作車両だけでなくレイアウトやリソース公開場所も新設して欲しいですね。

改めてご許可頂けたので(少々時間掛かりそうですが)追加の説明や修正を入れてGitHubに公開したいと思います。
C-PONさんの今後の活躍にもご期待しています。

最新コメント

[05/30 Caldia]
[05/19 C-PON]
[10/03 vrmkyobuilding]
[05/10 Caldia]
[05/04 USO800鉄道]