VRM:研究

VRMNXの時間系イベントが使いにくいなあと思っているアナタへ

実はそんな人いない説

はともかく。

まずはバージョン5以前の時間系イベントとVRMNXpyの時間系イベントの仕様の相違について,Afterイベントを例に見てみましょう。

バージョン5以前のイベントは,

//イベントを設定
SetEventAfter Target Method EventID Interval
// Target: 対象オブジェクト
// Method: 対象オブジェクトのメソッド
// EventID: イベントIDを受け取るグローバル変数(のポインタ)
// Interval: 時間間隔(ms)

BeginFunc Method
    // Intervalミリ秒後に実行する制御の中身
EndFunc

という仕様でした。一方でVRMNXpyでは

#イベントを設定
evid = target.SetEventAfter(Interval)
# target: 対象オブジェクト
# interval: 時間間隔(s)
# (返り値) evid: イベントID

#指定時間経過すると対象オブジェクトのイベントハンドラが呼び出される
def vrmevent_xx(obj,ev,param):
    if ev=='after':
        # Afterイベントが起きたときの制御の中身

聡明な読者諸兄には自明なことかと思いますが,VRMNXpyのイベントは,どのイベントIDであってもとりあえず同じコードを走らせてしまうという仕様になっています。イベントハンドラの中に様々な処理をベタ書きしているといつかバグの温床となるでしょう。

続きを読む "VRMNXの時間系イベントが使いにくいなあと思っているアナタへ"

| | コメント (0)

[VRMNX] フレーム同期の話

梅雨が長引いているところ関東は今日は久しぶりにしっかり晴れて暑くなりました。みなさんいかがお過ごしでしょうか。VRMNXの操作にも慣れてきたでしょうか。

きょうはまだマニュアル未整備なVRMNXから,「フレーム同期」についてのお話です。レイアウターとビュワーの両方に,それぞれ独立して「フレーム同期」の設定箇所があります。

Viewer
Layouter

さて,このフレーム同期のチェックは,デフォルトではOFFですが,ONにすることをおすすめします

どうしてか,ご説明します。

続きを読む "[VRMNX] フレーム同期の話"

| | コメント (0)

[Python] リスト型をベクトルに見立てて計算したい

いろいろ試していますがVRMNXpyで一向にnumpyが使えません。いい加減やってられないので,リスト型をベクトルに見立てて線形代数の主要な計算ができるコードを用意しました。

vrmapiの命令で使うことが前提なので,クラスを作って演算子をオーバーライドとかは一切せず,リスト型を放り込んでリスト型を返す関数に仕立てました。

def vecdot(vec1, vec2):
    # 内積(スカラー)を返す
    p = 0.0
    for i, j in zip(vec1, vec2):
        p += i*j
    return p

def vectrans(matrixA, vecx):
    # 線形変換 Ax
    vecy = []
    for k in range(len(vecx)):
        vecy.append(vecdot(matrixA[k], vecx))
    return vecy

def turnmatrix(matrixA):
    # 行列の転置
    m = len(matrixA)
    n = len(matrixA[0])
    return [[matrixA[i][j] for i in range(m)] for j in range(n)]

def matrixproduct(matrixA, matrixB):
    # 行列の積
    return [vectrans(turnmatrix(matrixB), ai) for ai in matrixA]

 

本来はベクトル計算は,ベクトルの次元が合っているかとか確認しなきゃいけないのですが,あえてそれもしていません。変な行列やベクトルを放り込んだらfor文のあたりでIndexErrorが出るはず。いろいろ雑ですがVRMNXpyで使いそうなベクトル計算はせいぜい3次元なので…。

>>> A = [[1,2],[3,4]]
>>> B = [[5,6],[7,8]]
>>> x = [1,2]
>>> y = [2,2]
>>> vecdot(x,y)
6.0
>>> vectrans(A,x)
[5.0, 11.0]
>>> turnmatrix(A)
[[1, 3], [2, 4]]
>>> matrixproduct(A,B)
[[19.0, 22.0], [43.0, 50.0]]

