SODEの使い方やオブジェクトの配置方法などについて、今のところ日本語での情報は見つけられませんでしたので、書いておこうと思います。
需要があるかわかりませんが。。
SODEを使ったオブジェクトの配置方法はDeveloper Guideに書かれています。
Developer Guideだけではなかなかとっつきにくい感じがありますが、こちらのsimFlight.comの記事が参考になりました。
なお、現在Developer GuideはVersion 1.2.1ベースの情報のため少々古くなっているのですが、DownloadsページにあるSODE Migration GuideにV1.2.XからV1.3.Xの変更点が記載されています。
なお、この記事はV1.3.2の情報をベースに書いています。
それでは解説をしていきます。
SODEで配置するオブジェクトはSimObjectコンテナに格納して指定されたフォルダに配置しておく必要があります。
SimObjectを配置するフォルダはV1.3.Xでは下記のフォルダに変更になっています。
C:\ProgramData\12bPilot\SODE\SimObjects\
SimObjectコンテナのフォルダ構成は機体データのフォルダ構成とほぼ同様で、以下のようになります。
sim.cfgファイルでSimObjectのタイトルなどを定義しますが、タイトルはほかのオブジェクトと重複しないようにする必要があるため、’MyCompanyName_ProjectName_’ 等のような命名規則を決めておくことが推奨されています。
modelフォルダには以下のようにMDLファイルの他にmodel.cfgというファイルにMDLファイルのファイル名(拡張子は除く)を記載する必要があります。
model.cfgに列挙すれば複数のMDLファイルを配置することもできるのではないかと思います。(未確認)
あえて言うまでもありませんが、textureフォルダにはテクスチャファイルを入れておきます。音が不要であればsoundフォルダはなくてもOKです。
次のような感じでmodelフォルダやtextureフォルダを複数用意することもできます。
この辺はリペイントをされる方はおなじみなのではないでしょうか。
作成したSimObjectをどのようにFSXに出現させるかはXMLファイルに記述します。
XMLファイルの置き場所は
C:\ProgramData\12bPilot\SODE\SimObjects\xml\
です。
このフォルダもV1.3.Xで変更になっています。
ファイル名は何でもOKですが、当然重複は不可です。
XMLファイルの記述の例を以下に記載します。
この記述例は上記のsimFlight.comの記事にあったものですが、V1.3.Xで変更になっている部分を1か所だけ変更してあります。
<SODE>
<!-- Data Probe serving its clients-->
<SimObject Name="6666 Ranch">
<Placement Lat="33.640732504" Lon="-100.345903337" Alt="1775" Hdg="0.0"/>
<Model SimTitle="12bPilot_SODE_Environmental_Data_Probe">
<EnvironmentalDataProbe ClientList="Wind Sock"/>
</Model>
</SimObject>
<!-- Windspeed range dependent display of different model animations -->
<!-- Wind Direction driven rotation -->
<SimObject Name="Wind Sock">
<Placement Lat="33.640889849" Lon="-100.346381762" Alt="0#AGL" Hdg="0.0"/>
<Model SimTitle="Windsock Slow">
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
<ConditionalVisibility Variable="WindSpeed" Value="0-14"/>
</Model>
<Model SimTitle="Windsock Medium Speed">
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
<ConditionalVisibility Variable="WindSpeed" Value="15-28"/>
</Model>
<Model SimTitle="Windsock Fast">
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
<ConditionalVisibility Variable="WindSpeed" Value="29-60"/>
</Model>
</SimObject>
<!-- Triggerable Animation and Visibility user induced -->
<SimObject Name="Animated Hangar 2">
<Placement Lat="33.638944660" Lon="-100.349746689" Alt="0#AGL" Hdg="108"/>
<Model SimTitle="Hangar 2">
<TriggerableVisibility Input="TextMenu" Action="Show,Hide" VisibleOnLoad="Yes"/>
<TriggerableAnimation Input="TextMenu" Action="Open,Close" StartKF="0" EndKF="100" Duration="4">
<Sound FileName="HangarDoor.wav" Loop="Yes" MinDistance="20" MaxDistance="800"/>
</TriggerableAnimation>
</Model>
</SimObject>
</SODE>
それではこのXMLファイルの内容について解説していきます。
XMLファイルの最初と最後は
<SODE>
....
</SODE>
とします。
最初の行は
<SODE SceneryPath=“Addon Scenery\XYZ“>
のように記述すると、対象のシーナリーが有効になっていない場合にSODEのオブジェクトが出現しないようにすることができますが、現在のバージョンではこの記述があると、P3Dで動作しないことがあるようです。
次にこのような記述があります。
<!-- Data Probe serving its clients-->
<SimObject Name="6666 Ranch">
<Placement Lat="33.640732504" Lon="-100.345903337" Alt="1775" Hdg="0.0"/>
<Model SimTitle="12bPilot_SODE_Environmental_Data_Probe">
<EnvironmentalDataProbe ClientList="Wind Sock"/>
</Model>
</SimObject>
ここでは周囲の環境のデータを取得するための、Environmental Data ProbeというSimObjectを配置しています。
SimObjectの記述は次のようになります。
<SimObject Name="XXX">
...
</SimObject>
NameでSimObjectの名前を付けますが、この名前は同じXMLファイル内で重複しないように付与すればOKです。
SimObjectの子要素のPlacementでは、SimObjectを配置する位置の緯度・経度・高度・方位を指定します。
<Placement Lat="33.640732504" Lon="-100.345903337" Alt="1775" Hdg="0.0"/>
ここでの高度はフィート単位になります。
また、Alt=”0#AGL”のように#AGLを付けると地面からの対地高度になります。
次にSimObjectの子要素のModelで、配置するオブジェクトを指定します。
<Model SimTitle="12bPilot_SODE_Environmental_Data_Probe">
...
</Model>
ここでのSimTitleはsim.cfgファイルのTitleを指定します。
なお、Environmental Data ProbeのSimTitleはV1.3.Xでは”12bPilot_SODE_Environmental_Data_Probe”に変更されています。
上のほうに記載した命名規則に従う形に変更されたようです。
Environmental Data ProbeはModelの子要素EnvironmentalDataProbeで、取得した環境データを利用するSimObjectを指定する必要があります。
<EnvironmentalDataProbe ClientList="Wind Sock"/>
この例では下の方で定義されている”Wind Sock”という名前のSimObjectで環境のデータを利用します。
気象条件の他、季節や時刻などのデータを必要とするSimObjectをすべてここで列挙する必要があります。
複数のSimObjectを指定する場合は次のように;で区切ります。
<EnvironmentalDataProbe ClientList="XX;YY;ZZ"/>
なお、子要素がない場合、Model要素のは次のような1行で表記します。
<Model SimTitle="XXX"/>
最後の/を忘れると動作しないので注意してください。
出現条件などを指定せずただ配置するような場合はこのように表記しますが、SODEではあまり使わないかもしれません。
次の部分ではウィンドソックのSimObjectを配置しています。
<!-- Windspeed range dependent display of different model animations -->
<!-- Wind Direction driven rotation -->
<SimObject Name="Wind Sock">
<Placement Lat="33.640889849" Lon="-100.346381762" Alt="0#AGL" Hdg="0.0"/>
<Model SimTitle="Windsock Slow">
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
<ConditionalVisibility Variable="WindSpeed" Value="0-14"/>
</Model>
<Model SimTitle="Windsock Medium Speed">
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
<ConditionalVisibility Variable="WindSpeed" Value="15-28"/>
</Model>
<Model SimTitle="Windsock Fast">
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
<ConditionalVisibility Variable="WindSpeed" Value="29-60"/>
</Model>
</SimObject>
風向きに応じて回転させているほか、風速によって出現するオブジェクトを変更させています。
Modelの子要素のVariableDrivenRotationを指定すると、SimObjectが条件に応じて回転します。
<VariableDrivenRotation Variable="WindDirection" Axis="HEADING" Animated="No"/>
VariableでWindDirectionを指定することで、風向きに応じて回転するようになります。
現在Variableで指定できるのは、WindDirectionとUserAircraftPositionのみのようです。
UserAircraftPositionを指定すると、自機に向かうように回転します。
Axisでは回転の軸をPITCH, BANK, HEADINGで指定します。
この例では方位が変わるようにするためにHEADINGを指定しています。
Variable=”UserAircraftPosition”とした場合はAxisの代わりにModeを指定するようです。
Mode=”TURN”の場合headingのみの2次元の回転、Mode=”POINT”の場合heading + pitchの3次元の回転になるようです。
Animatedは言葉での説明ではわかりにくいので、実際に試してみるとわかるかと思いますが、Yesにすると風向きが変わった時に、新たな向きに徐々に動いていくようなアニメーションが表示されます。
Modelの子要素ConditionalVisibilityではオブジェクトの出現条件を指定します。
<ConditionalVisibility Variable="WindSpeed" Value="0-14"/>
Variableで指定した条件が、Valueで指定した値のときにに出現するようになります。
Variableには、WindSpeed, WindDirection, MetVisibility, MetPrecipitation, MonthOfYear, DayOfYear, TimeOfDay, Time が指定できます。
それぞれどのような値が指定できるかはDeveloper Guideを参照してください。
Valueに値の範囲を指定するときは”-“、複数の値を指定するときは”;”を使います。
<ConditionalVisibility Variable="MonthOfYear" Value="JAN-FEB;DEC" />
上のウィンドソックの例では風速に応じてWindsock Slow、Windsock Medium Speed、Windsock Fastのオブジェクトを切り替えています。
また、次のような表記をすることで複数の条件を組み合わせることができます。
<ConditionalVisibility LogicExpression="(A$B)|C|D">
<Condition ID="A" Variable="WindSpeed" Value="0-10"/>
<Condition ID="B" Variable="WindDirection" Value="15-175"/>
<Condition ID="C" Variable="MetVisibility" Value="0-10000"/>
<Condition ID="D" Variable="MetPrecipitation" Value="RAIN;SNOW"/>
</ConditionalVisibility>
最後の部分ではTriggerable Animation、Triggerable Visibilityという機能を使っています。
<!-- Triggerable Animation and Visibility user induced -->
<SimObject Name="Animated Hangar 2">
<Placement Lat="33.638944660" Lon="-100.349746689" Alt="0#AGL" Hdg="108"/>
<Model SimTitle="Hangar 2">
<TriggerableVisibility Input="TextMenu" Action="Show,Hide" VisibleOnLoad="Yes"/>
<TriggerableAnimation Input="TextMenu" Action="Open,Close" StartKF="0" EndKF="100" Duration="4">
<Sound FileName="HangarDoor.wav" Loop="Yes" MinDistance="20" MaxDistance="800"/>
</TriggerableAnimation>
</Model>
</SimObject>
これらの機能については私もまだ試せていません。
FSXにSODEをインストールした状態で、TAB + sを押すか、アドオンメニューからText-Menu Commandsを選択すると、次のようなメニューが表示されます。
このメニューから指示することで、いろいろな動作をさせることができるようです。
このXMLの例ではおそらく、Showを選択するとハンガーが表示され、Hideでハンガーが消える、Open・Closeを選択するとドアが開閉するアニメーションが動作するというようなものだと思われます。
今回のSODEの解説は以上です。
アイデア次第では今までにないようないろいろな動作をするシーナリーが作れるのではないかと思います。