Densyakunのブログ

Qiitaもやってます: https://qiita.com/Densyakun

配線略図エディタで作った特殊な配線

立体交差、交差支障を中心とした配線を制作しています。

新しいの作ったら更新します。

架空鉄道の要素もあります。

架空鉄道の地図はこちら

 

配線略図エディタ

Railroad Wiring Diagram Editor

 

大型スイッチバック

大型スイッチバック駅 | Railroad Wiring Diagram Editor

2面4線のスイッチバック駅です。

私の架空鉄道には永田町ー坂東市ー宇都宮ー市塙の路線がありました。

現在は人口密度の関係上、採算性のある区間が残っています。

その一部である宇都宮駅の配線です。

当駅より「い」方面の列車は本数が多く、「ろ」方面は本数が少ないです。

基本的に「い」からの列車は当駅で折り返すか、「ろ」方面に直通します。

この配線のメリットは、日本の鉄道は基本的に左側通行ですが、ホームから「ろ」方面は「い」方面に対して右側通行になっています。

こうすることで列車の動線を効率化しています。

頭端式ホームを想定していますが、

オプションで線路を延伸することで「は」方面を追加し、中間駅にすることができます。

また、全体的に本数が少ない場合は、2番線と3番線の間の島式ホームのみの1面2線にすることもできます。

また、「ろ」方面は立体交差したあとに単線となっていますが、

こちらもオプションで複線化できます。

 

【架空】関東高速鉄道 世田谷駅 立体

【架空】関東高速鉄道 世田谷駅 立体 | Railroad Wiring Diagram Editor

渋谷方面と武蔵新城方面が直通し、本数が最も多く、

久地方面の各駅停車種別が目黒方面に直通し、それ以外が渋谷方面と直通します。

2つの路線が交差する当駅では、上下線が2層構造になっており、それぞれ対面乗り換えができます。

 

乗換別複々線

乗換別複々線 | Railroad Wiring Diagram Editor

山手線と総武線の代々木〜新宿間を改良したものですが、

立体交差に必要な、両駅のホームの端から端までの距離や、代々木駅南側のカーブの距離が足りないため、実際には不可能です。

両駅を3面4線にすることで、それぞれの駅で3方向の対面乗り換えを可能にし、合わせると4方向同士の乗り換えを効率化しています。

乗降も分散されるため、乗降時間は短くなりますが、ドアの開閉には時間がかかります。

 

立体シーサスクロッシング(複線幅)

立体シーサスクロッシング(複線幅) | Railroad Wiring Diagram Editor

複線において同一方向に向かう2つの列車を、

交差支障なく、同時に転線するための配線です。

三複線以上のスペースがある場合は、

両渡り線を立体交差させることでできますが、

スペースがない場合はこのような配線にする必要があります。

 

三複線立体シーサスクロッシング

三複線立体シーサスクロッシング | Railroad Wiring Diagram Editor

三複線において同一方向に同時に向かう3つの列車を、

交差支障なく、同時に転線するために必要な配線です。

 

複々線立体シーサスクロッシング

複々線立体シーサスクロッシング | Railroad Wiring Diagram Editor

複々線において同一方向に向かう4つの列車を、

交差支障なく、同時に転線するために必要な配線です。

上記の三複線でも同様ですが、すべての列車が反対側の線路に転線する場合は、最も交差回数が多くなります。

また、勾配のために必要な距離があるため、黄色の線路を除いて、同じ線路で列車交換もできます。

 

素数を調べるプログラムと剰余行列のパターン

目次

 

筆者について

  • 学生ではないため、論文の書き方がわからない
  • 不登校であり、必修科目について理解していない
  • 数学の知識が浅いため、適切な用語を知らない

 

目的

  • 素数を理解するため
  • 素数を調べるプログラムを高速化するため

 

結論

  • 同一環境下で n=360360 までの最速の計算時間は、エラトステネスの篩が最も速かった
  • パターンが面白い

 

剰余行列

素数は約数に関係するため、まずは約数のパターンを理解することにしました。

 

エクセル(Googleスプレッドシート)で、

「行数を列数で割った余りの行列」を作成し、

結果が0になる(=行数を列数で割り切れる)セルに色を塗った、

「剰余行列」を作成しました。

(この名前が適しているか分かりませんが)

docs.google.com

面白いグラフが出てくるので、この中からパターンを研究します。

ちなみに、マイナスの範囲も含めた行列も、

2つ目のシートとして追加してあり、

対称的になっているのがわかります。

 

直線パターン

まず、1から順に割ることを考えていきます。

(ゼロ除算を除き)すべての数は、1とその数で割り切れます。

行列では1で割ったものが左に縦に並んでいます。

その数で割ったものが斜め45度に並んでいます。

 

次に、2で割った余りが2列目にあります。

2以降に偶数(=2の倍数)で素数はありません。

3以降も同様で、3以降に3の倍数で素数はありません。

 

このグラフでは無数の直線があるように見えます。

点線になっている線は、画像編集でなめらかな直線を描くときに似ています。

行列に現れる直線を表現する名前が欲しい。

 

格子パターン

今回は「1からnまでの自然数の最小公倍数の数列」を使います。

OEIS(=オンライン整数列大辞典)に登録されている整数列として、

類似する数列が他にもあるのですが、

連続する数字の個数が違ったりするので、

今回はA003418を使いますが、

最初の1は使わないので、この数列も少し違います。

誰か、最初の1が入っていない数列を登録して下さい。

 

今回使う数列は、

1, 2, 6, 12, 60, 60, 420, 840, 2520, 2520, 27720, 27720, 360360, 360360, 360360...

と続いていきます。

 

行列には無数の次のパターンが縦に繰り返されています。

  • 縦1x横1のパターン
  • 縦2x横2のパターン
  • 縦6x横3のパターン
  • 縦12x横4のパターン...

このパターンは、横が数列の番付、縦が数列の値となります。

