[かみやんのたわごとへ戻る]


counter

CourseEdit 0.00

 昨日は、名古屋の矢田川花火大会に行ってきた。今日は、名古屋でショッピング。

 某所に頼まれて、ゲームのコースエディタを作るはめになった。ノーギャラ。というわけで、せっかくなのでフリーソフトとして公開しよう。まだ、まったくできていないけど。

 毎週、休日に5時間づつぐらいかけて、1ヶ月。20時間、最小コストで作る予定〜

 こんな感じ。

ce000.gif (11266 バイト)

 めずらしく、OpenGLで書いてみた。理由は、VGA画面ではDirect3Dは使えないから。G400を買ったのでもう関係ないけど。

Ferguson曲線

 コースは、Ferguson(ファーガソン)曲線を使うことにした。Bezier(ベジェ)曲線でもNURBSでもいいのだが、BezierやNURBSでは通過点を編集できるようにするには、リアルタイムで方程式を解かなければならないから。そのコードを書くのが面倒だったから。

 Ferguson曲線の式は、「NURBS早わかり」という前の会社アルモニコスの先輩が執筆した本を参考にした(ISBN4-7693-5082-1)。

Ferguson曲線の定義は

   P(t) = H00(t) Q0 + H01(t) Q1 + H10(t) Q0' + H11(t) Q1'

だ。ここのH00(t)〜H11(t)というのは、Hermite(エルミート)関数と呼ばれる関数。Q0、Q1は、始点と終点。Q0'とQ1'は、始点と終点の接線ベクトル。tの範囲は、0〜1。太字はベクトル。

Hermite関数の定義は

   H00(t) = 2t3 - 3t2 + 1
   H01(t) = -2t3 + 3t2
   H10(t) = t3 - 2t2 + t
   H11(t) = t3 - t2

だ(P187-188参照)。が、なぜか終点の向きが逆だったのでH11(t) = t3 - t2をH11(t) = -t3 + t2に修正して誤魔化した。

(注:のちほど、アルモニコスの高柳さんからメールをいただき、Fergusonの終点の接線ベクトルは、CourseEditの接線ベクトルと逆であることを教えていただきました。ありがとうございます。)

はまったこと

 普通、この手のソフトの場合、View変換はOrtho(平行投影)を使うのだが、なぜかうまくカメラがコントロールできずにまったく表示できなかったので、Perspective(透視図)を使った。Perspectiveを使うと、マウスをクリックしたときのスクリーン座標系の点からオブジェクトの当たり判定のところがOrthoに比べて大変なのでやりたくなかったのだが、Orthoが全然うまくいかないので、無理やり解いた。あと、普通Pserspectiveを使うとビューの平行移動でマウスの移動量とカメラの移動量をピッタリ合わせるのが難しいが、Ortho風に見せるために、これも無理やり解いた。そんなこんなで3時間ぐらいフイにした。ぐた。

(注:のちほど、エリジオンの宮野さんからメールをいただき、glOrtho()でのパラメータ値を教えていただきました。ありがとうございます。宮野さんはわざわざソースをビルドしていただいたようで感謝、感謝です。ちなみに、俺はglOrtho(-100,-100,100,100)みたいに設定していた。が、正しくは、glOrtho(-100,100,-100,100)みたいな感じだった。がーん。つまり、俺はCRect構造体のごとく引数の順番は、left,top,right,bottomだと思っていた。正しくはleft,right,top,bottomなのね。あー、ヘルプもちらっと見たのだが。。。教訓:リファレンスマニュアルはよく読もう!)

Download

   ce000.lzh(ソース付き40kbyte)

 最小エネルギーで開発しているので、コーディング自体は非常に少ない。 書いたのはCourseEditView.cpp の下の方と、Course.hぐらいか。10kbyteぐらい。vector.hはProjectDPから拝借。OpenGLの初期化はMFCのサンプルのCUBEを拝借。

 

今日の買い物:
書籍「出井信之のCEO学」
書籍「ケータイのホームページをつくりたい!」


[かみやんのたわごとへ戻る]