見出し画像

Rosso Laboratory

第20回 速度計を作ってみよう(スプライト)

【第4章】色々なオブジェクトで遊ぼう
第20回 速度計を作ってみよう(スプライト)
スプライトとはCGにおいて複数の画像や図形を合成して表示する技術のことで、ビューワー上に画像を表示し速度計などを作ることができます。
「スプライトの表示位置は直接指定と演算指定の2種類があります。いずれか1つを指定できます。」と公式のスクリプトマニュアルにあって、レイアウト内で1つの方法しか選べないように見えますが、実際にはスプライト毎に選んで利用できます。SetPosを使う直接指定は位置固定ですが透過を含めて通常のテクスチャー対応します。またSetOrgなどを使う演算指定はメーターの針みたいに回転できますが単色だけになっています。

【使用するVRMNX命令】レイアウトの命令:SetActive(部品ID)
部品IDで指定した部品を操作対象にします。編成、地上カメラ、ポイント、ターンテーブルが対象です。

【使用するVRMNX命令】CreateSprite()
スプライトオブジェクトのインスタンスを生成します。戻り値が生成したスプライトのインスタンスです。

【使用するVRMNX命令】LoadSystemTexture(リソースID)
テクスチャーに使用するリソースIDを指定します。戻り値がtrueで読み込み成功になります。

【使用するVRMNX命令】SetOrg(orgdx,orgdy)
演算指定時:基準となるスプライトの大きさを指定します。orgdxはテクスチャーの横サイズ、orgdyはテクスチャーの縦サイズ

【使用するVRMNX命令】SetZoom(zoomx,zoomy)
演算指定時:スプライトの拡大縮小率を指定します。1.0で等倍です。zoomxはテクスチャーの横倍率、zoomyはテクスチャーの縦倍率

【使用するVRMNX命令】SetRotate(pivotx, pivoty, rot)
演算指定時:回転するときの中心座標(pivotx, pivoty)と角度(rot:度数)を指定します。スプライトのソース範囲で指定したuv座標です。

【使用するVRMNX命令】SetTranslate(x,y)
演算指定時:スプライトの左上を画面上の指定座標(x,y)に移動します。

【使用するVRMNX命令】SetSprite()
スプライトを生成します。

【使用するVRMNX命令】SetUV(u0,v0,u1,v1)
直接指定時:スプライトのUV座標を設定します。左上が(u0,v0)で右下が(u1,v1)です。

【使用するVRMNX命令】SetPos(sx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3)
直接指定時:四角形スプライトの画面上の座標を設定します。 座標は左上が(sx0,sy0)で右上が(sx1,sy1)で左下が(sx2,sy2)で右下が(sx3,sy3)です。

【やってみよう】画像リソースを設定してある「親子で学ぼう用レイアウト(20初期状態).vrmnx」を開き、レイアウトにスクリプトをこのように書こう。書くのが大変ならコピペしよう。完成品は「親子で学ぼう用レイアウト(20).vrmnx」です。

#LAYOUT
import vrmapi
global bd_sprite #メーターボード
global nl_sprite #メーターの針
def vrmevent(obj,ev,param):
    global bd_sprite
    global nl_sprite
    if ev == 'init':
        vrmapi.LAYOUT().SetView(10)
        vrmapi.LAYOUT().SetActive(12)
        nl_sprite = obj.CreateSprite()
        nl_sprite.LoadSystemTexture(3)
        bd_sprite = obj.CreateSprite()
        bd_sprite.LoadSystemTexture(4)
        obj.SetEventFrame()
(中略)
    elif ev == 'frame':
        spd = vrmapi.LAYOUT().GetTrain(12).GetSpeed()
        angle = 60.0 + 1.5 * spd
        nl_sprite.SetOrg(4.0,64.0)
        nl_sprite.SetZoom(1.0,1.0)
        nl_sprite.SetRotate(2.0,0.0,angle)
        nl_sprite.SetTranslate(100+128,700+128)
        nl_sprite.SetSprite()
        bd_sprite.SetUV(0,0,256,256)
        bd_sprite.SetPos(100,700,100+256,700,100,700+256,100+256,700+256)
        bd_sprite.SetSprite()
(以下省略)

(1行が長すぎて表示がおかしいですがコピペは普通に使えます)

【解説】スプライトのインスタンスはグローバル変数を使う必要があります。また表示順は'init'イベントで先に記載した方が上になるようです。「親子で学ぼう用レイアウト(20初期状態).vrmnx」は「第15回 更にホームのベルを鳴らしてみよう(音源)」の完成品を基にしていますので走行する編成「TRAIN_12」の速度をメーターに表示しています。更には速度を手動で変更できるように編成「TRAIN_12」をアクティブにしています。

メーター周りについてはリソースID=3のメーターの針が演算指定、リソースID=4のメーターボードが直接指定です。

メーターボードと針の位置関係はこうなっています。

60度で0km/h、+30度で20km/hなので角度は60.0 + 1.5 × 速度となります。
これを毎フレーム計算し表示する事で速度計が成立しています。なお'frame'イベントのユーザーIDは省略しています。

【実践】それでは「運転」を押してビューワーを起動させましょう。左下の速度系が動作したら成功です(^^)/ 矢印キーの上下で編成の速度が変えられるので速度を変えて変化を見てみましょう。

←戻る 目次 進む→
PVアクセスランキング にほんブログ村


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

名前:
コメント:

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

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

 

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

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

最新の画像もっと見る

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

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