例えば、1x1のパターン(=1は1で割り切れる)は下に繰り返されるため、

2や3も1で割り切れます。

 

2x2のパターンは、

1: 0, 1

2: 0, 0

のようになっており、

3: 0, 1

4: 0, 0

といったようにパターンが繰り返されます。

 

分かりやすいのが、6x3のパターンです。

1: 0, 1, 1

2: 0, 0, 2

3: 0, 1, 0

4: 0, 0, 1

5: 0, 1, 2

6: 0, 0, 0

このパターンから、2からnまでのいずれかの数で割り切れる数は、

2, 3, 4, 6です。

 

はじめの1-6であれば、2と3は素数ですが、

以降の7-12にあたる、8と9は素数ではありません。

7以降は、1-6のうち上記の条件で割り切れない1と5が素数である"可能性が"あります。

実際、7-12にあたる1と6である、7と11は素数です。

「7以降は6個毎に1番目と5番目が素数である可能性がある」

と考えることで非常に絞り込むことができます。

 

注意点としては、1は素数に含まれていませんが、パターンには「素数である可能性がある」として含まれていることです。

 

そして、各パターンの始めと終わりには、直線のパターンがあります。

例えば12x4の始めの、4x4の左上から右下に向かって、4個セルがあります。

反対に12x4の終わりの、4x4の左下から右上に向かって、4個セルがあります。

これも繰り返すため、13以降も続いていきます。

 

グラフの原点から斜めの直線は、すべてのパターンの原点ということです。

 

 

余談ですが、調べてみると、6個毎のパターンは、Wikipediaの「素数性テスト」(

Primality test - Wikipedia)にすでにありました。

 

注意点としては、パターンは更新されるということです。

6までは2個毎のパターンを使い、12までは6個毎のパターン、60までは12個毎のパターンを使います。

 

また、このパターンは素数かどうかを計算する手間を最小限に抑えることを目的としています。

そのため、「素数でないこと」と「素数である可能性があること」しか分かりません。

例えば、25は24の次の数で、「素数である可能性(=2から4で割り切れない)」はあるのですが、25は5の倍数ですから、素数ではありません。

これは一種の篩法と言えます。

 

また、このパターンの周期の前後は素数であることが"多い"ため、双子素数が現れる要因となります。

また、6の前後の5と7、12の前後の11と13、60の前後の59と61は素数です。

しかし、841は29で割り切れてしまいます。

6までは2個毎にパターンがあり、3、5、7と素数があります。

しかし、60までは12個毎にパターンがありますが、

25や35などは素数ではありません。

 

さらに

このパターンの中も、対称的になっています。

例えば12x4のパターンは、前半の6x4と、後半の6x4が対称的です。

厳密には6番目と12番目を除く5x4と5x4です。

 

6x3のパターンには対称的な2x3が2つあります。

6の約数に1と2があるので、(1で割った)6と、2で割った3は特徴的です。

また6x3以上でしか、対称的なパターンはありません。

 

12x4には3で割ったパターンや、60x5には4で割ったパターンがありそうですが、

頭がおかしくなりそうなので割愛します。

 

マイナスも含め、

パターンが対称的だったり、連続したり、入れ子になっているなど、

とても面白いことになっています。

 

プログラム

今回のプログラムでは、素数を調べながら前述の格子パターンも同時に調べます。

 

パターンを更新するタイミングは、例えば7といった任意の数を計算する際に、

その前の数である6が2からその数まで割り切れるかどうか確認し、

2から3で割り切れることがわかると、

それまでの2個毎のパターンの幅が2であるため、

2から3に上がっていることを確認したら、

2から6個毎のパターンに更新することになります。

 

コードはGitHubにあります。

Node.jsモジュールとして使えるようにしています。

素数を調べるプログラム · GitHub

 

同一環境下での、最速の計算時間は以下の通りです。

n=360360までしかテストしていませんので、

もっとテストすれば早い順が変わるかもしれません。

 

checkPrime1

2と3からの偶数を総当たりで調べます。

計算時間は 2101 ms と桁違いに遅いです。

 

checkPrime2

このパターンを応用したコードです。

コードが複雑で、checkPrime1より速く、

他の関数より遅いです。

計算時間は 83 ms です。

 

checkPrime3

checkPrime2を対照パターンで改良したものです。

checkPrime2より遅くなってしまいました。

計算時間は 87 ms です。

 

checkPrime4

2と3、5から6個毎に1番目と3番目の数を調べます。

前述のWikipediaにあるコードと同義です。

計算時間は 66 ms です。

checkPrime2、3よりも速く、コードが単純です。

 

checkPrime5

エラトステネスの篩です。

計算時間は 46 ms で、最も速い結果でした。

 

【Spigot】Bukkitプラグインの作り方講座 – プレイヤーの移動と回転の検出

今回は、プレイヤーの移動と回転を検出する方法を紹介します。

※バージョン1.16時点の情報です。異なるバージョンでは対応できない場合があります。

 

PlayerMoveEvent

PlayerMoveEventを使うと、プレイヤーの移動や回転を検出できます。

このイベントは、プレイヤーの移動、落下、回転、エリトラの飛行、エンティティに押されるとき、ノックバックにより移動するときに実行されます。

 

プレイヤーの座標は足元です。

スニークしてもプレイヤーの座標は変わりません。

また、プレイヤーが死亡してもリスポーンするまで座標は変わりません。

 

できること

  • プレイヤーの取得: e.getPlayer()
  • 移動前のLocation(座標と向き)の取得: e.getFrom()
  • 移動前のLocation(座標と向き)の設定: e.setFrom(Location)
  • 移動先のLocation(位置と向き)の取得: e.getTo()
  • 移動先のLocation(座標と向き)の設定: e.setTo(Location)
  • イベントが取り消されたか: e.getCancelled()
  • イベントを取り消すか設定: e.setCancelled(boolean)

 

プレイヤーの移動と回転をキャンセルする

@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
    if (e.getPlayer().isSneaking())
        e.setCancelled(true);
}

