◆ TOP INDEX へもどる |
■ 7月 31日 (木) ◆ 「再起動」 ふと気付くと、前回の更新から一ト月近く。 ………私自身がハングしていたよーである。 と、ゆーわけで、再起動。 当サイトにお越しの皆さま、毎度申し訳ございませぬ。 ◆ 「イルカくるくる・迷い道」 7/3の日記(あ、前回だな)に書いた、泳ぐイルカのプログラム。 ぶつからないように回避行動を取るところで行き詰まる。 えー、まずはイルカの進行方向へ「とある距離(コレの調整が難しい)」のベクトルを伸ばして、他のイルカと衝突しないか判定。 イルカ座標 ( x , y , z ) に ( Cos( Yaw ) , Sin( Pitch ) , Sin( Yaw ) ) * R を足して他のイルカの距離と比較。 R はスピードによって調整。 回避行動は、とりあえず「スピード落として右回り」とゆー簡単なものに。 実行。 「前にイルカ」→「急ブレーキ」→「おずおずと転進」→「急発進」 ………イルカ君たちが、若葉マークの車か遊園地のドッジェムのよーになっておる。(笑) さて、他のイルカを認識できたトコロで、ごく自然に他のイルカを避ける方法を思案である。 相手と自分の進行方向を比較して、相手の進行方向と逆方向へと少しずつ頭を向ける…、という方法を考えたが、イルカ君同士が狭い間隔で「併走」している時は逆にぶつかってしまうことに気付く。 うーむ。 方眼紙に、「正面」「交差」「併走」…色々な状況を描いてみるほどに、頭がこんがらがってゆくのである。 ………簡単に考えてみよう。 「前に何かある」→「よける」=「障害物の中心から遠ざかる」 そう、相手のイルカの進行方向も考えていたので頭がこんがらがったが、こーしてみると単純である。 いったい何を悩んでいたのだか。 現在、頭が少々オーバーヒートしたので冷却中である。 しゅわー ◆ 「姉弟の会話」 弟 「トルマリンを身体に付けておくといいんだとさ」 姉 「は?! そんなのつけたら危険でしょ!」 弟 「……危険か?」 姉 「危険危険」 弟 「別に『呪われたダイヤ』ってワケじゃねーだーろー」 姉 「あー」 弟 「何?」 姉 「ホルマリンだと思った」 (姉=元歯科衛生士) ※ この話はフィクションと言っておこう ◆ 「祝! 『 Europa Universalis II 』 日本語版」 あの! 北欧産のコアな中世歴史ストラテジーゲーム、 「 Europa Universalis II 」 日本語版が、メディアクエストさんから今冬に発売されるそーである。 まずは、めでたい。 プレイ中、長い英文を読むのにメゲた私にとっては朗報である。 が、その前に「 Europa Universalis II 」の続編である、第二次大戦をテーマにした「 Hearts of Iron 」日本語版が発売される。 続編が先に発売されるとゆーのも何だが、日本がマイナーな勢力である(「応仁の乱」以前なのだ)「 Europa Universalis II 」とは違い、「 Hearts of Iron 」は日本が主な勢力であるからして、仕方ないやもしれぬ。 今から楽しみである。 ◆ ASCII 24 / 旧「 Europa Universalis 」(英語版)のレビュー → ◆ GAME Watch / 「 Hearts of Iron 」日本語版の情報 → ◆ 「アシナガバチ・その後」 5/23の日記にも記した、アシナガバチの巣であるが。 見事に成長。 大家族。 戸袋の口近くに作ってあるものであるからして、雨戸を開け閉めするたびに集団でガンを付けられるのである。 ぶーん ぶーん。 (ちなみに、比較的おとなしいコアシナガバチらしいので、怒らせなければ大丈夫……のハズである) |
■ 7月 3日 (木) ◆ 「イルカくるくる・爆転編」 6/22の日記に書き記したが、先日より「 3D でイルカが泳ぎ回る」プログラムを「 Delphi + Quadruple-D 」にて書いている。 前回は、ワールドを設定してからイルカを表示できたトコロまで。 さて、イルカ君を表示できたとなると泳がせたくなるのが人情である。 "SetTranslation" メソッドと "SetOrientation" メソッドを使用して、イルカ君をワールド内にて円運動させる。 ところが、 基準となるフレームをイルカ君自身のフレームにしてしまったものだから、イルカ君が「ガメラ」のように超高速回転してスッ飛んで行く。 すでにこれはイルカではない。(笑) 座標 (0,0,0) に固定した”根っこ”フレームを基準にしたら、無事にユラユラと円運動。 Direct-X7 SDK のサンプル "Dolphin.exe" のソースを読むと、 sin カーブで上下運動もしているので、ソレも追加。 尾っぽの上げ下げは前回成功しているので、泳いでいるようには見える。 お次に海底を表示させようと思ったが、イルカ君の座標を把握したかったので「グリッド」(格子模様)の表示。 えーと、 Direct-X7 SDK のサンプルを見ると、グリッドは "DrawPrimitive" を使い、「ラインモード "D3DPT_LINELIST" に指定、点リストを受け渡し」して描いている模様。 グリッド用に点リストを入れておく配列を SXVertex 型で確保。 "D3DDevice.DrawPrimitive" を使ってレンダリングすれば、グリッドが…… ………表示されない。 バラバラの線が無限遠に向かって表示されるだけである。 Direct-X7 のヘルプを見ると、 "DrawPrimitive" に受け渡す点リストは「 D3DVertex 型」。 Quadruple のヘルプを見ると、 SXVertex と D3DVertex には互換性はナシ。 ………そーゆーことか。 グリッドの点リスト用配列を D3DVertex 型で確保してから、点リスト算出。 "D3DDevice.DrawPrimitive" で描画。 QD.D3DDevice.DrawPrimitive( D3DPT_LINELIST, Integer(D3DFVF_VERTEX) , @GridV , GridNum*GridNum*2 , 0); ( GridV は点リストで D3DVertex 型の配列である) 無事にグリッド表示。 ………してはいるが、何故かグリッドがイルカと共にグリングリンと回転+上下運動しているのである、これがまた。 普段3D酔いしない私でも、眺めているとさすがにメマイがする。 どーやら、「 Quadruple 」で用意されたメソッドと "D3DDevice.DrawPrimitive" を併用すると、描く先が混乱する模様。 よくは解らぬ。 色々と試した結果、「動き回るイルカのフレーム」の後に「固定された空(から)のフレーム」をレンダリングすれば、グリッドも固定されるよーになったのである。 グリッド一つで、えらくつまずいたものである。 とほほ。 グリッド上を、イルカ君が丸ーく泳ぎ回る。 この後、 Ship の旦那の指摘により、X軸ローテイトによる首振り運動を追加して、それらしい泳ぎ方に。 (何故か "SetOrientation" を使ってY軸ローテイト&X軸ローテイトを行うとメッシュが歪んで異次元生物のよーになってしまうが…。原因不明。) ほわ〜、と、イルカ君が泳いでいる。 なごむなあ。 ◆ 「イルカくるくる・迷走編」 さてお次は、 「イルカ君たちが、旋回しながら目的の座標 (x,y,z) を目指す」 動きである。 もっとスマートな方法があるやもしれぬが、とりあえず、 「現在向いている角度と目的地への角度を、徐々に近付ける」 とゆー手段を取る。 ちと強引な手法だが、イルカ君の座標 ( x0 , z0 ) から、目的地 ( x1 , z1 ) への角度をアークタンジェント( arctan2 )にて算出。 目的地への角度との差を埋めるようにして、現在向いている角度を少しずつ加減算。 そして向いている方向へ「前進」してゆけば、ゆったりとイルカ君たちは目的地へと向かってゆく。 ………ハズであった。 十頭ものイルカ君たちが、同じ所を高速回転している……。 そう、加減算する角度が大きすぎたのである。 とゆーわけで、旋回できる角度の限界を設定してから、実行。 ハイ、イルカ君たちが目的地へ向かって、泳いでゆきます。 ……………あれ? 何頭かが目的地から背を向けて海の彼方へ泳ぎ去ってゆく…。 何度か目的地を通ったイルカ君は、何処かへ泳ぎ去ってゆく…。 目的地の近くを通っているのにそちらに向かわないイルカ君もいる…。 いやー、イルカ君たちは気まぐれだなー。 はっはっはっ。 などと言っている場合ではない。 算出している数値の洗い出しである。 イルカ君がおかしな動きを見せた時点で、プログラムを一時停止。 イルカ君用変数を一個一個参照&検算である。 気付くのに、ちと時間は掛かったが、原因は単純。 イルカ君の方向や目的地への方向はX軸を0として、θ=−π〜π( -180度 〜 +180 度)としているのであるが、マイナス方向とプラス方向の循環とゆーか転換が上手くいってなかったのである。 例えば、イルカ君の方向が 170 度で、目的地への方向が -170 度であった時、 +20 度の方向(ちょっと左方向)へ旋回せず、 -340 度(大きく右方向)旋回しようとしていたのである。 バカらしい……。 うーん、とグリッドを見つめて思案橋。 これまた無理矢理な方法だが、イルカ君の方向と目的地への方向の差が 180 度以上の場合、目的地への方向に 360 度を加減算することに。 (例えば、イルカ君の方向が 170 度で、目的地への方向が -170 度であった場合、 目的地への方向は 190 度と見なす) …無理矢理な方法だが、単純ではある。 細かい間違いを潰しつつ、ソースに2〜3行追加。 実行。 イルカ君たちは、目標へ向かってくるくると泳ぎ始める。 う、うれしいよ、俺は。 衝突判定してないから、時折イルカ君同士が合体するのは難点だが。 さー、次は衝突回避だー。 へろへろ ◆ 「いるか?」 これまた話だけでもナニなので、実行ファイルをアップロード。 興味のある方は、どーぞ。 ◆ 「爆転編」 Dolphin ver 0.03 ( "DolphinVer003.lzh" 230KB ) ◆ 「迷走編」 Dolphin ver 0.11 ( "DolphinVer011.lzh" 240KB ) ・ 左クリック・ドラッグで回転、右クリック・ドラッグで前進後退 ・ Direct-X7 以降、必須 ・ 未完成なのでハングするかもしれません。 御自身の責任でどーぞ。 |