<PropertyList> <!-- <js-named include="Input/Joysticks/Local/X45-modified.xml"/> <js n="0" include="Input/Joysticks/Local/joystick_0.xml"/> --> <js n="0" include="Input/Joysticks/Saitek/ST290-Pro.xml"/> </PropertyList>
<PropertyList> <name>Saitek X45</name> <name>Saitek Saitek X45</name> <name>Saitek X45 Flight Controller USB</name> <name>Saitek X45 Flight Control Stick </name> <name>Saitek Saitek X45 Flight Control Stick </name> <name>Saitek X45 Flight Controller</name>
さて、先ほど「残念ですが」と言いましたが、「FlightGearの内部構造に触れる」チャンスでもあります。 実は、翻訳文書の「訳)特徴」の、「内部プロパティは公開されています」 で出てきた「プロパティツリー」の値を書き換えることで飛行機を操作しています。 少々面倒に感じるかもしれませんが、ここを理解しておくと後々ジョイスティックの設定のカスタマイズをするときが楽です。
Windows版では、FlightGearのインストール先を"C:\Program Files\FlightGear"に。 MacOSX版では、"/Applications"にインストールしていると仮定します。もし違う場所にインストールしている場合は読み替えてください。
本来ならjs_demoはFlightGearに同梱されている(べき)なのですが、Windows版、MacOSX版のFlightGear 1.9.0以降では省略されています。
http://flightgear.jpn.org/modules/d3downloads/index.php?page=visit&cid=6&lid=20をダウンロードして、 C:\Program Files\FlightGear\binフォルダに保存してください。
http://flightgear.jpn.org/modules/d3downloads/index.php?page=visit&cid=6&lid=23をダウンロードして、 解凍してできた js_demo を /Applications/FlightGear.app/Contents/Resourcesフォルダに保存してください。
ここでは、js_demoの起動方法だけを書きます。出力結果の読み方は後で説明します。
先ほど入手したjs_demoをコマンドプロンプトから起動してください。
c:\ cd "\Program Files\FlightGear\bin" js_demo.exe
先ほど入手したjs_demoをダブルクリックで、またはターミナルから起動してください。
cd /Applications/FlightGear.app/Contents/Resources ./js_demo
Joystick test program. ~~~~~~~~~~~~~~~~~~~~~~ Joystick 0 is "Saitek X45 Flight Controller" Joystick 1 not detected +---------------JS.0-----------------+---------------JS.1-----------------+ | Btns Ax:0 Ax:1 Ax:2 Ax:3 Ax:4 Ax:5 Ax:6 Ax:7 | ~~~ Not Detected ~~~ | +------------------------------------+------------------------------------+ | 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . | | 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . | | 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . | | 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . |
最初の何行かの出力はスクロールが早くて画面を通り過ぎてしまうでしょう。その場合はCtrl-Cでプログラムを止めてください。
まず、最初の "Joystick 0 is "Saitek X45 Flight Controller" の行はジョイスティックの名前です。 先ほどの「1.2 Joystick #0: 行の確認」で認識された名前と同じ物になっていると思います。 ただし、日本語版WindowsVistaでは "Microsoft PC ジョイスティック ド"となりますが、この名前はFlightGearで使用できません。もしこの名前を使用した場合、fgfs.exeがnot-well-formedエラーで異常終了します。
次に、出力の読み方の解説をします。 左側の「JS:0」に注目してください。「JS:1」は繋いでいないのでドットが並んでいるだけですが、接続すれば当然ここにも数値が並びます。
一番左の列の値がボタンの状態を示していて、軸0〜軸7の順で各軸の状態を示しています。
すると、以下のような表ができると思います。 さて、スティックのどの軸/ボタンに何を割り当てるかは人それぞれなので、私がPS2ジョイパッド+変換器 のジョイスティック定義ファイルを書いた時の一例を挙げます。 もし、適切な役割が思い浮かばない場合、取り合えず何も設定せず、必要になった時にその都度追加していけばいいでしょう。
軸番号 | 実際の軸 | 方向 | 備考 |
0 | 左スティック左右 | 右に操作して正 | エルロン |
1 | 左スティック上下 | 上に操作して正 | エレベータ |
2 | 右スティック左右 | 右に操作して正 | ラダー |
3 | 右スティック上下 | 上に操作して正 | エレベータトリム |
4 | N/A | N/A | この軸は無い |
5 | N/A | N/A | この軸は無い |
6 | 左右ボタン | 右に操作して正 | POV左右 |
7 | 上下ボタン | 上に操作して正 | POV上下 |
ボタン番号 | 数値 | 実際のボタン | 役割 |
N/A | 0000 | ||
0 | 0001 | △ | ラダートリム(右) |
1 | 0002 | ○ | ミクスチャ リッチ |
2 | 0004 | × | ミクスチャ リーン |
3 | 0008 | □ | ラダートリム(左) |
4 | 0010 | L2 | スロットル閉 |
5 | 0020 | R2 | スロットル開 |
6 | 0040 | L1ボタン | プロペラ回転下げ(高ピッチ) |
7 | 0080 | R1ボタン | プロペラ回転上げ(低ピッチ) |
8 | 0100 | スタート | セルモータを回す |
9 | 0200 | セレクト | 見る方向をリセット |
10 | 0400 | L3 | 車輪ブレーキ |
11 | 0800 | R3 | 使用せず |
<PropertyList> <!-- <js-named include="Input/Joysticks/Local/X45-modified.xml"/> <js n="0" include="Input/Joysticks/Local/joystick_0.xml"/> --> <js n="0" include="Input/Joysticks/manufacture/urjoystick.xml" /> <!--←この行を追加 --> </PropertyList>
これは、ジョイスティックの自動認識の結果を上書きして、使用するジョイスティック定義ファイルを明示的に指定します。 実際のところ、2バイト文字を含まないファイル名なら何でもいいですので、わかり易い名前にしておいてください。 (他のジョイスティック定義ファイル同様、$FGROOT\Input\Joysticks\メーカー名\機種名.xml、としておく事をお勧めします。)
多くの場合、「既存のジョイスティック定義ファイルを元に・・・」と解説されますが、ここでは「イチからファイルを書く」場合を解説します。 もちろん、既存のジョイスティック定義ファイルの中に、あなたが使いたいジョイスティックとボタン/軸の数が同じで、割り当てられた機能が似通っていればそれを流用してもかまいません。
<axis n=""> <desc></desc> <dead-band>0<dead-band> <binding> <command></command> </binding> </axis>
<axis n="1"> <low> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/controls/flight/elevator-trim</property> <step type="double">0.001</step> </binding> </low> <high> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/controls/flight/elevator-trim</property> <step type="double">-0.001</step> </binding> </high> </axis>
<binding> <command>property-scale</command> <property>/controls/flight/aileron</property> <offset type="double">0.0</offset> <factor type="double">1.0</factor> </binding>
<button n=""> <desc></desc> <repeatable>false</repeatable> <binding> <command></command> </binding> </button>
<repeatable>true</repeatable>
<button n="2"> <desc>Rudder Trim Right</desc> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/controls/flight/rudder-trim</property> <step>0.001</step> </binding> </button>
<desc>Toggle speedbrake</desc> <binding> <command>property-toggle</command> <property>/controls/flight/speedbrake</property> </binding>
<binding> <command>property-assign</command> <property>/controls/gear/brake-left</property> <value type="double">1.0</value> <!-- ブレーキは1.0に設定されます --> </binding>
<binding> <command>property-swap</command> <property>/sim/panel/path</property> <property>/sim/panel_2/path</property> </binding>
なお、第二エンジンの場合、操作すべきプロパティが/controls/engines/engine[1]/・・・・・・といったようになります。 エンジンの数が変わってもジョイスティックの設定をわざわざ変えなくてもいいように、エンジン関係はnasal経由で操作する事が多いです。
<button n="8"> <desc>PTT (for fgcom)</desc> <binding> <command>nasal</command> <script>controls.ptt(1)</script> </binding> <mod-up> <binding> <command>nasal</command> <script>controls.ptt(0)</script> </binding> </mod-up> </button>
var ptt = func(b) setprop("/instrumentation/comm/ptt", b);
<axis n="2"> <desc>Throttle</desc> <binding> <command>nasal</command> <script>controls.throttleAxis()</script> </binding> </axis>
# Joystick axis handlers (use cmdarg). Shouldn't be called from # other contexts. A non-null argument reverses the axis direction. var axisHandler = func(pre, post) { func(invert = 0) { var val = cmdarg().getNode("setting").getValue(); if(invert) val = -val; foreach(var e; engines) if(e.selected.getValue()) setprop(pre ~ e.index ~ post, (1 - val) / 2); } } var throttleAxis = axisHandler("/controls/engines/engine[", "]/throttle"); var mixtureAxis = axisHandler("/controls/engines/engine[", "]/mixture"); var propellerAxis = axisHandler("/controls/engines/engine[", "]/propeller-pitch"); var carbHeatAxis = axisHandler("/controls/anti-ice/engine[", "]/carb-heat");
多くの場合、「欲しい機能を与えてくれるnasal関数は何か」と、「その関数への引数」さえ知っていれば、実際の関数内部でどう動いているかはブラックボックスでも大丈夫でしょう。 なので、以下でジョイスティックの設定に使える関数と引数、それから簡単な説明をするつもりです。
"/controls/engines/engine[0]/starter" "/controls/engines/engine[1]/starter" "/controls/engines/engine[2]/starter"
props.setAll("/controls/engines/engine", "starter", 0)
<button n="4"> <desc>Left brake</desc> <binding> <command>property-assign</command> <property>/controls/gear/brake-left</property> <value type="double">1.0</value> </binding> <mod-up> <binding> <command>property-assign</command> <property>/controls/gear/brake-left</property> <value type="double">0.0</value> </binding> </mod-up> </button>
<axis n="4"> <desc>Mixture</desc> <binding> <command>property-scale</command> <property>/controls/engines/engine[0]/mixture</property> <offset type="double">-1.0</offset> <factor type="double">-0.5</factor> </binding> <binding> <command>property-scale</command> <property>/controls/engines/engine[1]/mixture</property> <offset type="double">-1.0</offset> <factor type="double">-0.5</factor> </binding> </axis>
さらに細かくカスタマイズしたい、といった場合は訳)ジョイスティック・キーボードの設定方法を参照願います。
新規作成 2009/03/29 sambar ちょっと整形&js_demoの出力のところを一部修正 2009/03/29 21:09 sambar nasalの部分を追加開始 2009/03/29 23:41 sambar js_demo導入のMac版を作成 2009/03/30 00:53 MiYABi nasalの部分の追加終了 2009/03/31 sambar