プレイヤーがスニークしているときは動けなくなります。

 

移動だけできないようにする(回転はできるようにする)

@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
    if (e.getPlayer().isSneaking()) {
        Location from = e.getFrom();
        Location to = Objects.requireNonNull(e.getTo());
        from.setYaw(to.getYaw());
        from.setPitch(to.getPitch());
        e.setTo(from);
    }
}

プレイヤーがスニークしているときは向きは変えられますが、移動ができなくなります。

 

PlayerMoveEventが実行されない場合

PlayerMoveEventは次の場合では実行されません。

  • ログインするとき→PlayerJoinEvent
  • ログアウトするとき→PlayerQuitEvent
  • テレポートするとき→PlayerTeleportEvent
  • リスポーンするとき→PlayerRespawnEvent
  • ピストン、粘着ピストンにより押されるとき(ブロックを間に挟む場合も含む)→BlockPistonExtendEventで検出できるが、押し出されるエンティティはかんたんに検出できない
  • シュルカーボックスにより上方向に押されるとき(横方向では実行される)
  • 乗り物の乗り降りによる移動→VehicleEnterEvent、VehicleExitEvent、EntityDeathEvent(VehicleExitEventでは乗っているトロッコ、ボートが壊れた場合も実行されますが、乗っている動物[ブタ、ウマ、ロバ、ラバ、ラマ、商人のラマ、ストライダー=LivingEntity?]が死亡した場合は実行されないため、EntityDeathEventを使う必要があります)

 

次の場合は1.16では動作しませんが、1.8などでは動作する場合があります。

  • ロッコに乗っているとき
  • ボートに乗っているときにプレイヤーが回転するとき
  • ニンジン付きの棒を手に持っていないときにブタに乗っているとき
  • 鞍(サドル)をつけていないウマ、ロバ、ラバに乗っているときにプレイヤーが回転するとき
  • ラマ、商人のラマに乗っているとき
  • 歪んだキノコ付きの棒を手に持っていない状態でストライダーに乗っているとき

 

乗り物が移動してる場合はVehicleMoveEventを使うと検出できますが、

乗っている状態でプレイヤーが回転するのを検出する場合など、

Eventシステムでかんたんに検出できないものは、全プレイヤーを総当りする必要があります。

その場合は、プレイヤーが少ない場合はスケジュールシステムを使用してTick毎に、乗り物が少ない場合はVehicleUpdateEventを使用すると良いでしょう。

また、VehicleMoveEventは、プレイヤーがトロッコに乗ったブタに乗っているときに移動しても実行されません。

 

記事一覧に戻る

無線ネットワークではVALORANTがプレイできない(Riot Vanguardができない)

無線ネットワークドライバーでしかインターネットが使えない」という環境では、VALORANTがプレイできません

 

 

VALORANTをプレイするのに必要な、

アンチチート「Riot Vanguard」が無線ネットワークドライバーを使えなくしやがる。

 

2時間かけてVALORANTを入れ、

ゲームを起動すると再起動が迫られるので再起動。すると...

 

インターネット接続がなくなっている!!!!!

Riot Vanguardからなにか警告を言われているのでスマホで翻訳すると、

どうやら、あるドライバー(無線ドライバー)をブロックしたとのこと。

Windows10のネットワークアダプターの設定を開くと...

 

なんで HAMACHI になってんだよ💢💢💢

 

 

無線のドライバーが消えている。

USBドングルなのだが、挿し直しても無反応。

どうやらRiot Vanguardが無効にしている。

 

モバイルルーターという環境だから、

無線ネットワークドライバーが使えないと、

インターネットが使えない。

 

数あるドライバーの中からこれを無効にしているということは、

無線ネットワークドライバーであることを検知して意図的に無効にしているに違いない。

つまりこの環境ではプレイできないということを意味する。

 

Vanguardについて – VALORANT Support

 プレイヤーの試合の純粋性を確保するため、VALORANTのプレイ中はRiot Vanguardの起動が必須となります。しかし、プレイヤーのPC環境によってはVanguardのクライアントやドライバが誤動作を起こし、プレイアビリティに影響を及ぼす可能性があります。

と書いてある。

 

ネット復旧方法

まず、Riot Vanguardを無効にする必要がある。

 

Riot Vanguardのアンインストールと無効化 – VALORANT Support

 

タスクバーRiot Vanguardのアイコン を右クリックして、

Exit Vanguard をクリックするとRiot Vanguardが無効になる。

 

ちなみに、Windowsのタスクマネージャーから、

スタートアップにあるRiot Vanguardなんちゃらを無効にしても、

それはタスクバーの通知機能だけであり、

Riot Vanguardを無効にしたことにはならないので注意。

 

ただ、この環境でRiot Vanguardを持っていても意味がないので、

Windows10の「アプリと機能」(または「プログラムと機能」、「プログラムのアンインストール」、「プログラムのアンインストールまたは変更」)から、

Riot Vanguardを選択してアンインストールする。

 

無効になったら、PCを再起動するか、USBドングルを挿し直すことで直る。

 

 

PCに詳しくない人は原因究明のためにネットで調べるだろうが、

この問題が起きるとPCでネットが使えなくなる!!

これは怖すぎる...

 

2時間と7GBを返せ!!!

【Spigot】Bukkitプラグインの作り方講座 - プラグインの作成(IntelliJ IDEA)

 

今回は実際に簡単なプラグインを作成します。

この作業はプラグインごとに行いますので、覚えてください。

 

プロジェクトの作成

まずプロジェクトを作成します。

この作業は、作成するBukkitプラグインごとに行います。

 

プロジェクトを開いていない画面で「新規プロジェクトの作成」をクリックします。

左のメニューから「Minecraft」を選択します。

 

この記事ではBukkit(Spigot)プラグインを作成しますので、

Spigot Plugin」にチェックを入れます。

(「Bukkit Plugin」は旧バージョンのものです)

次へを押します。

 

