AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたら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次元もいけます。

撮る夫くんNX 追尾機能+α

先日,暫定版で公開した「撮る夫くんNX」の機能強化を進めています。

Toruo302a

追尾機能の原型ができました。ビュワーのGUIでリアルタイムに追尾対象の編成・車両を選択できます。先頭車・最後尾だけでなく,中間車の追尾も可能なのは,撮る夫くんならではの機能です。

NX版の撮る夫くんは追尾中もブルブル手ブレします。(しかし分かりにくい)

追尾中のオートフォーカスの実装も計画しています。

Toruo302b

撮影ポイントを保存する機能も追加しました。外部ファイルにカメラ座標を保存する仕組みにしましたので,次にレイアウトを起動したときにも簡単に元の撮影ポイントに移動できます。FOVや被写界深度の状況も復帰します。

ほかにも撮る夫くんにできることがないか,模索中です。


ImGuiはなかなかに触り甲斐のある機能です。バージョン5と違ってなんでもかんでもキー操作で実装しなくていいので高機能化に拍車がかかります。(GUIウィンドウを開くのはどうしてもキー操作になります。センサーでも使わない限り。)

毎フレームの処理量が増えすぎないようにコードをうまく仕上げるのが難しいです。

撮る夫くんNX Ver. 3.0.1 β

こちらは撮る夫くん旧バージョンのリリース記事になります。撮る夫くんの最新版(Ver. 3.0.3)はこちらからどうぞ。

以前からVRM5向けに公開していた「フライスルーカメラ撮る夫くん」を,VRMNX向けに移植しました。

撮る夫くんNXの機能

  • 手ブレ機能
  • 被写界深度の簡単スライダー操作
  • ズーム&首振りの同時操作
  • 車両追尾機能(実装中)

カメラ自体の移動はテンキーを使う方法に改めました。車両追尾はまだ出来ていないので次回バージョンで搭載します。

被写界深度は,一眼レフカメラのレンズ機構をシミュレーションしてシンプルに操作できるようになっています。

ダウンロード&組み込みガイド

ダウンロード - toruo_v3.0.1.zip (709KB)公開終了

撮る夫くんのモジュールとサンプルレイアウトを同梱しています。お手元のPCの適当なフォルダに解凍してください。サンプルレイアウトは不親切なことにTOMIXレールと205系山手線が必要です。

ご自分のレイアウトに撮る夫くんを組み込む際は,toruo.pyをレイアウトファイルと同じフォルダにコピーして,レイアウトスクリプトに次のコードを2行,書き足してください。

import vrmapi
import toruo
def vrmevent(obj,ev,param):
    toruo.activate(obj,ev,param)
    if ev == 'init':
        #以下省略

例によってインデントは半角スペース4つ分です。toruo.activate(obj,ev,param) はif文の中に入れないでください。

続きを読む

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のPythonではイマイチ空が飛びにくい

先日,冗談半分で以下の漫画を紹介した。

Python

どういうことかというと,Pythonというプログラミング言語は,インターネットで様々な「モジュール」が公開されていて,様々な拡張機能を簡単に追加することができるということを言っている。 antigravity(反重力機構の意味)というモジュールまで何でもあるので,これをimportするだけで空も飛べちゃうよ,という,洒落になっている。

(ちなみにこのantigravityモジュールは実在するので読者諸兄もimportしてみてほしい。)

Pythonはプリインストールのモジュール以外にも,様々な方法でモジュールを追加することができる。その大半は無料で提供されている。

はずなのだが。

続きを読む

撮る夫くんNX 準備中

VRMNXでも「撮る夫くん」が使えるように,スクリプトを新しく書き起こしています。

撮る夫くんは,VRMビュワーの新たな表現の試みとして,ハンディカメラで撮影した映像が手ブレしているようなカメラの動きをスクリプトを使って模擬したものです。このほか,ズーム&パンの同時操作ができます。

デモがこちらです。(手ブレしているので映像酔いに注意。)

これを作るにあたって,人間の手ブレの動きがどういうものなのか知りたかったので調べたのですが,世の中手ブレを「補正」したい人ばかりで,リアルな手ブレの動きを作り出したい人はそうそういなかったようです。したがって撮る夫くんは超適当な手ブレシミュレーションにすぎませんが,乱数を三角分布から生成するなどNX時代のスクリプトにふさわしい,ちょっと高級な内部機構になってます。

このあと,地上カメラとは一味違う追尾モードを実装したら公開したいなと思っています。

  • 先頭・後尾だけでなく中間車両も追尾可能
  • 追尾中,水平面上のカメラ回転だけでなく上下にもカメラが動きます

旧バージョンではできなかった,「追尾中も手ブレ」も実現する予定です。

続きを読む

VRMNXでnumpyが使いたい

ベクトル計算をすることを考えると,list型をベタベタ計算するよりは,numpyのほうが便利そうです。

しかしVRMNXのpythonエンジンにはnumpyがインストールされていません。かといって,インストールの仕方も分かりません。

手元のPython3.7環境のsite-packageのnumpyをVRMNXのそこへ移植してみたり,
os.system('pip install numpy')をVRMNXからやってみたり,
色々試したけれどダメでした(予想通り)。

なにかご存知の方がいらしたら教えてください。