logo
ホーム •  フォーラム •  日本語wikiトップ •  アカウント情報 •  サイト内検索 •  新規登録
 ログイン
ユーザー名:

パスワード:


パスワード紛失

新規登録
 メインメニュー
 米国サイト
 オンライン状況
16 人のユーザが現在オンラインです。 (2 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 16

もっと...

Nasalを知ろう、使おう!

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 .6 .7 .8 .9 .10 .11 | 投稿日時 2008-4-11 0:54
Tat  長老   投稿数: 375
Nasal は機体開発だけでなく、Joystick/キーボード設定、FlightGear の機能拡張及び MP Carrier や AirRacing などの AddOn 開発等、様々な場面で利用されています。

このスレッドでは Nasal に関する質問にも分かる範囲で答えていけたらと思っています。「機体の開発や改造をしたいけど、Nasal が分からないのでちょっと....」とか、「こんなことしたいんだけど、Nasal でどう実現したらいいの?」という方や、「Nasal で書かれた面白い機能拡張を見つけたよ」という方は是非このスレッドに書き込んでください。

なお、FlightGear で利用されているスクリプト言語 Nasal のマニュアルを書き始めました。まだ書きかけですが、興味のある方は Pukiwikiの Nasal マニュアル をご覧下さい。

Nasal のホームページにあるドキュメントではなかなか習得しにくいと思いますので、オリジナル文章の和訳を行うのではなく、機体開発や AirRacing の開発を通して得た知識を反映したマニュアルにしていきたいと思います。また、徐々にですが、これまでに記述したり見たりした Nasal スクリプトのうち、便利なものや参考になるものを集めたスクリプト集も追加していきたいと思います。

参考:
- Nasal ホームページ
- Using Nasal with FlightGear

投票数:7 平均点:2.86
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-22 20:54
Tat  長老   投稿数: 375
思ったより、というか全然反響がないですね。
ひょっとして皆さん Nasal を使ってなかったりします?

もしそうなら要望の多い英語版から先に記述して、その後で日本語に翻訳しようかと思います。

如何でしょう?

投票数:6 平均点:1.67
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-22 22:38
sambar  長老 居住地: 岡山  投稿数: 484
う〜ん、私は英語版を先に書いて、それを後で翻訳した方が良いような気がします。

と言うのも、殆どの人が「何に使うのかまだ良いアイデアが沸かない」のが実際の所ではないでしょうか?

#私の場合、仮に良い(妄想レベルの)アイデアがあっても忙しくてなかなか具体的な案に出来ないです。

--
Powerd by Phenom X4_9350e, nVidia GeForce GTX550Ti,Linux(x86_64)
旧callsign=sambar
新callsign=JA26FB

投票数:5 平均点:4.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2008-4-23 10:12
hide  長老 居住地: 兵庫県  投稿数: 619
hideです。
 私も「妄想レベル」では、やってみたいことがあります。
コンコルドの計器盤にある、時計の制御を行っているプログラムを、任意の他機に移植してみたいのです。

 FlightGearには、aキーを使う倍速モードがあります。長距離を飛ぶ場合は大変便利なのですが、この機能はシミュレーション時間とは同期していません。そのため倍速モードを入れたり切ったり、また倍率を変更すると、目的地への到着予定時刻が分からなくなってしまいます。
 コンコルドの場合も、シミュレーション時間(太陽時)そのものは不変ですが、計器盤の時計だけは倍速モードに同期しています。つまりn倍速で飛んでいる間、計器盤の時計は自動的にn倍で進みます。これは推測航法の場合、驚異的に便利です。

 この仕掛けをブロンコに移植できないかと、ダメ元で先日、以下のような改造を試みました。まずConcorde-instrument.nasから「SPEED UP TIME」という項目をコピーして独立ファイルとし、関連がありそうなConcorde-constants.nasから、「unit conversion」という項目のうち「time」の項目(時分秒の単位換算らしい)を抜き出して、これも独立ファイルにして、いずれもブロンコの「nas」フォルダに納めました。次いでこれらのパスを…どのxmlファイルだったか忘れましたが…PropertyListの中に、他のものと同様の書式で書き足してみました。
 結果は、ブロンコは無事に起動しましたが、「time」の1行目がエラーと判定され、時計の倍速機能は動きませんでした。時間の管理は、実際はもっと複雑な仕組みなのでしょう。

 こんなことが実現できましたら、非常に楽しいと思います。ただ私はプログラミングの基礎知識がまったくないので、少々勉強しても、無理だろうと思っておりますが…^^;)。
投票数:6 平均点:1.67
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-4-23 12:55
hide  長老 居住地: 兵庫県  投稿数: 619
hideです。
 もう一つ。これはnasal絡みかどうか、分かりませんが…以前から、ぜひ知りたいことがあります。FlightGearの機体ファイルから、高度別/速度別の揚抗比を知るには、どうすればいいのでしょう。これは、どこかのテーブルに、必ず記述があると思います。この読み方が分かれば…ベスト燃費を出せる飛び方が、煩雑なテスト飛行なしに決定できると思うのですが。

     ○

 また「妄想」に属するアイディアの追加ですけれど…できれば「航空用六分儀」も、あったら面白いですね。
 具体的には、コクピットの屋根付近にカメラ・ビューを設けまして、この内部で太陽や星々にカーソルを合わせると、天体の高度(水平線からの仰角)と真方位が、小数点以下数ケタで表示される、という機能です。画面上に表示される物差しや分度器で計る方法がないか、あれこれ考えましたが、ちょっと無理です。これがありますと洋上飛行で、1950年代ごろまでナビゲーターが行っていた、天測による緯度経度の計算が、原理的には可能になります。

 FlightGearの恒星データは、2000年の赤経・赤緯が使われていることが分かりました。この数値テーブルの解析が出来れば、一定の間隔で2〜3回の観測を行うと、UTC(世界時)の月日・時刻表示と併せて「位置の線」を算出し、交点を求めることで緯度経度が出るはずです。ただ、デフォルトで付いている緯度経度表示機能と、GPS航法があれば不要ですから、これが欲しい方が私以外に、どの程度いらっしゃるかは、かなり疑問ではありますが。