ビルド設定

グループ IDは一般的に、自分のサイトなどのアドレスを逆にしたもの(「densyakun.github.io」であればio.github.densyakun)が多いです。

誰が作ったものかを書くという感じです。

また、グループ IDは全て小文字にして下さい。

 

プログラミングをしているとパッケージが増えていきますので他のとかぶらないように名前を付ける必要があります。

私はプラグイン開発以外にも色々やっているので、io.github.densyakun.bukkitといった感じにしています。

 

アーティファクト IDプラグインを書きます。

頭文字が大文字になるようにしてください。

 

この記事ではGradleを使います。

右の「Maven」をクリックして、「Gradle」を選択してください。

また、「前へ」を押して前の画面に戻ると設定が戻ってしまうので注意してください。

 

次へを押します。

 

プラグインの設定

右のMinecraft Versionからマインクラフトのバージョンを選択してください。

特に古いバージョンでなければ、基本的に新しいバージョンで問題ありません。

Bukkitプラグインは対応していれば、異なるバージョンでも使用できます。

 

ここで設定する内容はplugin.ymlと同じものになります。

Plugin.ymlの設定一覧 - Minecraft Modding Wiki

 

次へを押します。

 

最後にお好みのプロジェクト名を書いて完了を押してください。

するとプロジェクトが作成されます。

 

Gradleにより作成されたソースフォルダは、

クラスなどを入れる方が、src > main > java で、

config.ymlなどをいれる方が、src > main > resources です。

 

パッケージ名は、グループ IDとアーティファクト IDを小文字にしたものを合わせたものになります。

プラグインのメインクラスはJavaPluginを継承したプラグイン名のクラスが、

このパッケージの中に作成されているので、

それを開きます

 

すでに色々書かれています。

onEnable関数はプラグインが有効になるときに実行されます。

onDisable関数はプラグインが無効になるときに実行されます。

 

Jarファイルを作成する

プロジェクトフォルダにあるbuild.gradleを開きます。

ファイルに以下のテキストを追加します。

jar {
}

IntelliJ IDEAでは、編集は自動的に保存されます。

編集したら右下に「変更をインポート」と表示されますので押します。

 

右上のトンカチのボタンをクリックしてビルドします。

次に、IDEの内蔵エディタで先程追加した jar{} の、

左にある行数の横にある三角をクリックして実行すると、Jarファイルが作成されます。

作成されたJarファイルは、プロジェクトフォルダ > build > libs にあります。

これが完成したプラグインとなります。

 

Gradleを日本語のコードに対応する

日本語を含む文字列などをコードに追加すると、

Gradleでビルドする際にエラーが発生してしまいます。

これは文字コードの関係で起きています。

 

build.gradle内に以下のコードを追加します。

compileJava.options.encoding = 'UTF-8'

(targetCompatibility = '1.8'の下辺り、8行目辺りに追加すると良い) 

 

編集したら右下に「変更をインポート」と表示されるので押してください。

これでビルドするとできます。

 

プラグインを導入する

完成したプラグインのJarファイルを、

Bukkitサーバーのpluginsフォルダに入れて、

サーバーを起動します。

/pl コマンドを実行して、作成したプラグインが緑色で表示されていれば完了です。

赤色で表示されている場合は、前提プラグインが入っていないなどプラグインが無効になっています。

 

/version (プラグイン名) コマンドでプラグインのバージョンなどの情報を見ることができます。

 

これでプラグインを作ることが出来ました。

実際に作ったプラグインが動いているのを見ると達成感を感じますね。 

次は、作成したプラグインをいじって、機能を追加していきましょう!

 

記事一覧に戻る

【Spigot】Bukkitプラグインの作り方講座 - 開発環境の構築(Intellij IDEA)

今回はIntelliJ IDEAを使った開発環境の

 

IntelliJ IDEA のダウンロード、インストール

IntelliJ IDEAをダウンロード、インストールします。

 

2つのエディションがありますが、無料のコミュニティ版で構いませんので、

こちらからダウンロード、インストールしてください。

https://www.jetbrains.com/ja-jp/idea/download/

 

Minecraft Development のインストール

BukkitプラグインやForgeModなどを簡単に作成できる

Minecraft Development」というJetbrainsプラグインがありますので、

これをインストールします。

JetbrainsプラグインとはIntelliJ IDEAなどのJetbrains製品で使えるプラグインです。

 

IntelliJ IDEAを起動し設定を開き、左のメニューから「プラグイン」を押して、

マーケットプレイス入力欄に「Minecraft Development」と入力して、

出てきた「Minecraft Development」の右にある「Install」ボタンをクリックします。

 

インストールが終わったらボタンが「Restart IDE」となりますのでクリックしてアプリを再起動します。

 

ここまでの作業は初回のみで、今後行いません。

 

Spigotサーバーを立てる

次は、Spigotサーバーを立てます。

Spigotとは、更新及び公開が停止しているBukkitの派生版で、Bukkitと同様に使用でき、さらに多くの機能が追加されているものです。

 

プラグイン開発ではBukkitとSpigotに一部違いがあるため注意が必要です。

 

Spigotサーバーをダウンロード

次に、プラグインを実行するためのサーバーであるSpigotをダウンロードします。

 

Spigotダウンロードサイト(非公式): https://getbukkit.org/download/spigot

 

非公式サイトですが、公式サイトだとビルドツールとかgitとかなんだかんだでめんどくさいので、こちらの方が簡単にサーバーが立てられます。

ダウンロードしたいバージョンの右にあるDownloadボタンを押します。(横のCreate a Serverは押さないで下さい)

すると次のページに行き、少し下にスクロールすると広告に囲まれたリンクがあるのでそれを開いてダウンロードします。


ダウンロードしたら、好きなところにサーバーのフォルダを作り、その中にダウンロードしたjarファイルを入れます。(この時、間違えて開かないで下さい)

 

.jarファイルをそのまま開いてしまうと、

