βテストにご参加いただきまことにありがとうございます。
次回更新にて、制式レンダリングエンジンの実装準備工事に実施します。ポリゴンのななめエッジをスムーズにするアンチエイリアスは、次回更新で停止になります。ハードウェアによるアンチエイリアスのかわりにシェーダーによるアンチエイリアスを採用検討しています。
新しいレンダリングエンジンの開発は、最初の山場を超えました。多彩な表現をシェーダーでカバーするための実装作業を集中的にすすめています。
βテストにご参加いただきまことにありがとうございます。
次回更新にて、制式レンダリングエンジンの実装準備工事に実施します。ポリゴンのななめエッジをスムーズにするアンチエイリアスは、次回更新で停止になります。ハードウェアによるアンチエイリアスのかわりにシェーダーによるアンチエイリアスを採用検討しています。
新しいレンダリングエンジンの開発は、最初の山場を超えました。多彩な表現をシェーダーでカバーするための実装作業を集中的にすすめています。
NXシステムの組み込みPythonには、標準的なモジュールライブラリを用意しています。さらにモジュールを拡張する場合は、WindowsにインストールしたPythonをモジュールの検索パスに追加します。
#レイアウトスクリプトに記述
import sys
sys.path.append("C:\Python37\Lib")
sys.path.append("C:\Python37\Lib\site-packages")
#このあとに追加した検索パスから読み込むモジュールをimportする
sysをimportして、sys.pathにモジュールの検索パスを追加します。追加する検索パスは、WindowsにインストールしたPythonのパスを指定します。
“Lib”の他に”Lib/site-packages”を追加してください。pipでインストールしたモジュールもimportできます。さらに必要に応じてDLLsも検索パスに追加してください。
検索パスを追加した環境でimportした場合、環境依存になります。レイアウトを公開する場合はご注意ください。
平素は鉄道模型シミュレーターオンラインをご利用いただきまことにありがとうございます。
本日17時より1時間ほど、鉄道模型シミュレーターオンラインのデータベースアップグレード作業を実施します。
メンテナンス実施中は、鉄道模型シミュレーターオンラインおより関連webサイトはご利用いただくことができません。大変ご面倒をおかけいたしますが、作業完了までお待ちいただけますようお願い申し上げます。
βテストにご参加いただきまことにありがとうございます。
ビルド60にて追加したゲームパッド関数のサンプルです。
ゲームパッドは、最大4台をPCに接続、スクリプトから認識することができます。
IsGamepadConnected()関数は、ゲームパッドが接続されているか確認します。
デバイス番号を0から3のいずれか1つで指定、当該デバイスが接続されていればTrueを返します。
GetGamepad系関数は、ボタンが押されていた場合、Trueを返します。この関数もデバイス番号を指定します。
AnalogStick関数は、16ビットの符号付き整数で傾き具合を返します。
サンプルは、編成スクリプトのframeイベントでゲームパッドの状態を表示するウィンドウを開いています。
このビルドからSYSTEM()関数を追加しました。この関数はLAYOUT().SYSTEM()と同じ動作です。記述を短縮できます。
#OBJID=6
import vrmapi
def vrmevent_6(obj,ev,param):
if ev == 'init':
obj.SetEventFrame()
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
vrmapi.ImGui().Begin("w1","Sample")
vrmapi.ImGui().Text( "pad0-> " + str(vrmapi.SYSTEM().IsGamepadConnected(0)) )
vrmapi.ImGui().Text( "pad1-> " + str(vrmapi.SYSTEM().IsGamepadConnected(1)) )
vrmapi.ImGui().Text( "[0]-A " + str(vrmapi.SYSTEM().GetGamepadA(0)) )
vrmapi.ImGui().Text( "[0]-B " + str(vrmapi.SYSTEM().GetGamepadB(0)) )
vrmapi.ImGui().Text( "[0]-X " + str(vrmapi.SYSTEM().GetGamepadX(0)) )
vrmapi.ImGui().Text( "[0]-Y " + str(vrmapi.SYSTEM().GetGamepadY(0)) )
vrmapi.ImGui().Text( "[0]-Analog L " + str(vrmapi.SYSTEM().GetGamepadAnalogStickLY(0)) )
vrmapi.ImGui().Text( "[0]-Analog R " + str(vrmapi.SYSTEM().GetGamepadAnalogStickRY(0)) )
vrmapi.ImGui().End()
elif ev == 'couple':
#以下省略
ビルド60にて、ゲームパッドに対応しました。Windows標準のゲームパッドがご利用いただけます。
上下 | 速度調整、ノッチ変更 |
A | 警笛 |
B | 進行方向 |
X | オフセット操作リセット |
Y | 制御装置切り替え |
LB/RB | 外部カメラ:左右移動 運転台カメラ:回転 |
ビュワーのカメラ視点は、「運転台モード」と「外部カメラ」があります。運転台モードは、運転席からの視点に対応しています。運転席からのカメラオフセット操作は、回転操作がメインになります。
Pythonでは、ゲームパッドの状態値を取得できます。ゲームパッドのボタンごとにマスクをかけて、スクリプトでボタンを専有することもできます。(専有した場合、通常の操作が無効化されます。)
最大4台までのパッドをスクリプトで使うことができます。
新横浜駅「キュービックプラザ新横浜」のGWイベントに新幹線シミュレーターが登場します。詳しくは、 下記、キュービックプラザ新横浜のイベント情報をご参照ください。
βテストにご参加いただきまことにありがとうございます。
スプライトに幾何学演算機能を追加しました。
スプライトを設定する場合、表示座標を直接指定する場合は、SetPos()を利用して下記の流れで指定します。
座標値は、Pythonで演算した結果を設定します。
SetUV() -> SetPos() -> SetSprite()
スプライトシステムに基本的な幾何学演算を依頼することもできます。
SetUV() -> SetZoom() -> SetRotate() -> SetTranslate() -> SetSprite()
この流れで拡大縮小、回転、移動を計算します。UVまたはOrg関数で指定した大きさの四角形を拡大縮小、回転、移動の順に計算します。
SetZoom()などは、演算パラメータの設定を行います。(関数の呼び出し時点で演算は実行しません。)
幾何学演算は、SetPos()とは排他的です。幾何学演算または直接指定のいずれか1つが使用されます。
SetColor()は、RGBAのそれぞれの強さを指定します。スプライトのテクスチャーに乗算します。
サンプルでは、RBを0にして、Gのみ表示しています。
シェーダーの合成演算によって結果が異なります。半透明にする場合は、RGBAのすべての要素を減らしてください。
#OBJID=6
import vrmapi
global tr_sprite
tr_rot = [0.0]
tr_win = [1]
def vrmevent_6(obj,ev,param):
global tr_sprite
global tr_rot
global tr_win
if ev == 'init':
tr_sprite = vrmapi.LAYOUT().CreateSprite()
tr_sprite.LoadTrainTexture(obj.GetID(), 1)
obj.SetEventFrame()
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
vrmapi.ImGui().Begin("w1","Sample", tr_win, vrmapi.ImGuiWindowFlags.MenuBar)
vrmapi.ImGui().SliderFloat("sl1", "ROTATE", tr_rot, 0.0, 360.0)
tr_sprite.SetUV(0,0,84,72)
tr_sprite.SetPos(0,100,84*2,100,0,100+72*2,84*2,100+72*2)
tr_sprite.SetSprite()
tr_sprite.SetUV(0,78,128,78+44)
tr_sprite.SetZoom(2.0,2.0)
tr_sprite.SetRotate(0,0,tr_rot[0])
tr_sprite.SetTranslate(450,300)
tr_sprite.SetColor(0.0,1.0,0.0,1.0)
tr_sprite.SetSprite()
vrmapi.ImGui().End()
# 以下省略
βテストにご参加いただきまことにありがとうございます。
ビルド57にて、ImGuiのBegin()関数のフルバージョンをご用意しました。
ウィンドウのOpen状態を記録する変数とフラグが設定できます。
フラグはvrmapi.ImGuiWindowFlagsで指定します。
vrmapi.ImGuiWindowFlags.NoTitleBarでタイトルバーが非表示になります。
フラグはor演算で複数指定できます。
#LAYOUT
import vrmapi
po1 = [0];
po2 = [0];
def vrmevent(obj,ev,param):
if ev == 'init':
obj.SetEventFrame()
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
global po1;
global po2;
vrmapi.ImGui().SetNextWindowPos(0,60)
vrmapi.ImGui().SetNextWindowSize(320,200)
vrmapi.ImGui().SetNextWindowSizeConstraints(320,200,480,240)
#タイトルバーなし
vrmapi.ImGui().Begin("win10","Sample Window", po1, vrmapi.ImGuiWindowFlags.NoTitleBar)
cpos = obj.SYSTEM().GetGlobalCameraPos()
vrmapi.ImGui().Text("SYSカメラ座標 =>"+str(cpos[0])+" "+str(cpos[2]))
vrmapi.ImGui().End()
vrmapi.ImGui().SetNextWindowPos(0,260)
vrmapi.ImGui().SetNextWindowSize(480,120)
vrmapi.ImGui().SetNextWindowSizeConstraints(480,120,480,120)
#移動、リサイズ禁止
vrmapi.ImGui().Begin("win11","2nd Window", po2, vrmapi.ImGuiWindowFlags.NoMove | vrmapi.ImGuiWindowFlags.NoResize)
vrmapi.ImGui().Text("第二ウィンドウ")
vrmapi.ImGui().End()
elif ev == 'keydown':
dummy = 1
VRMCLOUDのAndroid対応アプリについて、Google Playのポリシーにより次回更新からAndroid 8.0以上対応に変更となります。
現在、Android8対応版の開発テストを行っています。ハードウェアチェックなどが完了次第、公開する予定です。
βテストにご参加いただきまことにありがとうございます。
編成部品でスプライトを使用するサンプルスクリプトです。
485系クハの車両テクスチャーから、ヘッドマークと方向幕をスプライトで表示しています。
(車両テクスチャーは、部品の組み込みテクスチャーを保存して、編成リソースに登録してください。)
実装については、下記コードのコメントをご参照ください。
ヘッドマーク
(0,0)から84*72 pixel
方向幕
(0,78)から128*44 pixel
#OBJID=6
import vrmapi
#global変数でスプライトオブジェクトを格納する変数を宣言
global tr_sprite
def vrmevent_6(obj,ev,param):
#global変数を使うことを指定
global tr_sprite
if ev == 'init':
# initイベントでスプライトオブジェクトを生成
# スプライトオブジェクトの生成は、LAYOUTの関数
tr_sprite = vrmapi.LAYOUT().CreateSprite()
# 編成のリソースからテクスチャーを読み込む
# サンプルのテクスチャーは、リソース番号1
tr_sprite.LoadTrainTexture(obj.GetID(), 1)
# フレームイベントを設定
obj.SetEventFrame()
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
# スプライトは毎フレーム、設定する
# UV, POSを指定して、SetSpriteで登録
# 1枚めのスプライトを設定(ヘッドマーク)
tr_sprite.SetUV(0,0,84,72)
tr_sprite.SetPos(0,100,84*2,100,0,100+72*2,84*2,100+72*2)
tr_sprite.SetSprite()
# 2枚めのスプライトを設定(方向幕)
tr_sprite.SetUV(0,78,128,78+44)
tr_sprite.SetPos(0,300,128,300,0,300+44,128,300+44)
tr_sprite.SetSprite()
elif ev == 'couple':
dummy = 1
# 以下省略