投票数:2 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-24 18:55
Tat  長老   投稿数: 375
hide さん、とりあえず SPEED UP TIME の件に関しては簡単なので、いろんな機体で動作し、かつ機体データの変更が不要なスクリプトにしてみました。

Pukiwiki の Nasal スクリプト集 - daytime.nas におきましたのでご活用ください。(ファイル添付ができなかったので、とりあえず貼付けました。ご容赦ください)

揚抗比(DL ratio)に関しては JSBSim/Yasim ともにデータが直接機体ファイル内にある訳ではありません。DL ratio を計算するのであれば Drag at zero lift : C(D,0) の値が必要です。JSBSim の場合、(例えば OV10) OV10.xml の <aerodynamics><axis name="DRAG"> <function name ="aero/coefficient/CD0">の中にテーブルがあります。が、いろんな条件が絡み合うのでDL ratio をこのデータだけから手計算するのは至難の業だと思います。nasal ではどうするかというと、実行中の全揚力/ 全抗力 から単純に算出します。具体的には /fdm/jsbsim/aero/coefficient/ 以下のプロパティに抗力、揚力がありますので、 getprop と print を組み合わせて記述します。このD/L ratio, 速度, 高度の3点を1秒毎に記録し、ログを基にグラフを描画すればお望みのデータが得られることとなります。(面倒ですねぇ。簡単な方法はないですかね。)

さて、六分儀は面白そうです。が、これもまた面倒ですね。3Dモデルとマウス操作、さらには恒星データ参照が必要です。この辺が全て準備できればすぐに実装できますけど、んー、時間がかかりそうですね。


投票数:8 平均点:2.50
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-25 3:04 | 最終変更
toshi  長老   投稿数: 1098
Tatさん、早速時計の問題を解決するとは、さすがですね。

hideさん引用:
具体的には、コクピットの屋根付近にカメラ・ビューを設けまして、この内部で太陽や星々にカーソルを合わせると、天体の高度(水平線からの仰角)と真方位が、小数点以下数ケタで表示される、という機能です。
天体の高度と真方位を求める話に限定すれば、現状でも無理やりですがそれっぽい事は出来そうです。

非常に見にくいですけど、おおまかな計算の様子を画像「月の高度と方位」にアップロードしておきました。
ただし、高度の計算方法はおそらく間違っています。

hideさん引用:
FlightGearの恒星データは、2000年の赤経・赤緯が使われていることが分かりました。
これは、どこに書かれている情報でしょうか?

本家のドキュメントページ
http://www.flightgear.org/docs.html
の下のほうにある「Scenery」の節にも、星や太陽・月についての情報が書いてあるようですが、まだちゃんと読んでません。
しかも10年位前の文章なので、現在の FlightGear にそのまま当てはまるかどうかも怪しいのですが、とりあえず現時点での情報としてご参考まで。
投票数:5 平均点:2.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-25 4:02
hide  長老 居住地: 兵庫県  投稿数: 619
hideです。
 Tatさんがお作り下さったdaytime.nasを、さっそくインストール致しました。
 う〜〜ん、これは凄い。FlightGearを使って2年半、無理だと諦めていた「倍速モードと時計の同期」がとうとう実現し、大感激しました。本当にありがとうございます。

 私が好んで使う推測航法は、要するに機体の速度ベクトルから、風向風速ベクトルを引いて、針路と所要時間の修正値を出し、コンパスと時計を頼りに目的地へ向かう手法ですが、視界の悪い飛行条件下で倍速モードを使いますと、目的地はまだ先なのか通り過ぎたのか、判断が難しい場合があります。無事に目的地に着いても、果たしてコースの前後方向には、どの程度の航法上の誤差が出たのか、事後評価が困難でした。
 今回のプログラムによって、初めて「完璧な」推測航法が可能になります。おまけにインストールは超簡単、しかも全機体に適用されるとなると…ただ感動するしかありません。

 また揚抗比について、ご説明をありがとうございました。最大航続力を出す飛び方を知るのは、なかなか難しそうですね。妄想を逞しくしますと、FlightGear各機の飛行特性を解析して、フライト・エンベロープを作図するツールがあったら、世界中のユーザーが喜びそうだな、とも思います。これは夢ですけれど…。

     ○

 六分儀につきましては、つい先程、toshiさんの書き込みを拝読しました。ううむ、Browse Internal Propertiesから、視点方位が読めるのですか! 気が付きませんでした。これなら機体がカーソルに使えますね。休みにご指摘をじっくり読み直してみます。ありがとうございました。

 また私の「恒星データは、2000年の赤経・赤緯」の記述ですが。これは、FlightGear/data/Astro/planets.gzを解凍しますと、冒頭のコメント文の2〜3行目に、赤経と赤緯、等級などのテーブルの説明があって、「all positions are epoch 2000.」と書いてありました。

 六分儀は、色々とやっかいですね。航空用の実物が、どんな構造やファインダー視野を持っていたのかは、残念ながら分かっていませんが、照準器風のカーソルを天球上で動かす仕掛けを作るだけでも、大変でしょうね。また自動にせよ手計算にせよ、観測結果から緯度経度を出す計算が必要ですが、これは幾つもの座標系が絡み合って、なかなか複雑そうです。

 実際の天文航法では、計算時間を短縮する必要から、ある時刻における自機の推測位置と、同じ時刻の特定の天体の予測位置をあらかじめ算出し、実際の観測結果と比較して、推測位置を補正する、という方法を取ります。(この場合、天体高度=緯度の1分差が距離の1nm差に当たる…という単位は非常に便利。メートル法は航海や航空には向きませんね)
 私もオートパイロットで飛びながら、電卓を叩いて同様の計算をしてみたいのですが、果たして実用レベルの天文航法が理解できるのかどうか、そのうちにまず、船舶用の教科書を買ってみようかな、とも思っています。
投票数:8 平均点:5.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-26 8:07
Tat  長老   投稿数: 375
hide さん。

喜んでいただいて何よりです。
さて、最大後続力を出す飛び方についてですが、単純に対地速度÷燃料消費量でもいいんじゃないですかね? これなら下のコードで簡単に算出できますね。

var ffe = func {
  var gspeed = getprop("/velocities/groundspeed-kt");
  var ffh = getprop("/engines/engine/fuel-flow_pph") * 2;
  var fe = gspeed / ffh;
  screen.log.write(sprintf("Fuel efficiency = %1.4f", fe));
  settimer(ffe, 5);
}