バックグラウンドで見えないサーバーを開いてしまいます。

なお、間違えて開いてしまった場合は、

タスクマネージャーからjavawを停止してください。

 

サーバーをたてる準備

サーバーを実行するためには、JDKのインストール、環境変数の設定が必要です。

こちらを参考にして下さい。

https://eng-entrance.com/java-install-jdk-windows

 

batファイルを作成する

次に、サーバーのフォルダの中に.batファイルを作成して、サーバーを可視化します。(Windowsの場合)

ファイル名に拡張子が表示されない場合は、エクスプローラーの設定を変更して下さい。

フォルダを右クリックして、 新規作成>テキストドキュメント を選択して、ファイル名を「start.bat」にします。

この時警告が出るはずですが、問題ないので続行して下さい。

ファイル名のstartはお好みの文字にしても構いません。”.txt”は消して下さい。

 

作成したbatファイルを右クリックして「編集」を押して下さい。(お好みのテキストエディタがあればそれを使って開いて下さい)

するとメモ帳が出てくるので以下のを書いてください。

コピペで入力しても構いませんので、入力が完了したら保存して下さい。

@ECHO OFF
java -Xms128M -Xmx1024M -jar spigot-xxx.jar
PAUSE

(spigot-xxx.jarにはダウンロードしたjarファイルのファイル名を入力)

 

javaはjarファイルを実行します。つまりサーバーを実行する処理が書かれています。

 

-Xmsは最小メモリ使用量、-Xmxは最大メモリ使用量です。1024Mは1GBと同じです。

-Xms と -Xmx は省略しても構いませんし、-Xmxだけ書いてもいいです。

省略した場合はデフォルトで最大1GBを使用します。大したワールドデータや50個を超えるほどの大量のプラグインを使用しなければ1GBで十分です。

・注意: MBやGBなどの単位は-Xms-Xmxの単位を揃えて下さい。

 

PAUSEは処理を停止して、キーボードを押したときに処理を再開するものです。

PAUSE の上にjavaがあるのでサーバーが実行されます。

サーバーが停止すると PAUSE により処理を停止してキーボードを押すとコンソールが消えます。

PAUSE が無いとサーバーが停止したときにすぐにコンソールが消えます。

 

@ECHO OFFは特に気にしなくていいです。

(詳しく説明すると、@ECHO はbatが実行するコマンド【今回の場合はjavaPAUSEなど】をコンソールに表示するかどうかを設定するものです)

 

 

サーバーを起動する

次に、start.batを実行してサーバーを起動します。

すると黒い画面に白い文字が表示されたコンソール画面が出てきます。

f:id:Densyakun:20180211183922p:plain

すると、「Stopping server」と表示されサーバーが停止しました。

初回起動時には利用規約に同意する必要があります

 

サーバーを開くとサーバーフォルダにサーバーのファイルが生成されているので、

利用規約に同意するにはサーバーフォルダに生成されたeula.txtを編集し

eula=falseeula=trueに書き換えて下さい。

そしてもう一度start.batを起動するとサーバーが起動できます。

 

コンソールではコマンドを入力することが出来ます。

「stop」と入力するとサーバーを停止できます。

その他コマンドについてはhttps://www.spigotmc.org/wiki/spigot-commands/をご覧下さい。

・ここではポート開放のやり方などは説明しません。

 

 

 

今回はBukkitプラグイン開発環境の構築を行いました。

続いて実際にプラグインを作っていきます。

 

記事一覧に戻る

GISを活用したBve5路線データの作成方法

こんにちは、電車君です。

 

GISを活用してBve5路線データを作成する事で、GoogleMapの画像を貼り付けたり、手作業でやるよりも精密に作ることができます

 

一番良いのは、平面曲線や縦断曲線などの線形の情報があることですが、

本などの資料を購入するよりもコストがかからずにどんな路線でも出来ますので、その方法や手順について解説します。

 

手順が多いのですが、大まかに説明すると、Blenderに地理情報を入れて、Blenderで線形などのガイドとなるストラクチャを作り、それをBve5で読み込み、ガイドに合わせて路線を作成します。

 

注意

  • この記事ではBlender 2.79における操作について解説しています。2.8以降では操作が異なる場合があります。

 

 

GISOSMについて

GISとは、地理情報システムのことです。

 

今回はOpenStreetMapOSM)から地理情報をダウンロードして使用します。

OpenStreetMapとは、誰でも編集が可能なみんなで作る地図サービスです。

OpenStreetMapからダウンロードするデータは.osmファイルになります。

後述のBlenderGISを用いてダウンロードしますので、OpenStreetMapからダウンロードしなくて大丈夫です(.osmや、その他の地理情報データをインポートする事もできます)。

 

Blender

今回はBlenderと言う無料の3Dモデリングソフトを使用します。

こちらからBlenderをダウンロード、インストールして下さい。

https://www.blender.org/

 

Blenderの使い方については、ここでは解説しませんので、こちらを参考にして下さい。

https://blender-cg.net/

 

BlenderGIS

次は、Blenderで地理情報データを使用する為に、BlenderGISと言うBlenderアドオンをインストールします。

 

BlenderGISのインストール方法についてはこちらにあります。

https://github.com/domlysz/BlenderGIS/wiki/Install-and-usage

ですが少し難しいので、ここで解説をします。

 

まずBlenderGISを動作させるには、GDALと言うものが必要になります。

