107系に続き,VRM自作車両の第2弾に着手しました。電車&気動車のセットで仕上げるつもりです。
107系よりもかなり造形が複雑です。かなりいいデザインなのですが,衝撃に強いという機能的にも優れているらしいです。
先日リリースした自作車両の107系であるが,足掛けX年の歳月がかかったものの,さまざまな自作車両製作上のノウハウが得られたという点では時間を掛けた甲斐があったかなと,今となっては思っている。
対象車両の選定について
この自作車両の初回作のプロジェクトは,VRM Cloudのかなり初期から自分の中では存在していた。当初,複数の候補があったのだ(701系や,新潟トランシス製の気動車など)が,直流電車であること,クハとクモハの2車種だけであること,比較的地元の近くを走っていることから107系に決定した。
自作車両で作ってみたいなと思う車両は当然いくつもあるのだが,やはり圧倒的に電車がそのなかで多いことを考えるとパンタグラフ工程をいつかは克服せねばならないので,はじめから甘んじずに,気動車ではなく電車を選ぶこととなった。701系は残念ながら交流電車=パンタまわりが直流車より相当複雑なので候補から外れることになった。また,701系は製造時期による形態差がどうやら107系より多い(のではないか)ということでも敬遠の原因になった。
製作上のテーマや制約について
モデルの仕様は,はじめから「車内なし ライト・パンタは動作あり」で考えていた。またポリゴン数のおおまかな目標として,1両5000ポリゴンを目標とした。VRM2最後期のEF58 (1号編成)が1両2000ポリゴンレベルのモデルであったことをベースに,PC性能の進化と,色の塗り分けをテクスチャリングではなくポリゴンの分割でやることを前提に2倍強に盛った。が,公式よりも少ないであろう水準に抑えた。(公式の車両は1両あたりだいたい1万~2万じゃないかと想像している。肌感覚的に。)
おそらく,I.MAGICの中の人は,製品の品質保証という意味で,本格的なゲーミングマシンじゃなくてもまあまあ動いてくれるように腐心されている。ビュワーのプログラム本体もそうだが,当然モデルもローポリゴンなモデルを相当意識されていて,ビュワーの高速動作を実現している(のだと私は感じている)。
そういうI.MAGICの,良く言えばLEAN(無駄のない),悪く言えばケチな,そういう設計思想を尊敬している部分があるので,このプロジェクトの絶対的な制約として「I.MAGICを超えるものは作らない」ということを,内心に標榜した。そういう5000ポリゴン縛りである。(で,結果的にだいたいそのくらいのポリゴン数に収まった。ちょっと溢れたけど1万にはいっていない。)
使用できるテクスチャサイズに512x256というかなりシビアな制約が課されていて,これだけはどうにも動かすことができない。対して,フリーの3D鉄道ゲームで,車両の自作が可能なものがいくつかあって,見目麗しくて羨ましくなることもあるのだが,そういうものはローポリゴンを標榜していても,使用するUVテクスチャがものすごい大きさだったりして,ビデオメモリを圧迫するのが目に見えているようなものもある。
大きなレイアウトサイズと高速な動作というVRMの長所を脅かさないよう,ローテクスチャだからといってポリゴン化に甘んじない,そういうライバル心むき出しの実装方針を打ち立てたのである。
続きを読むみんな気づいてるとは思うけど,誰も取り上げてくれないVRMNXの画期的な仕様が2点あるので,ここに書き留めておこうと思う。
ひとつめは,ビュワー起動時に車両のない「空の編成」がエラーとならなくなったこと。
ふたつめは,Pythonが元来持っている,(ときに過剰とも言われる)エラーチェックの数々である。
この絶妙なエラー処理のバランスによって,部品欠損に対する頑健性がかなりアップしている。もちろん「なんの不都合も起き得ない」わけではないだろうが,他人のレイアウトファイルをダウンロードして入手したときにかなり深刻な部品不足があっても,なんとかビュワーを起動してレイアウトの雰囲気を味わうところまでは多くのユーザーがたどり着くことができるだろう,という話だ。
続きを読むVRMNXむけに再構築された「撮る夫くんNX」です。車両追尾機能がついて実質的な移植作業が完了しました。
被写界深度は一眼レフカメラのボケ方をシミュレーションしています。カメラと同じような感覚で操作できます。Ver.3.0.3で「プログラムAE」モードを追加しました。ズームの操作に絞りが連動します。ズームと合焦距離の調整だけでよりシンプルに操作できるようになりました。
車両追尾機能は,ビュワー上のGUIで簡単に追尾対象や相対位置を指定できます。中間車のロゴマークの追尾など今までにない演出が可能です。
また,撮る夫くんの視点を保存し,次回呼び出すことができるようになりました。レイアウト上のお立ち台などに設定すると,スクリーンショットの撮影に役立ちます。
撮る夫くんで編成の中間を追尾 #vrmnx pic.twitter.com/uCYzbvissN
— AKAGI (@AKAGIvrm) June 28, 2019
撮る夫くんにプログラムAEモードを搭載しました。 #vrmnx pic.twitter.com/Kk3ADnnTQp
— AKAGI (@AKAGIvrm) June 28, 2019
撮る夫くんのモジュールとサンプルレイアウトを同梱しています。お手元のPCの適当なフォルダに解凍してください。このバージョンのサンプルレイアウトはスターターキットでご覧いただけます。
ご自分のレイアウトに撮る夫くんを組み込む際は,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文の中に入れないでください。
続きを読む
いろいろ試していますが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次元もいけます。