setlistener("/sim/signals/fdm-initialized", ffe);

これを適当なファイル名(ffe.nas とか)で ~/.fgfs/Nasal に置くと、5秒おきにスクリーンログに値がでてきます。T-4 で実験してみると、高度10000 ft の時に IAS 270kt (対地速度 mach 0.735)で最高値を出しました。T-4 の巡航速度が mach 0.75らしいので、悪くないですね。もっともまじめにやろうとすると、いろんな高度や速度でログをとってみないといけないですが、とりあえずの参考にはなりますね。

もっともスクリーンログだと頻繁に値が表示されてウザいので、ダイアログとにすべきですね。

投票数:5 平均点:4.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-29 17:04
hide  長老 居住地: 兵庫県  投稿数: 619
hideです。
 Tatさん、またまた便利なものをお作り下さいまして、大変ありがとうございます。以前は30秒間隔でタンク残量を確認し、Excelで毎分の流量や燃費を出して整理していましたが、これで燃費テスト関係は、相当楽になりそうです。さっそく試そうと思ったのですが、残念ながら、以下のようなエラーメッセージが出てしまいました。機体は、以前からのブロンコ改です。

Nasal runtime error undefined symbol: setlistener at C:/FlightGear/data/Nasal/ffe.nas, line 10

 10行目と言いますと、プログラム末尾の「setlistener("/sim/signals/fdm-initialized", ffe);」の部分です。コピーミスかとも思いましたが、やり直してもまだ、成功せずにいます。私のパソコン特有の問題かと思いますが、解決には…どうしたらよろしいでしょうか。私の環境は、FlightGearのVer1.0.0を、C:/直下にインストールしておりますが、他に確認が必要な項目がありましたら、教えていただければ幸いです。
投票数:3 平均点:3.33

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-30 1:02
Tat  長老   投稿数: 375
おっと失礼しました。Nasal Console からちゃっちゃと動かして setlistener を付けて投稿したのがまずかったですね。ffe.nas を以下と差し替えてください。
setlistener は Nasal が初期化する迄利用できませんので、C++ で実装されている _setlistener を利用すべきですね。ついでに jsb/yasim 両対応にして、エンジン停止中の処理を加え、変数・関数名を判りやすくしてみました。A6M2 と T-4-jsbsim で試して動作を確認しました。

var showFuelEfficiency = func {
  var fuelFlow = 0;
  var groundSpeed = getprop("/velocities/groundspeed-kt");
  var engineRunning = getprop("/engines/engine/running");
  if (engineRunning == nil) {
    engineRunning = 0;
  } else {
    var fuelFlow = getprop("/engines/engine/fuel-flow-gph");
    if (fuelFlow == nil or fuelFlow == 0) {
      fuelFlow = getprop("/engines/engine/fuel-flow_pph");
    } else {
      fuelFlow *= 5.92;
    }
  }
  var fuelEfficiency = (engineRunning * fuelFlow == 0) ? 0 : (groundSpeed / fuelFlow);
  screen.log.write(sprintf("Fuel efficiency = %1.4f", fuelEfficiency));
  settimer(showFuelEfficiency, 5);
}

_setlistener("/sim/signals/fdm-initialized", showFuelEfficiency);
投票数:4 平均点:5.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-30 20:44
hide  長老 居住地: 兵庫県  投稿数: 619
hideです。
 Tatさん、またまたありがとうございます。改良版のffe.nasは、私の環境でもちゃんと動きました。これはいい道具ですね。特にレシプロエンジンですと、プロペラピッチやミクスチャーまであるので、最良燃費の組み合わせを求めるテスト飛行には徹夜しましたが、このソフトがあれば、測定と計算処理を瞬時に行うので、極めて便利です。
 ところで、初歩的な質問で済みませんが…表示数値の単位は、燃料1ポンドあたりの飛行距離(nm)と理解しましたが、よろしいでしょうか。
投票数:3 平均点:10.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-4-30 23:11
Tat  長老   投稿数: 375
hide さん、お褒めのお言葉ありがとうございます。表示される燃費の単位は、仰る通り1ポンド当りの飛行距離です。計算式で書くとこうなります。

groundSpeed (Kt) / fuelFlow (pph) ...... (1)
Kt = nm / h; pph = pound / h なので、(1) 式の単位は
Kt / pph = (nm / h) / (pound / h) = nm / pound 

さて、単位が気になるという事は、航続距離を計算したいということでしょうか? 燃料の残量が判れば、燃費 * 燃料の残量(pound) で簡単に航続距離を予測できます。ただし、このスクリプトでは効率のみを求める事を考えたので1基分しか計算していません。このスクリプトを拡張して燃料が空になる迄の航続距離を予測をする場合は全てのエンジンと燃料タンクとから燃費と残量とを算出して、総残量 / 平均燃費を計算することになります。
投票数:10 平均点:5.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-5-1 23:25
sambar  長老 居住地: 岡山  投稿数: 484
tatさん、ありがとうございます。

私はPA28で試したのですが、ミクスチャーを閉じてエンジンをシャットダウンした時に以下のエラーが出てNasalスクリプトが異常終了しました。
引用:
Nasal runtime error: nil used in numeric context at C:/Users/myname/AppData/Roaming/flightgear.org/Nasal/ffe.nas, line 15

15行を読んでみましたが、「 var fuelEfficiency = (engineRunning * fuelFlow == 0) ? 0 : (groundSpeed / fuelFlow);」
ですが、この行のコロンより前はどんな意味なんでしょうか?

PS:fuelFlowがnilを返したとき、0を代入してエラーを回避するように改造しました。diffは以下です。
引用:
14a15,17
> if (fuelFlow == nil){
> fuelFlow = 0;
> }

--
Powerd by Phenom X4_9350e, nVidia GeForce GTX550Ti,Linux(x86_64)
旧callsign=sambar
新callsign=JA26FB

投票数:3 平均点:0.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-5-2 0:13
Tat  長老   投稿数: 375
sambar さん。エラーについてですが、エンジンをシャットダウンした際に fuel-flow-gph = 0 になり、その結果、存在しない fuel-flow_pph を参照したため、nil が帰って来たものと思われます。JSBSim の場合、fuel-flow-gph が 0 で、fuel-flow_pph のみを利用する場合があり、それに対応する為の処理でした。しかし、エンジンシャットダウン時にエラーが出てしまうケースまではは想定していませんでしたね。sambar さんのご指摘通りの処理を追加すれば、このケースにも対応できますね。ありがとうございました。