GDALをBlenderGISのほうで解説されている方法ではなく、Conda(Anacondaを用いた方法でインストールします(BlenderGISで解説されている方法ではインストールできない場合があります)。

 

BlenderPythonと言うプログラミング言語で出来ており、

Pythonではライブラリを入れる事で機能を増やす事ができるようになっています。

BlenderGISが必要としているGDALはPythonのライブラリです。

AnacondaはPythonのライブラリを簡単に管理する事ができます。

 

Anacondaはこちら

https://www.anaconda.com/

 

Anacondaをインストールしたら、GDALをインストールします。

コマンドを実行してインストールするのですが、

Windowsでは、スタートメニューボタンを右クリックして「コマンドプロンプト」を選択すると、コマンドプロンプトを開けます。

コマンドプロンプトでこちらの通りにコマンドを実行して下さい。

https://gdal.org/download.html#download

 

次にBlenderGISをインストールします。

先程のインストール方法に従って下さい。

 

BlenderGISの初期設定

BlenderGISを導入すると最初に初期設定が必要になります。

 

左側のメニューから GIS を開いて、

f:id:Densyakun:20200406010218p:plain

 

Preferences を押してアドオンの設定を開いてください。

f:id:Densyakun:20200406010353p:plain

 

Basemaps 内の Cache folder の右のボタンを押して、

キャッシュを保存するフォルダを指定します。

自分の好きなフォルダを指定できます。

空のフォルダを作成して、それを指定することをおすすめします。

f:id:Densyakun:20200406014024p:plain

以上の設定は初回起動時にのみ行います。

今後は不要です。

 

プロジェクトを作る時に

私の場合ですが、プロジェクトを作る時には、

デフォルトのプロジェクトにある Lamp 以外の、

Camera と Cube のオブジェクトを削除して、

Lamp を設定でポイントからヘミにします。

 

このオブジェクトはレイヤー1に置いたままで、

後で複数のレイヤーを使います

 

Basemapで作成したい場所に移動する

Basemap とはBlenderGISの機能で、

Blender上で地図を表示しながら編集する事ができます。

 

GISメニューから、 Basemap を押してください。

f:id:Densyakun:20200406081157p:plain

 

ソースGoogle 、 レイヤーMap 、 Tile matrix setWeb Mercator にして、

OK を押してください。

以前はOSMの地図が表示できたのですが、

20年2月現在ではGoogleMapしか表示できませんでした。

f:id:Densyakun:20200406083756p:plain

 

すると地図が表示されます。

f:id:Densyakun:20200406094434p:plain

3Dビューの下の方に Map view と表示されます。

この状態では地図の操作のみができます。

 

マウスドラッグ移動スクロールズームができます。

Google Mapではズームレベルが 0~22 まですべてサポートされていますが、

OSMなど、一部ズームレベルでは表示できない場合があります。

 

Gキーで検索もできますが、ぜんぜん違う場所に行ってしまう場合があり、おすすめできません。

 

ここ重要!

BlenderGISにはBlenderのプロジェクトに原点の経緯度が記録されます

Basemapを操作しようとすると、原点の経緯度が移動し、オブジェクトも移動します。

ただし、表示しているレイヤーの物体しか移動しないので、地図を移動する際は全てのレイヤーを表示して下さい

 

 

ですがBasemapの操作が反映されるのには少しクセがあるので、

小規模の移動などは、できる限りBlenderのカメラを移動するようにして下さい。

 

移動とズームで自分が作成したい場所を表示してください。

画像のように作成範囲の全体を収めるようにしてください。

f:id:Densyakun:20200406142007p:plain

ただし、一度に広範囲のデータを入れることはできません。

また、広いと環境によってはPCが重たくなってしまうため、

作成したい路線の各駅間または、3平方km程度に分割して入れることをお勧めします。

また、後でBve5上でデータを表示します。

 

Bve5では進行方向にあるものが表示されるため、

A駅からB駅に向かう区間の場合、B駅にストラクチャを設置するイメージとなります。

そのため、あまり距離があると描画距離を遠くしなければならない事にも注意して下さい。

 

範囲を表示したら、

Escキーで地図の操作を中止して、Blenderの操作に戻って下さい。

再度地図で移動したい場合は、Basemapを押してください。

 

地図に合わせてOSMデータを入れる

次に線路や道路、構造物などのOSMデータを入れます。

 

レイヤーを分けておく

ですが、OSMデータを入れると大量のオブジェクトが追加されます。

このオブジェクトを扱いやすくするため、ここでは

Lampなどの基本的なものをレイヤー1にして、

OSMデータをレイヤー2に入れるようにします。

 

Lampはすでにレイヤー1にあると思いますので、

数字の (3Dビュー上にカーソルを置いて)2キー(テンキーではありません) を押して、

レイヤー2を選択します。

この状態で追加されたオブジェクトは選択されているレイヤー2に追加されます。

ちなみにレイヤーは複数選択できます。複数選択している状態で追加されるオブジェクトは複数のレイヤーに含まれます。

 

なお、レイヤーでオブジェクトを分けない場合、Lampなどのオブジェクトを選択から省きたい、などといった場合に操作がめんどくさくなります。

 

GetOSMで地図に合わせてOSMデータを入れる

次に、GISメニューから GetOSM を押してください。

f:id:Densyakun:20200406142951p:plain

 

以下の画像のように Ways を選択します。

その下の building などは何も選択しないでください。

(複数選択ができます。選択してしまった場合は最初からやるか、 Ctrl+クリック で解除してください)

 

次に、 Separate objects にチェックを入れます。

これにチェックを入れることで一つ一つのデータが別々のオブジェクトになります。

 

OK を押してしばらくするとOSMデータがオブジェクトとして追加されます。

f:id:Densyakun:20200406143144p:plain

 

これでデータを入れることができました。

この状態で元に戻すと、Blender GISの仕様上、

データを入れる前ではなくさらにBasemapの移動も戻るので注意してください。

 

使いたい部分に絞り込む

入れたデータのうち、線路のみを使いたいので、不要な部分を消す作業をします。

 

今の状態ではすべてのオブジェクトが選択されているはずです。

なので、(3Dビュー上にカーソルを置いて)Aキーを押して選択を解除してください。

(この操作はオブジェクトが選択されていない状態では全てのオブジェクトが選択され、オブジェクトが選択されいる状態ではオブジェクトの選択が解除されます)

 

さらに手作業で線路に絞っていきます。

線路のオブジェクトを右クリックで選択して、

Ctrl+iで選択を反転して、Delキーで削除してください(確認が出るのでOKを押してください)

 

あるいはBキーで矩形選択を使う方法もあります。

この時、Blenderは範囲内に収まるオブジェクトを選択するのではなく、

範囲内に触れるオブジェクトが選択されるため、

不要なものを選択するのではなく、

必要なものを選択してから、選択を反転することで、

不要なものを選択すると良いです。

また、矩形選択は今選択されているものに追加して選択されますので、

範囲を分割して選択するほうが良いです。

 

Blender GISを使用すると、グリッドの間隔が広がり、

カメラが一定以上ズームできなくなることがあります。

これは、Nキーでメニューを開き、「表示」(または"Display")の、

グリッド」の中にある拡大縮小の値を1にすると直ります。

 

 

こんな感じになればOKです。

f:id:Densyakun:20200408101728p:plain

 

抜けている場所がある場合

範囲が広いと、画像のように抜けている場合があります。

f:id:Densyakun:20200408102331p:plain

 

Basemapで抜けている箇所にズーム(このとき、すべてのレイヤーを選択してください)し、

レイヤー3を選択して、Get OSMをします。

するとレイヤー3に抜けている箇所を含むデータが追加されます。

先ほど同様で、抜けている箇所のみに絞り込みます。

Mキーを押してから2キーを押して、レイヤー3にあるものをレイヤー2に移動します。

2キーを押してレイヤー2を表示して、抜けている箇所が直っていたら完成です。

 

線路のガイドを作成

ここで作るガイドは平面におけるガイドになります。

つまり勾配などのガイドにはなりません。

Get SRTMでスペースシャトル立体地形データを取得できるのですが、

これがだいぶ誤差があり当てにならないので、

勾配は後で、前面展望などを見ながら、合わせていくと良いと思います。

その場合は前面展望を早送りすることで勾配が分かりやすくなります。

 

線路を結合してまとめる

この状態ではオブジェクトが分かれており、編集するのに手間がかかってしまいます。

f:id:Densyakun:20200408104239p:plain

 

同じ線路(上り線や下り線など)のオブジェクトをすべて選択し、Ctrl+Jキーで結合します。

画像のように一つのオブジェクトになればOKです。

f:id:Densyakun:20200408104922p:plain

 

重複する頂点を削除

このデータは点が結合されていません。

オブジェクトを選択した状態でTabキーで編集モードに切り替え、

Aキーですべてを選択したあと、

左の「ツール」タブから削除の中にある「重複頂点を削除」をすると、

同じ場所にある複数の頂点を一つにできます。

Tabキーでオブジェクトモードに戻すと完了です。

 

不自然な箇所を修正

f:id:Densyakun:20200408105039p:plain

画像のように不自然な箇所がある場合があります。

編集モードで修正してください。

 

 

カーブに変換

オブジェクトモードでAlt+Cキーを押して、「メッシュ/テキストからカーブ」を選択して、メッシュからカーブに変換します。

f:id:Densyakun:20200408111130p:plain

 

円の作成(一回だけ)

ガイドとして表示するために、円のカーブを作成します。

左の作成タブからを選択します。

半径を0.5(m)にします。

 

この作業はストラクチャごとに一回だけ行います。

 

ベベルの設定

先程の線路のカーブのプロパティから、

先ほど作成したベベルをベベルオブジェクトに設定します。

f:id:Densyakun:20200408120213p:plain

 

ついでにマテリアルも設定します。

f:id:Densyakun:20200408120713p:plain

 

ホームのガイドを作成

f:id:Densyakun:20200408120914p:plain

 

画像のようなホームのオブジェクトがあります。

これも重複頂点の削除を行います。

 

そしたら、Fキーで面を作成します。

たまに面が反転しており、暗くなっていることがあります。

このような場合には、Ctrl+Fで面を反転を選択してください。

反転して明るくなればOKです。

 

また、こちらも線路と同様にマテリアルを適用します。

ただし、カーブにする必要はありません。

 

ホームのオブジェクトがない場合

ホームのオブジェクトがない場合があります。

この場合は、手作業で作成する必要があります。

 

Basemapのときにレイヤーを Satelite にすることで、

航空写真を表示できます。

航空写真に合わせてオブジェクトを手作業で作成します。

 

地下区間ではこの方法は使えません。

どうしても、基準が曖昧になってしまいます。

なので、終点までホームのオブジェクトがない、という場合を除いて、

例えば、A駅からB駅を作成しようする場合は、

B駅に完成したガイドのオブジェクトを設置するわけですが、

B駅のホームのオブジェクトがない場合は、

A駅からB駅を挟んだC駅の区間を作成することに変更します。

この時、C駅はホームのオブジェクトがある必要があります。

なので、A駅からホームのオブジェクトがあるC駅までの区間、ということになります。

ですが、距離が長くなってしまうといけないので、

それぞれの区間のズレを、経緯度などで位置を合わせるほうが良いです。

 

エクスポート用のピボットの設定とオフセット移動

次に、「ストラクチャを置く駅」の位置を決めます。

最終的に、駅にあるオブジェクト(無ければ作成してください)を原点するのですが、

その位置を決めます。

 

「ストラクチャを置く駅」のオブジェクトの原点が、

オブジェクトの内容とズレていると思います。

これを直す作業を行います。

 

「ストラクチャを置く駅」のオブジェクトを選択して、

編集モードですべてを選択している状態で、

Shift+Sでスナップ設定を開き、カーソル → 選択物を選択します。

次に、オブジェクトモードで選択物 → 3Dカーソルを選択します。

次に、編集モードで選択物 → 3Dカーソル(オフセット)を選択します。

これでオブジェクトの原点が内容に合わせることができました。

 

メルカトル図法の歪みを計算し記入しておく

この方法ではメルカトル図法の歪みが含まれており、

このままストラクチャとして入れてしまうと、

東京であれば1.2倍ほどの大きさになってしまいます。

なので、歪みを修正する必要があります。

地球は球体(正確には楕円体)なので、3DCGの空間に置き換えると、

どうしても歪みがありますが、

メルカトル図法における歪みをできる限り直します。

歪みについては詳しくはこちらの記事で解説しています。

densyakun.hateblo.jp

 

今回は、自作のページで歪みを自動的に計算します。

こちらのページを開いてください。

https://densyakun.github.io/MercatorScale/

メルカトル図法における歪みは 緯度 (latitude) に対して変化します。

 

f:id:Densyakun:20200408143622p:plain

Blenderの画面の左のGISタブから、GeosceneGeoを押して

左から、 経度 (longitude) 、 緯度 (Latitude) となっているので、

右の緯度の値をコピーします。

Blenderでは内部の値は細かいのですが、

小数点第二位までしか表示されませんので、

このまま設定してしまうと移動してしまいますので、

Escキャンセルしてください。

 

先程のページのlatに値を入れてEnterを押すと、

歪みの値が表示されます。

 

次に、1キーでレイヤー1にして、

Blender空のオブジェクトEmptyで構いません)を作り、