サンプルは2次元ですが3次元もいけます。

| | コメント (0)

VRMNXのレイヤーベース地形を使ってみよう(前編)

(5/18 23:43 テクスチャーを修正)
(5/19 21:15 一部リライト)

VRMNXの新しい機能のひとつに「レイヤーベースの地形」があります。これを使って海のようなシーナリーを試作してみました。

Gtex_lay

Gtex11_sea

Gtex11_sea2

ごらんのように,微妙なグラデーションの塗り合わせができるので表現の幅が広がります。

レイヤーベース地形では,4枚のレイヤーの「透明度(0.0~1.0)」に基づいて最大4つのテクスチャーを合成することができます。(公式マニュアルも参照。図がわかりやすい。)ここでは濃いブルーのレイヤーの上に,薄いブルーのテクスチャを乗せて海面を表現しています。要するに薄いブルー境界部分は半透明になっていてお互いの色,模様がブレンディングされます。

VRM5の地形ブレンディングは,グループの違うテクスチャパターンの境界が滲むような感じでブレンドされる仕様でしたが,要するにNXでは,レイヤーの違うテクスチャ同士を半透明に重ねてブレンディングする感じです。

レイヤーが4層ということは,VRM5では6種類(または12種類)の地面種別をブレンディングの効くものとして使えていたけど,NXでは4種類に減ってしまうの?と気になりますよね。

互換モードを使わないのであれば,実質的にYESではないかという気がしています。

でも,できるだけたくさんの地面種別(草,水,砂利,etc)がなんとかうまいことブレンドしてくれるような,うまい4レイヤーの使い方がないか。

4色定理に基づいた方法をひとつ考えたので紹介します。

4色定理

  • (飛び地などのない普通の地図に限って言えば)地図は,かならず4色で塗り分けられる
  • 平面グラフは,4彩色可能である

続きを読む "VRMNXのレイヤーベース地形を使ってみよう(前編)"

| | コメント (0)

[VRMNX]自動踏切モジュール

少し前に作った踏切グループを拡張するクラスを,threadingを用いて遮断機の遅延作動に対応させ,さらに,モジュールとして独立したファイルにまとめました。(VRMNXでのマルチスレッド処理の実装自作モジュールのインポートについては各記事を参照。)

Cros_mock

「CrossingCtrler.zip」をダウンロード (Zip, 1.15MB)

サンプルレイアウトは上記から入手できます。(自己の責任のもとでお使いください)
レイアウトファイルと,Pythonのスクリプトファイル(crossingctrler.py)が同梱されています。適当なフォルダに解凍してください。レイアウトファイルとスクリプトファイルを同じフォルダに保存してください。(そうでないとインポートができません!)

生成するスレッドの数を減らして動作を安定化したほか,例外処理やエラー処理を追加して使う人に親切になりました。

VRMNXにはスクリプトウィザードは(今のところは)ありませんが,それほど手間を掛けずに凝った仕掛けがレイアウトに組み込めること(そういうアドオンがPythonでなら書けること)が確認できたと思っています。

ご自身のレイアウトに踏切(方向表示機・遮断機遅延作動つき)のギミックを組み込む方法は以下をごらんください。

続きを読む "[VRMNX]自動踏切モジュール"

| | コメント (0) | トラックバック (0)

VRMNXpyでマルチスレッド

<注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点でのものである。> (2019/1/23 現在 Ver. 6.0.0.25)

Pythonではthreadingモジュールを使用することでマルチスレッド処理を行うことができます。VRMNXビュワーでもマルチスレッド処理ができれば,ちょっとしたタイマー処理を,VRMNXシステムのイベントハンドラを経由せずに行うことができるので,自動運転などのアドオン組み込みが楽になります。