引用:
15行を読んでみましたが、「 var fuelEfficiency = (engineRunning * fuelFlow == 0) ? 0 : (groundSpeed / fuelFlow);」
ですが、この行のコロンより前はどんな意味なんでしょうか?

この行は (engineRunning * fuelFlow == 0) が真ならば 0 を、そうでなければ (groundSpeed / fuelFlow) を返すという演算です。? と : は条件演算子と呼ばれます。

 
変数 = (条件) ? 値1 : 値2
という代入演算は以下と等価になります。
if (条件) 変数 = 値1 else 変数 = 値

蛇足ですが、この行の条件文は、(engineRunning == 0 or fuelFlow ==0) という条件をまとめて (engineRunning * fuelFlow == 0) と置き換えています。

投票数:3 平均点:3.33

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-5-5 14:36 | 最終変更
Tat  長老   投稿数: 375
瞬間燃費をダイアログで表示するようにしました。ついでに予測後続距離と時間も表示します。詳細は Nasal スクリプト集 - ffe.nas を参照ください。今回は添付できたので、ダウンロード可能です。

なお、ダイアログを開くキーボードショートカットはまだ用意していません。上記ページにある説明を参照して Nasal スクリプトからダイアログを表示してください。

ちなみに、今回の更新で燃料の単位を ポンドからガロンに変更しました。ポンドよりは直感的に分かりやすいと思います
投票数:1 平均点:0.00

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-5-7 15:23
hide  長老 居住地: 兵庫県  投稿数: 619
hideです。
 Tatさん、さっそく新型ffe.nasを使わせていただきました。瞬間燃費と推定航続力、滞空時間が出るのは、いわば刻々と性能グラフが描かれるようなもので、すごく便利になりましたね。
 お陰様で、初めて操縦する機体で、いきなりクロスカントリー飛行をしても、燃料切れの不安が全くありません。また、例えばテスト飛行中に満タンにしても、すぐに航続力推定結果に反映され、機体の航続性能全般を、リアルに把握することができます。英語版の説明を付けた上でもっとPRして、世界中のユーザーに使ってもらいたいものですね。ついでながら、ダイアログの開閉が飛行中に、キーボード上から可能になると、最高だと思います。
 かつて対数計算が発明されたとき、「この発明は、(大量の計算をする)天文学者の寿命を延ばしたに等しい」と絶賛されたそうですが…このnasファイルは、FlightGearユーザーの睡眠時間を、劇的に延ばしてくれました(^^;)。

 ジェット燃料は、温度による体積変化が大きいそうで、搭載量は通常はポンドで管理されると聞きました。そこで私はブロンコを使い始めてからは、もっぱらポンドを使っており、最初はポンドでも表示できると便利だなと思いました。しかしFlightGearでは比重は固定ですし、ご指摘通りガロンのほうが物理量として、また有効数字の表示桁数の点でも、ポンドよりずっと感覚的に把握しやすいので、これでいいと思います。ともかく、またまたありがとうございました!
投票数:8 平均点:6.25

通常 Re: Nasalを知ろう、使おう!

msg# 1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-5-8 1:19
Tat  長老   投稿数: 375
hide さん。
対数計算程大きな発明ではないですが、お役に立ててなによりです。
燃料に関しては仰る通りポンドの方がいいかなと思いきや、比重が変わらなそうなのでガロンに戻しました。単位は簡単に変更できますので、そのうち切替ボタンでも着けますかね。ダイアログを開くキーアサインも簡単にできます。近いうちに更新しておきますね。
投票数:3 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-7-1 22:25
sambar  長老 居住地: 岡山  投稿数: 484
TatさんのAirRacingの、racing.nasの機体とゲートの接触判定を行う部分を変更して、機体ごとの全幅を読み込んでからあたり判定をしたいと思っているのですが、起動時に以下のエラーが出るようになりました。
(JSBSimで無い機体は、デフォルトの8を使用します。)
引用:
Nasal runtime error: non-scalar in numeric context
at D:/Program Files/FlightGear/data/Nasal/racing.nas, line 356

diffは以下です。
引用:
346c346,360
< TouchingPenalty.WING_SPAN = 8;
---
> #if your choose JSBSim aircraft, then use fdm/jsbsim/metrics/bw-ft,else 8m
>
> TouchingPenalty.WING_SPAN = props.globals.getNode("/fdm/jsbsim/metrics/bw-ft");
> if (TouchingPenalty.WING_SPAN == nil) {
> TouchingPenalty.WING_SPAN = 8;
> print("Can't get wing span. use %d m", TouchingPenalty.WING_SPAN);
> }
> else {
> #convert feet into meter
> print("Wing span = %d ft" ,TouchingPenalty.WING_SPAN) ;
> TouchingPenalty.WING_SPAN = TouchingPenalty.WING_SPAN * 0.3048;
> print("Wing span = %d m" ,TouchingPenalty.WING_SPAN) ;
> }
>
>

また、この変更を行うとエアレースのシーナリー読み込みで失敗するようになりました。
(もっとも、「WW2戦闘・攻撃機クラス」「ジェット練習機クラス」とか「1970〜現代の戦闘機」等の制限つきで異機種レースを行わないなら、必要ない改造ではありますが・・・「年間通じて使用機種の変更禁止」という条件つきのシリーズをやるならあってもいいでしょう。)
投票数:4 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-7-2 23:50
toshi  長老   投稿数: 1098
機体のサイズを考慮したゲート接触判定が出来るといいな、と私も思っていました。

エラーを発生させている行は
TouchingPenalty.WING_SPAN = TouchingPenalty.WING_SPAN * 0.3048;
ですか?

自己代入演算子を使うとどうなりますか?
http://flightgear.jpn.org/wiki/index.php?Nasal%20%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB#b1d5b458