名前に先程計算した値を書いておきます。

(私の場合はlat: 35.54, scale: 1.225と書いておきます)

値は小数点第六位、そんなに気にしないのであれば小数点第三位までで大丈夫です)

 

後でこの値を使用して歪みを修正します。

 

ここで保存(ここから先は保存してはいけない)

ここで.blendファイルを保存します。

ここから先はエクスポート用の設定をするので、

ここから先は保存しないでください。

 

エクスポート用に編集

次に、オブジェクトを一つにします。

このとき、ストラクチャとして使用するためにメッシュにする必要があります。

 

2キーレイヤー2を表示して、

「ストラクチャを設置する駅」のオブジェクトを選択し、

次に2回Aキーを押してすべてのオブジェクトを選択します。

このとき、「ストラクチャを設置する駅」のオブジェクトがアクティブ(デフォルトのテーマでは、オレンジではなく黄色になっているオブジェクトです)になるようにしてください。

 

次に、Alt+Cを押して「カーブ/メタ/サーフェス/テキストからメッシュ」を選択します。

次に、Ctrl+Jオブジェクトを統合します。

すると、すべてのオブジェクトが統合され、

「ストラクチャを設置する駅」がオブジェクトの原点になっていると思います。

 

次に、オブジェクトの原点をワールドの原点に移動します。