VRMNXβテスト 公式ドキュメントの制限事項にも, Python付属のLIBの使用については、VRMNXではサポートしていません。importしても問題ないか確認いないため、サポート外としてご利用ください とあるとおり,threadingを含むモジュールの使用はサポート外となるわけですが,リリースノート6.0.0.25スレッドを生成する場合は、レイアウトにFrameイベントが発生するようにしてください。 FrameイベントによってPythonのインタープリタを駆動します とも書いてあります。動けば御の字,動かなかったら諦めてね,というお気持ちなんでしょうか。

このあたりを参考に,サンプルとして,キーを押すと1秒おきに'Hello, World!'を5回表示する処理を組んでみます。

続きを読む "VRMNXpyでマルチスレッド"

| | コメント (0) | トラックバック (0)

Pythonは空をも飛べる VRMNXは?

<注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。> (2019/1/20 現在 Ver. 6.0.0.25)

VRMNXのPythonエンジンでは,カレント作業ディレクトリ(os.getcwd()で取得できる)と,モジュールを検索する場所sys.path)はどのようになっているのか,次のコードで調べてみた。

import vrmapi
import os, sys

vrmapi.LOG('[CWD] ', os.getcwd())
vrmapi.LOG('[PATH]')
for p in sys.path:
    vrmapi.LOG(p)

結果,

  • カレント作業ディレクトリは,レイアウトを保存しているフォルダ
  • モジュール検索パスは,VRMNXインストールフォルダ/python/Lib

であることがわかった。

続きを読む "Pythonは空をも飛べる VRMNXは?"

| | コメント (1) | トラックバック (0)

[VRMNXpy]踏切のグループを拡張しよう

今回は,Pythonの「クラス」を使ってみます。

旧VRMスクリプトにもあった CrossingGroupCTRLVRMNXpy にも実装が引き継がれましたが,これで踏切を作動させても踏切警報機にある方向表示機は真っ暗なままです。接近する列車の方向や何本もの列車が同時に踏切に接近してくる場合も考慮するとなれば,やや複雑な処理が必要です。

Crossing


同じようなことを実現する自動踏切スクロールを過去に作りましたが,これをVRMNXpyで実装してみましょう。ただし,今回は遮断桿が遅れて降りてくるのは省略です。(次回やります)

クラスとかインスタンスという言葉が聞き慣れない方は, Pythonで学ぶ基礎からのプログラミング入門~オブジェクト指向について学ぼう が分かりやすいです。(8本とやや長めです)

<注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。> (2019/1/17 現在 Ver. 6.0.0.25)

続きを読む "[VRMNXpy]踏切のグループを拡張しよう"

| | コメント (0) | トラックバック (0)

VRMNXpyで205系のドア開閉

VRMNXpy(Pythonベースの新しいVRMスクリプト)を書いて,新たに実装されたドア開閉機能のある205系を実際に動作させてみた。指定距離停止をやってみた回ではセンサーでイベントを発生させたが,今回はキーイベントを使用する。

注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。>

今回の実装のターゲットは次のとおりである。

  • Z/Aキーで左側のドアを開閉
  • X/Sキーで右側のドアを開閉

ただしドア開閉をするのは操作対象の編成に限る。方向転換を伴うと「左右」は入れ替わる可能性があるが,今回はこのことは考慮しない。

続きを読む "VRMNXpyで205系のドア開閉"

| | コメント (0) | トラックバック (0)

種別コードを先入れ先出しするキュー Python編

以前,バージョン5のVRMスクリプトで種別コードを先入先出するキューの作例を紹介した。旧VRMスクリプトには配列変数のような概念はなかったので,32bit int型変数を3ビットずつ区切って0~7の種別コードを入れる「枠」とみなし,ビット演算によって種別コードをキューに入れたり取り出したりしていた。

Pythonにおいては,Cでいう配列変数を強化したような「リスト」というデータ形式があるので,それを使って同じことをしてみよう。リストはPython標準の型なので,VRMNX上のPythonエンジンでなくても使うことができる。

続きを読む "種別コードを先入れ先出しするキュー Python編"

| | コメント (1) | トラックバック (0)

より以前の記事一覧