現状のAirRacingでは、特に機体を90度ロールさせた状態でゲートのぎりぎり内側を通過する際に、見た目ではどう見ても当たってない場合でも接触したと判定されてしまいますよね。
これも解決できると嬉しいのですが、何か良い策は無いものでしょうか。
投票数:4 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-7-3 22:46
sambar  長老 居住地: 岡山  投稿数: 484
引用:
エラーを発生させている行は
TouchingPenalty.WING_SPAN = TouchingPenalty.WING_SPAN * 0.3048;
ですか?

自己代入演算子を使うとどうなりますか?
http://flightgear.jpn.org/wiki/index.php?Nasal%20%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB#b1d5b458

エラーが出る行はその行なので、早速やってみました。
・・・ですが、同じエラーが続きます。

引用:

現状のAirRacingでは、特に機体を90度ロールさせた状態でゲートのぎりぎり内側を通過する際に、見た目ではどう見ても当たってない場合でも接触したと判定されてしまいますよね。
まだ流し読み程度なので多分間違いはあるとは思いますが、先端が入ってから尾部が通過するまでの間、(gate.width - 全幅×cos(バンク角)/2)の計算が繰り返し行われているような気がします。
(=一番幅の広い主翼が通り過ぎた後、尾部が出る前に水平に戻すと、接触と判定される)

これについての解決策は・・・主翼の幅だけでなく、取り付け位置や後退角などを取得してそれぞれ判定部分に組み込むしかないでしょう。
投票数:4 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-7-4 1:52 | 最終変更
Tat  長老   投稿数: 375
エラーの件ですが、FDM の初期化が終わる前にプロパティを参照してますので、空文字列("")が返ってきています (プロパティは存在するけど、値が設定されていない場合は空文字になります)。これを解決するには、FDM 初期化後に WING_SPAN にプロパティの値を代入しなければなりません。

具体的には TouchingPenalty.new() の中で代入処理を行えばよいでしょう。
元々の
TouchingPenalty.WING_SPAN = 8;
は削除する必要はありません。

判定式は、
ゲート中心と機体中心との間の距離 > 全幅 * cos(バンク角)/2
かつ
機体高度 < ゲートの高さ
の場合に接触と見なします。この式では、機体が板状であることを想定していますので、機首や機尾部分で判定されたは誤差を含んでいます。(繰り返し判定はしていません。通過判定時に一度だけです。)

それよりも問題なのは、機体中心とゲート中心との間の距離が、必ずしもゲート中心からゲートのパイロン方向へのズレとは限らないことです。接触判定を行うのは通過判定時ですが、その際に必ずしもゲートのパイロン間を結ぶ直線上に機体中心があるわけではないのです。通過判定式は

 ゲート幅 / 2 <= 機体中心とゲート中心との距離
かつ
機体中心とゲート中心との距離 > 機体中心とゲート中心との距離の最小値

となります。ゲート判定間隔は0.1秒ですから最大誤差は 0.05 秒の間に進む距離となります。一定速度で正確なゲート通過後 0.05 秒後 にゲート中心から N メートルの所でゲート通過と判定されると、判定は 0.1秒前、つまり本当のゲート通過前 0.05 秒の時点での距離となります。(つまりゲート中心のN メートル手前) ゲートのど真ん中を通ったとしても機体中心と N メートルの差があることになります。0.05秒もあれば、T-4なら 10m 程進んでしまいますが、この差が機体進行方向のズレなのか、ゲート中心からパイロン方向へのズレなのかが判定できていません。これによりパイロンギリギリを通ると接触したという判定になってしまうのです。

# んー文字で書くと難しい

ということで、多分ですが、判定間隔を短くすれば精度は向上するはずです。
ただ、もうちょっと考えないといけないと思いますので、近いうちに変更してみます。しばしお待ち下さい。

p.s.
一度コードを書きましたが、ちょっと間違えていたので消しました。もし見た方がいらっしゃったら、忘れてください。
投票数:4 平均点:5.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-7-4 1:54
toshi  長老   投稿数: 1098
そうでしたか。
となると、じっくり見てみないと私にはちょっと分かりそうもないので、すぐには回答できません。
ごめんなさい。
投票数:2 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-7-4 15:16
Tat  長老   投稿数: 375
色々解説しておきながらなんですが、AirRacing のバグを2つ程見つけてしまいました。

バグ修正済みの最新版は AirRacing-20080704.tar.gz です。是非お試しください。なお、今回は開発版の変更も取り入れましたので、ゲート番号が表示されるようになり、矢印の形がロケットになっています(どの方向からでも見やすいのはこんな形ですかね?)

さて、せっかくの Nasal スレッドですので、何が間違えていたかを説明しておきます。まずは、ゲート中心から機体中心への距離を求める式が間違っていました。

正しい計算方法は
引用:
var dlat_m = dlat * 111120;
var dlon_m = dlon * math.cos(me.lat / 180 * math.pi) * 111120;
me.dist_m = math.sqrt(dlat_m * dlat_m + dlon_m * dlon_m);

# dlat : 機体中心とゲート中心との緯度の差分 (deg)
# dlon : 機体中心とゲート中心の経度の差分 (deg)
# dlat_m : dlat の距離 (m)
# dlon_m : dlon の距離 (m)
# me.dist_m: 機体中心とゲート中心との距離 (m)
# me.lat: 機体中心の緯度

なのですが、2つも大きな間違いがありました。間違ったコードを見てみましょう。
引用:
var dlat_m = dlat * 111120;
var dlon_m = dlon * math.cos(me.lon) * 111120;
me.dist_m = math.sqrt(dlat_m * dlat_m + dlon_m * dlon_m);

両方とも2行目が問題です。1つ目は、ある緯度における経度差の距離計算に対しては緯度のコサインを掛けるのですが、この計算を cos(me.lat) ではなく cos(me.lon) としていました。全くの凡ミスです。更に、cos の引数をラジアンに変換するのを忘れていました。もう笑うしかありません。これらの間違いにより、最大で誤差100% (経度1°当り111.12 km) になります(笑) しかしながら、距離が短い事とラジアン変換ミスの誤差とある程度相殺されるので、大抵の場合 ±20〜30m の誤差になるようです。このため精度は悪いけど、とりあえず通過判定ができていたということになります。

こういう場合はバグの発見が遅れてしまいがちです。今回は Racer.dist_m をモニタしながらゲートの端を通過した時に, dist_m が 80 m だったり109 m だったりとばらつきがあったため、計算が間違っている事に気づきました。

