開発ストーリー(6~10)
6)いつもあなたを見ています
ドキッとするようなタイトルです。(笑)何のことかというと、このEZ FLIGHTの中に出てくる雲のことです。
EZ FLIGHTには二種類の雲があります。はるか上の方に平面的に広がる上層雲と海上都市の周辺にちらばる雲です。
上層雲は割りと簡単です。上の方に平面的に透過性の画像を貼り付ければよいのです。もちろん、それを突き抜けて通過することも可能です。
さて、問題は海上都市周辺に散らばる霧のようなモヤッとした雲をどうするか、です。そのキーワードが「いつもあなたを見ています。」です。
実際の雲はふわっとある体積を持っています。それをどうやってプログラミングするかが問題です。パーティクルというlingo 上のmodelの種類があります。これは小さな粒を指定するやりかたです。EZ FLIGHTでは、空母からの発艦のときに戦闘機の下から出るスチームにこれを使っています。ただ、ふわっとした雲にはこれは使っていません。パーティクルを使うとメモリをたくさん食うからです。
では、フワッと浮かんでいる雲はどうなっているのか。?雲の中を戦闘機がスーッと通りぬけたりと結構、リアルです。
実はこれはトリックです。雲は全て平面の透過性のある画像(Transparent GIF)なのです。平面なのです。EZ FLIGHTでは一種類の雲をさまざまな角度で回転させ、表示して、同じものであることをわかりにくくしています。
そして、ミソはその画像をカメラに対し常にひとつの平面を直角に写しだしている点です。どういうことかというと雲の画像の中心に刺さっている線があるとします。この線が必ずカメラを通過するようにしてやる。言い換えるとカメラの視覚に直角になるように常に雲をカメラの方向に向け、瞬時に計算し、表示しているのです。ひまわりのように中間に浮かぶ雲は常に、カメラを向いているのです。
これもカネハラさんの作ったShockwings を参考にしたものです。しかし、不思議なもので、たったこれだけで雲の感じが良く出ていると思います。
上層雲も浮かんでいる雲も、遠くの霞もない状態でシミュレータを作ってみましたが、遠近感のない、殺風景な空間になりました。滑稽でさえありました。
普段見ている、雲。・・・なにげないものですが、そのフラクタルな構造で結構人の心は休まるものです。
7)トレーニングモード
プログラムの開発の途中で、トレーニングモードというものを考えました。字のごとく、編隊の4番機だけ、マニュアルモードにしてやり、他の1番、2番、3、5,6番機が編隊として動くその動きについていくようなモードを作ってみました。
しかし、これは失敗でした。全然、歯がたちません。ある程度、ついていけるのは直進しているときだけで、進路を変更すると同時に迷子になってしまい、編隊が自分の前にいるのか、後ろにいるのかもわからない状況でした。結局あきらめました。
実際のアクロバットチームはリーダー機が次の機の動きをどのようにするかをすべて指示しているわけで、本物のアクロチームの隊員は結構、大変なものなのだろうと思います。特に、進路変更よりも、速度の上げ下げが大変だろうと思います。飛行機は空気ブレーキというものがありますが、車のように急停車するようなことも急にスピードをあげることもほとんどできません。我々凡人は高速道路で前を走る車と車間距離をとるだけでも結構神経をつかうのに、彼らの技術は相当なものなのだと思います。
8)馬とニンジン(1)
別の項目で書いていますが、EZ FLIGHT では、Nav Point という、仮想目標点を人工島のまわりにいくつか設けています。オートパイロットはその目標に向かって飛び続けることで実現しています。目標のNav Point にある一定の距離に近づいたら、また次のNav Point を探して決めてやります。その繰り返しです。
ところが、よく観察するとこのNav Point ではなく、ただ、なんとなく、人工島の周りを一定のBank(傾き)角で傾きながら周回するシーンがあります。実はこの話です。
この一定のBANK(傾き)角で周る姿は結構、見ていて気持ちのよいものです。最初は人工島の周囲にある白い防波堤に沿って、楕円形状に旋回をさせようとしました。が・・・これが結構難しい。楕円の周囲にいくつかのポイントを取っておいて、順番にリレーさせて実現しようとしたのですが、水平になったり戻ったりと結構見た目が悪かったのでした。それで、次に、楕円上を動く点を作ってやり、それを編隊が追う・・・という設定を試みました。つまり、ニンジンを馬の前にぶら下げてやり、馬には絶対に追いつけないスピードで楕円の形に動かしてやればいいことになります。
楕円形状を直交座標系で表現すると結構面倒です。平方(SQRT)などが出てきます。そして、これもDirectorのバグかと思うのですが、「絶対、正の数になるはず・・・」の式の値を負の数としてたたき出してきたりします。
たとえばsqrt(b*b*cos(theta)*cos(theta)+a*a*sin(theta)sin(theta))
となるような式の値を書き出してやると負の符号をつけて吐き出したりと、めちゃくちゃな計算をしているようでした。原因は今でもわかりません。Directorには式を追って実際の数値を吐き出す機能があるのですが、ありえない値を出してきたのです。
さらに三角関数の問題が加わります。つまりある物体とある物体のベクトルがx軸とどれくらいの角度を持っているかをあらわすのに、象限により+やーが入れ替わります。その場合わけも考慮しなくてはならなくなります。面倒至極です。この方法もあきらめました。
それで結局、人工島の周りに沿って飛ばすことはあきらめました。
9)馬とニンジン(2)
では、どうするか。?
楕円ではなく、円としてまわすのならば、式が少しは簡単になりそうです。それでLingoにあるrotate(回転)という命令を実行させることにしました。あるものの周りにx,y,zのどういう割合で回転させるかを指定してやればいのです。ところが、今度は何を親(中心)にして回すかで、少し問題がありました。親の座標をうまく読み取れていないようなのです。説明は難しいですが、この方法もなんか、うまくいきませんでした。
10)馬とニンジン(3)
あるとき、ホントにイージーなひらめきがありました。「馬にニンジンを持たせればいいじゃないか。」です。
飛行機を傾けて、ある一定の間だけ、旋回させるのならば、外側から飛行機をコントロールするのではなく、飛行機自体にニンジンをつけて自分で自分のニンジンを追わせればいいではないかと思ったのでした。。まあ、そのかわり、どういったコースをとるかは保証はできませんが。・・・そのコースが犠牲となる代わりに傾き角度をある範囲、ランダムに選べるようにして、旋回のパターンに幅を持たせることとしました。現在の周回コースはこのようにして作りました。これだと絶対にニンジンに追いつくという心配はなくなります。飛行機は前方の右か左の定点に向かって(その定点は自分が持っているのですが)進路をとることになります。
まあ、やはり堤防にそってぐるっと回る方法はいつかはやってみたいし、上の方法だとコースがランダムな分、高層ビルを透過してしまう確率も増えることとなりました。まあ、いたしかたないかもしれません。