Shift+Sカーソル → 原点を選択し、

次に、Shift+S選択物 → 3Dカーソルを選択します。

 

次に、メルカトル図法の歪みを修正します。

画像のようにピボットポイント3Dカーソルに設定します。

f:id:Densyakun:20200408150044p:plain

次に、オブジェクトを選択している状態で、

Sキーを押して、/キー(スラッシュ)を押して、

先程の歪みの値をペーストして、Enterを押します。

(値をペーストするとそのまま入力されますが、/を押すと値が逆数になります。先程の値は1より大きいですが、今回は小さくしたいので逆数の値を使います)

 

これで、エクスポートできる状態になりました。

 

.xファイルでエクスポート

Blenderでエクスポートできるようにするためには、

アドオンを有効にする必要があります。

上のメニューバーからファイル>ユーザー設定...を選択し、

アドオンタブを開いて、左上の検索に「x 」と入力します。(xのあとに半角のスペースを付けます)

Import-Export: Direct X Format」というアドオンにチェックを入れ、有効にします。

次に、下の「ユーザー設定の保存」を押します。

この作業は一回だけです。

 

次に、メニューバーからファイル>エクスポート>DirectX (.x)を選択します。

路線データのストラクチャフォルダを選択し、

お好みのファイル名を入力し、Export DirectXを押します。

これでエクスポートができました。

 

そしたら、Blenderを保存せずに閉じます。

 

次に、Blenderでエクスポートした.xファイルをBve5で使用するために、

以下の記事を参考に修正してください。

densyakun.hateblo.jp

 

ガイドに線形を合わせる

次に、Bve5で作成したストラクチャを読み込みます。

駅間の距離などを記入しておいてください。

私の場合はWikipediaなどを参考にしますが、

50mまではずれがあると思いますので、

線形を合わせたあとにガイドに合わせて駅の位置も合わせてください。

 

何回も言ってますが、A駅からB駅に向かう区間の場合、

B駅にストラクチャを設置します。

ストラクチャのY軸を回転して向きを調節してください。

すると、ガイドが表示された状態になります。

 

次にガイドに線形を合わせます。

この時、手前から線形を合わせると、ストラクチャが動いてしまいます。

なのでストラクチャを設置している駅から、

進行方向とは逆の方向に向かって線形を合わせていきます。

線形の合わせ方は、配線などを把握してから、

曲線を挿入したり、半径を調整するなどします。

 

最後に駅の位置を合わせて、完成です。

 

寸法通りに構造物も作りたい場合

ちょっと複雑ですが、

この方法で構造物(道路の幅や建物の寸法など、相対的な位置関係を必要とするもの)を寸法通りに作りたい場合は、

構造物を作った後に歪みを修正すると、逆に元々の寸法が歪んでしまいますので、

その点に注意する必要があります。

 

私であれば、

歪みを修正する前に構造物の基準となるデータ(点群など)を作り、

それを線形などのデータとは別に分け、歪みを修正して、

それから構造物を作成して、

線形などのデータ(歪みを修正する前)と、

構造物のデータ(歪みを修正したもの)の、

同じ経緯度にあるオブジェクトを作成してそれで位置を合わせるなど、

歪む前のデータと歪む後のデータを分けて作成して、

後で合わせる、という方法が良いかと思います。

 

おわりに

以上です。お疲れさまでした。

工夫することで資料のない未成線や、架空路線なども作りやすくなります。

手順が多いので大変ですが、じゃんじゃん路線を作成していきましょう!

ご覧いただきありがとうございました。

質問などあればご自由にコメントください。