いずれにしても、sambar さんのご指摘が無ければ、このバグは ずっと見過ごしている所でした。大変ありがとうございました。

つぎに、2つ目の問題を説明します、通過判定のところで本来なら
引用:
最小距離 (Gate.minDistance) < 機体とゲートとの間の距離 (Racer.dist_m)
かつ
最小距離 < (ゲートの幅 + バンク時の機体幅) / 2
の際に通過と見なすべきですが、以前のコードには間違いがあり、最小の距離になる前に通過判定をしてしまう場合があることと、接触判定を見越してゲート幅にバンク時の機体幅を足す計算がありませんでした。

ついでに、sambar さんご提案の JSBSim の WingSpan を取り込むようにしてみました。これらの修正 & 変更で随分精度はよくなったのではないかと思います。

ちなみに Wing Span を参照する部分が多くなって来たので、TouchingPenalty.WING_SPAN を
Racer.wingSpan に変更しました。また、水平方向での機体幅は Racer.currentWidth() で取得できるようになっています。

今回の修正に関して具体的に何が変更されたかを知りたい場合は、直前の開発版である AirRacing-dev-20080516 との diff を取ってください。変更されているのは racing.nas です。
投票数:11 平均点:6.36
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-7-5 1:19
sambar  長老 居住地: 岡山  投稿数: 484
お早い対応ありがとうございます。

私は、「当たっていないのに接触判定を貰うことがあまりに多かったので、機体幅はどれ位で計算しているんだろう?」と思いつつracing.nasを読んでみたら・・・と言った感じです。

#時間があったら、diffを取ってゆっくりと読んでみたいと思います。
#私の場合、安定して飛ぶ練習が先かもしれませんがw
投票数:7 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-7-30 10:03
Tat  長老   投稿数: 375
ゼロ戦の空母着艦ビデオを見ていました。あの当時の空母はかなりピッチング/ローリング方向に揺れていますね。この揺れる中で着艦できないと一人前の戦闘機乗りとは言えないんだそうです。

これは練習して一人前の戦闘機乗りにならねば!!

...と意気込んで Nimitz から飛び立ったはいいけど、こやつは全く揺れない....
幾ら近代空母とはいえ、ある程度はピッチ/ロール方向に揺れます。とこが、Nimitz はぴくりとも動きせん。まるでこれじゃ空港と同じです。

ってことで、Nasal で簡易的に揺れを再現してみました。今の所天候は無視しています。揺れを大きくしすぎると離陸中に甲板にグサっと突き刺さるので、割と抑えめにしています。本来なら天気に応じて揺れを生じさせるべきですが、あくまで練習/楽しみ用なので天候無視で奇麗なサインカーブで揺れます。ただ、ピッチとロールの周期は違うので、ちょっと複雑な動きになります。

スクリプトは Nasal スクリプト集 - Rocking_Nimitz.nas
に置きましたので、お楽しみください!
投票数:4 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-8-9 16:13
Tat  長老   投稿数: 375
メモ代わりに忘れないうちに書いておきます。

var last_time = getprop("/sim/time/elapsed-time");
... (略)
var cur_time = getprop("/sim/time/elapsed-time");
var dtime = last_time - cur_time;

などとすると時間の差分を取ってくれそうですが、以外に変な値になる事があります。 last_time が他のスクリプトでグローバル変数(var なしの変数宣言)として登録されている場合には、ローカルの last_time ではなくグローバルのものを参照してしまう可能性があるということです。困ったもんだ....
投票数:6 平均点:3.33
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-11-9 2:34
sambar  長老 居住地: 岡山  投稿数: 484
こんにちわ。今、CVS-「ジョイスティック(js2)からnasalを呼び出して、comm0の周波数を変更する」事に挑戦しているのですが、以下のエラーが出て動きません。
お暇でしたら、どこを間違えているのかご教示ください。

起動時:
Nasal parse error: parse error in D:/Program Files/FlightGear-CVS/data/Nasal/rad
iopanel.nas, line 14
Could not open and/or write the state to the initial conditions file.
  Model Author:  Unknown
  Creation Date: 2002-01-01
  Version:       $Id: c172p.xml,v 1.20 2008/09/01 15:14:33 torsten Exp $
  Description:   Cessna C-172

    Channel Pitch

    Channel Roll

    Channel Yaw

    Channel Flaps
Nasal runtime error: undefined symbol: radiopanel
  at /input/joysticks/js[2]/axis/binding, line 1

js2のaxis0操作時:
Nasal runtime error: undefined symbol: radiopanel
  at /input/joysticks/js[2]/axis/binding, line 1

