2016年6月8日水曜日

SimConnectを.netで

.NetでSimConnectを使うチュートリアルを見つけたので試してみた。

元のブログはすでに消えているのでアーカイブで
https://web.archive.org/web/20070301231249/http://www.notasenator.com/blog/2006/12/ten-thousand-foot-view-of-simconnect.html

環境はWin10 x64, FSX Acc, VS Express 2015, C#という感じ。
基本的にブログに書いてあるとおりにすればいいが、一部注意する点が有る。と言っても大したことではないが、SimConnect.dllは32bit動作なので、64bit環境でAny CPUにすると動作しない。それと.NetFWを2にする必要がある。

1) 32bitアプリにする

VSでAny CPUのプルダウンメニューをクリック、構成マネージャーを表示し、"プロジェクトのコンテキスト (ビルドまたは配置する(以下略"のプラットフォームにある"Any CPU"のプルダウンメニューをクリック、新規作成を選択する。新しいプラットフォームでx86を選び、OKをクリック。すると先のAny CPUがx86に変わってるはずなので、構成マネージャーを閉じる。するとVisual Studioのメニューに表示されてるAny CPUもx86に変わる。これで32bit版アプリになった。

2) .Net FWを2.0にする

ブログ通りに作るとソリューションエクスプローラーに"SimConnect_Tutorial"とボールド体で書いてあるはずなので、それを右クリックしプロパティを選択、"対象のフレームワーク"を".NET Framework 2.0"に変更する。ダイアログが出てくるのでそのまま進める。おそらくエラーが4個出てくるはずなので、それぞれusingを丸ごとコメントアウトする。


上記の変更でPart 1を動かすことができる。あとはFSXが起動した状態でデバッグを開始すればFSXのコンソールにOpenと表示される。フォームを閉じればDisconnectedと表示される。

とりあえずPart 4までやって、ギアUp/Downイベントが発生することを確認した。Part 4までしか書かれていないので、これ以上は自分で探していくことになるが、少なくともSDKを使用できることはわかった。あとは加速度とか角速度を50Hzくらいで獲得できれば楽しいかな。


追記
機体の位置を移動するのはなんとなくできるようになった。
http://www.fsdeveloper.com/forum/threads/c-i-can-read-can-i-write.3196/#post-19769
このコードでは機体の位置を高度5000ft(≒1.5km)に移動するというもの。
別のサンプルと合わせて考えると、AddToDataDefinitionの第1引数で構造体を一意に選択する値を、第2引数に変数の意味を、第3引数に変数の単位を、第4引数に型を与えるという処理を、構造体に含まれる変数個分繰り返し、設定したい時にはSetDataOnSimObjectで渡せばいいんだと思う。
まぁ僕がやりたいのは設定ではなく取得なのだが。とりあえず次は似た引数を渡して、構造体を渡さない関数を探せば良いのかな。
英語圏からすると「何を今更」って事をやってるんだろうけど、国内のFSX SimConnectで探して出てくるのはアドオン関係がほとんどなので、自分でFSXを叩くのは楽しい。


追記2
値を獲得する
http://www.fsdeveloper.com/forum/threads/requestdataonsimobject-problem.14892/
上と同じフォーラムだね。感謝。

SimConnectの接続時にOnRecvSimobjectDataイベントを追加しておく。欲しいデータはRequestDataOnSimObjectで設定する。これはAddToDataDefinition、RegisterDataDefineStructで設定した構造体(の識別ID)を引数に与える。第4引数にSIMCONNECT_PERIOD列挙型を与えるが、SECONDを指定すると1秒毎にデータが来る。SIM_FRAMEを指定すれば毎フレームにデータが来る。構造体の説明はMSDNにある

とりあえず、Nameを"VELOCITY BODY [X-Z]"の3個にUnitsを"Knots"にしてやると速度が取れた。Shift Zで表示される速度とおおよそ一致するので、正常に取れてるんだと思う。
ただこのUnitsは適切に設定すれば様々な単位を扱える反面、不適切な単位を与えると意味不明な値が帰ってくる。例えばROTATION VELOCITYの単位はFeet per secondとなっており、おそらくは回転数の変数だが、単位は速度になっている。
Accの単位はFeet per sec^2で一見正しいが、帰ってくる値は0.08ft/sec^2(0.025m/s^2)程度となり、明らかにおかしい。
まずはFSXが認識できるUnitsの文字列一覧みたいなのを探す必要がありそう。
でも一分のデータはちゃんと取れてるから、あとは加速度とか角速度を正確に取り出す方法を調べるだけ。だいぶゴールに近づいてきた気がする。まだ見えないけど。

0 件のコメント:

コメントを投稿