/data/nasal/radiopanel.nas
var axisHandler_radio = func(name, min, max, step) {
	var value = (cmdarg().getNode("setting").getValue() ;
        var frequency = getprop(name) + value * (max - min) ;
	var fraction = math.mod(frequency , step);
	var frequency -= fraction;

	if (frequency <= min){
		frequency = min;
		}
	if  (frequency >= max){
		frequency = max;
		}

	setprop(name, frequency);	
	}


#comm0= axisHandler_radio("/instrumentation/comm[0]/frequencies/standby-mhz", 118.000, 136.000, 0.025);
#comm1= axisHandler_radio("/instrumentation/comm[1]/frequencies/standby-mhz", 118.000, 136.000, 0.025);
#nav0= axisHandler_radio("/instrumentation/nav[0]/frequencies/standby-mhz", 108.000, 118.000, 0.05);
#nav1= axisHandler_radio("/instrumentation/nav[1]/frequencies/standby-mhz", 108.000, 118.000, 0.05);

js2のaxis0の部分(抜粋)
<axis>
      <desc>comm0</desc>
      <number>
	<windows>0</windows>
      </number> 
	<binding>
		<command>nasal</command>
		<script>radiopanel.axisHandler_radio("/instrumentation/comm[0]/frequencies/standby-mhz", 118.000, 136.000, 0.025)</script>
	</binding>
</axis> 
投票数:10 平均点:8.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-11-9 14:41
Tat  長老   投稿数: 375
とりあえず cmdarg() の前の '(' は不要ですね。これがあるからエラーが発生しているのでしょう。

ちょっと読んでみましたが、この軸はhat ですか、それともスライダーとかですかね? このスクリプトは軸を動かしたら最大 max-min の値だけ周波数が増減しますね。この例だと 0.1 動かしただけでも周波数が 1.8 増減します。これでは、あっという間に上限に達してしまう気がしますね。

あと、ちょっとしたテクですが、
  var fraction = math.mod(frequency , step);
  var frequency -= fraction;

の部分は step で丸めている(0.025 単位で増減させたい)んですよね?
だとすると、以下に置き換える事もできます。
  frequency = int(frequency/step)*step;

ついでに、2 つの if 文は以下のようにelsif で繋ぎ、>= を > にした方が若干処理速度が向上します。というのも、min == max でない限り、どちらか一方のif 文しか実行され得ないからです。また、frequency == min or max なら処理する必要はありません。
  if (frequency < min) { 
    frequency = min;
  } elsif (frequency > max) { 
    frequency = max;
  } 

これを1行で書くと(必要はありませんが)こうなります。
  frequency = (frequency > max)? max : ((frequency < min)? min : frequency);

ちなみに、"if (条件) A else B" は "(条件) ? A : B" と等価です。2つの条件をまとめて書いたので、B の部分に更に条件文が含まれています。若干処理速度が向上しますが、if - elsif 文よりは若干読みにくくなります。

ときに、\[code\] と \[/code\] で囲んだプログラムは、firefox では正しく表示されるのですが、Safari だと改行が無視されてしまいます。とほほ...
投票数:2 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-11-9 22:50
sambar  長老 居住地: 岡山  投稿数: 484
ありがとうございます。
tatさんの仰るとおり、cmdarg() の前に、不要な'(' があるからエラーが発生していました。

引用:
ちょっと読んでみましたが、この軸はhat ですか、それともスライダーとかですかね? このスクリプトは軸を動かしたら最大 max-min の値だけ周波数が増減しますね。この例だと 0.1 動かしただけでも周波数が 1.8 増減します。これでは、あっという間に上限に達してしまう気がしますね。
一応、その部分はスライダーorダイヤルを想定しています。
PSのコントローラーをベースに改造したものを使用する予定ですが・・・無理ならば既製のラジオパネルを買おうと思っています。
(左右スティックは可変抵抗なので、分解してボタンと可変抵抗をつけなおす予定です)。
・・・まあ、周波数の増減量は「軸の値が-1から+1の範囲内でminからmaxまでの周波数を選択できる」ようにしたいと思ってこの範囲にしています。
#プロパティブラウザで見た限りでは、結構細かく制御できるっぽいので、精度は使用する部品頼りになります・・・

引用:
あと、ちょっとしたテクですが、
  var fraction = math.mod(frequency , step);
  var frequency -= fraction;

の部分は step で丸めている(0.025 単位で増減させたい)んですよね?
だとすると、以下に置き換える事もできます。
  frequency = int(frequency/step)*step;

stepで丸めたいと思っています。
こっちの方が読みやすいと思うので、コッチに置き換えます。

--
Powerd by Phenom X4_9350e, nVidia GeForce GTX550Ti,Linux(x86_64)
旧callsign=sambar
新callsign=JA26FB

投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-11-9 23:59
Tat  長老   投稿数: 375
引用:

一応、その部分はスライダーorダイヤルを想定しています。
PSのコントローラーをベースに改造したものを使用する予定ですが・・・無理ならば既製のラジオパネルを買おうと思っています。
(左右スティックは可変抵抗なので、分解してボタンと可変抵抗をつけなおす予定です)。
・・・まあ、周波数の増減量は「軸の値が-1から+1の範囲内でminからmaxまでの周波数を選択できる」ようにしたいと思ってこの範囲にしています。
#プロパティブラウザで見た限りでは、結構細かく制御できるっぽいので、精度は使用する部品頼りになります・・・

-1.0 で min になり、 1.0 で max になる、ということでいいですかね?
だとすると、軸から周波数を設定する部分は以下のように変更してください。

 # 修正前
 var frequency = getprop(name) + value * (max - min);
 
 # 修正後
  var frequency = min + ((max-min) * (value + 1)) / 2;

それにしても自作のスライダーとはなにやら楽しそうですね。
ちなみに、自作のジョイスティック向けに、こういうものがあります。
http://www.leobodnar.com/products/BU0836A/

12bit 8アナログ軸 + 32ボタンのコントローラです。
楽しそうですね。こういうのを見ると、そのうち何か作ってみようかと思ってしまいますね。8軸あればゼロ戦のプロペラピッチ、ブースト、排気温調整の他にも、カウルフラップ、シート高調整.... などいろいろ出来そうですね。

その前に機体が対応しなきゃいけませんね。:-p
投票数:8 平均点:2.50
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-11-10 19:58
sambar  長老 居住地: 岡山  投稿数: 484
引用:
ちなみに、自作のジョイスティック向けに、こういうものがあります。
http://www.leobodnar.com/products/BU0836A/

12bit 8アナログ軸 + 32ボタンのコントローラです。
これは面白そうです・・・と言うより、下手にPSのコントローラーを改造するよりも楽な気がしてきました。
#しかも日本で普通に買うより安いですし・・・

ボチボチと作っていこうと思います。ありがとうございました。
#ガワをどうやって細工しよう・・・w
投票数:11 平均点:7.27
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009-7-11 1:25 | 最終変更
sambar  長老 居住地: 岡山  投稿数: 484
CHのpro-pedals-usb.xmlに、「ブレーキペダルを踏んだらパーキングブレーキが解除される」機能を組み込んでみました。

 <axis n="0">
  <desc>Brake left</desc>
  <binding>
   <command>property-scale</command>
   <property>/controls/gear/brake-left</property>
  </binding>

<!-- Parking brake release -->
  <binding>
     <command>nasal</command>
     <script>
       var left_pedal_prop = getprop("/controls/gear/brake-left");
       var parking_brake = getprop("/controls/gear/brake-parking");
       if ((left_pedal_prop > 0.4) and (parking_brake == 1))
         {
            setprop ("/controls/gear/brake-parking", 0);
        }
      </script>
   </binding>

  </axis>

 <axis n="1">
  <desc>Brake right</desc>
  <binding>
   <command>property-scale</command>
   <property>/controls/gear/brake-right</property>
  </binding>

<!-- Parking brake release -->
  <binding>
     <command>nasal</command>
     <script>
       var right_pedal_prop = getprop("/controls/gear/brake-right");
       var parking_brake = getprop("/controls/gear/brake-parking");
       if ((right_pedal_prop > 0.4) and (parking_brake == 1))
         {
            setprop ("/controls/gear/brake-parking", 0);
        }
      </script>
   </binding>

 </axis>

 <axis n="2">
  <desc>Rudder</desc>
  <binding>
  <dead-band>0.1</dead-band>
   <command>property-scale</command>
   <property>/controls/flight/rudder</property>
   <factor>1.0</factor>
  </binding>
 </axis>

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-11-16 2:06 | 最終変更
inomaty  長老   投稿数: 164
こんばんは

現在進入灯の真ん中で滑走路進入方向に向けて光点が次々移動する連鎖式閃光灯(Sequenced Flashing Lights(SFL))をLOWI インスブルック空港カスタムシーナリーを参考に作っていますが、nasalをxmlに組み込んで数字が0,1,2・・・27,28,0,1,2・・・と無限ループするカウンタープログラムを作りその数字を元に何番目のライトを点灯ということをやっています。

ほとんどそのままLOWIのSFLの記述を持ってきて光点が流れていく動作は作れたのですが、仙台空港を10km(5nm)超離れてから戻ってくるといった飛行をするとバグが発生してしまいます(具体的には0,1,2・・・となるところを2重3重に読み込んで0,13,1,14,2,15,・・・となってしまう)。

元プログラムだと誤った表記になっていたload/unloadをこちらのWikiページを参考に修正して何とか50kmちょっと(28nmあたり)まで離れて戻ってくればプログラムを一旦停止して再度読み込みでバグが発生しないように出来たのですが、現状下手すると一旦アプローチしてゴーアラウンドしてから再度アプローチするとSFLが荒ぶる可能性があります。

listenerを使えば何とかなりそうという書き込みは発見したのですが、リンク先のページが結構長い英語文章で難航し、私自身プログラムなんてCを齧った程度でもあり、Tatさんによるマニュアルを見ても読み取るプロパティがどこの値を取れば良いのか分からずという有様です。

うまい解決方法が見つかれば他のことにも応用できそう(例えば東京スカイツリーの夜間照明で展望台部分を光がぐるぐる回るものとか)なので、よろしければプログラミング詳しい方とかも含めてご教授お願いします。現状一番うまく行っているnasalコードは最後に載せますが、分かりづらいので一連のSFLシステム(3Dモデル(未完成)、ライトイフェクト、プログラミング本体と付随するxmlファイル等)をまとめたファイルをこちらhttp://1drv.ms/1PJ07di
に上げておきます。解凍したModelsファイルをTerrainとかObjectsのあるScenery用のフォルダに保存し、Objects\e140n30\e140n38\5251083.stgをテキストエディタで開き最後に

OBJECT_SHARED Models/Airport/RJSS/RJSS_app_light_poles_rwy27_set.xml 140.9339 38.14152 10 97.45

と記述すれば仙台空港RWY27の本来進入灯のある位置から少し南に進入灯が設置され、(仙台空港から24km(13nm)以内にいるときには)ターミナル画面に仙台空港からの距離やらカウンターの数字やらがうるさいように表示されるはずです。

↓nasalコード(xmlファイル用にnasalヘッダがあります)
<nasal>
	<load>
	loaded = 1;
		
		print("setting FLASH COUNTER");
		var loop_id = 0;
		var flash_count = 0;
		
		var info = airportinfo("RJSS");
		var RJSS_pos = geo.Coord.new();
			RJSS_pos.set_latlon( info.lat, info.lon, info.elevation);
		var aircraft_pos = geo.aircraft_position();
		var RJSS_distance =RJSS_pos.direct_distance_to(aircraft_pos);


		
			var loop1 = func(id) {
				id == loop_id or return;
				
				
				#aircraft_pos = geo.aircraft_position();
				#RJSS_distance =RJSS_pos.direct_distance_to(aircraft_pos);
				var flash_num = (flash_count += 1);
				print ("flash_num  ", flash_num);
				
				setprop("/scenery/RJSS/RJSS_r27_app_flash/light-number", flash_num);
				
				if (flash_num == 28){
					flash_count = 0;
					#print("resetting FLASH COUNTER");
				};
				aircraft_pos = geo.aircraft_position();
				RJSS_distance =RJSS_pos.direct_distance_to(aircraft_pos);
				print(RJSS_distance);
				settimer(func { loop1(id) }, 1);
			
			}
			
			
				loop1(loop_id += 1);

				print("Check point3");

	</load>
	
	<unload>
		loaded = 0;
		print("Bye, bye!");
		loop_id += 1
		
	</unload>
	
</nasal>
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-11-18 22:42
inomaty  長老   投稿数: 164
すいません自己解決出来そうです。

二重読み込みは方策思いついたと思ってテストしてうまく行ったと思ったら、上の「listenerを使えば何とかなりそう」って部分のリンク先英語フォーラムにほとんど同じコードが書いてありました。いやー恥ずかし限りです^^;

現在空港から離れてSFLプログラムを停止させると戻ってきたとき再始動出来ないプログラムとなっていますので、完成までもう少し掛かりそうです。完成したら正しいコード貼り付けます。
投票数:0 平均点:0.00

  条件検索へ


 検索

高度な検索
 新しい登録ユーザ
eriwile 2018-11-19
eninyg 2018-11-19
ijyce 2018-11-18
ekeraxi 2018-11-18
ozegez 2018-11-18
subway 2018-11-18
ysonijyj 2018-11-18
enikuz 2018-11-18
ahafifir 2018-11-18
yqawezyz 2018-11-18
 最近の画像(画像付)
F-15J 特別塗装の機... (2018-11-17)
F-15J 特別塗装の機...
誘導ミサイルを発射... (2018-11-9)
誘導ミサイルを発射...
誘導ミサイルは使え... (2018-9-16)
誘導ミサイルは使え...
誘導ミサイルは使え... (2018-9-16)
誘導ミサイルは使え...
全球シーナリー更新 (2018-6-4)
全球シーナリー更新
Powered by XOOPS Cube 2.1© 2001-2006 XOOPS Cube Project
Theme designed by OCEAN-NET