− 「いつも通り」 −

2003年 どっちを向いても未来〜
 7月  6月  5月  4月  3月  2月  1月
2002年
 12月  11月  10月  9月  8月  7月  6月  5月  4月  3月  2月  1月
2001年
 12月  11月  10月  9月  8月  7月  6月  5月  4月  3月  2月  1月
2000年
 12月  11月  10月  9月  8月  7月  6月  5月  4月  3月  2月  1月
1999年
 12月  11月  10月  9月  8月

◆ TOP INDEX へもどる



■  6月22日 (日)

◆ 「イルカくるくる」

 先日、突然に「 3D でイルカ!」と思い立ち、 Direct-3D を使ったイルカが泳ぎ回るプログラムを書き始める。
 いや、 Direct-X SDK に付いてくる「イルカが泳ぎ回る」サンプル "Dolphin.exe" を見ていたら、ムショーに「泳ぐイルカ」が作りたくなったもので。

 ちなみに開発環境は、 Delphi 5 + Quadruple 2.00 + Direct-X7 SDK
 「 Quadruple 」は、 Delphi で Direct-X を「簡単に使う」ライブラリで、 Direct-3D IM (直接モード)の補助関数が豊富なのである。

 "Dolphin.exe" のソース "Dolphin.cpp" を見ると、 Direct-3D IM 用の機能豊富なライブラリ "d3dframe" や "d3dfile" を使ってシンプルに書いてある。
 「 .X ファイル」形式であるイルカの 3D モデリングデータを "d3dfile" ライブラリを使って読み込み、 "d3dframe" ライブラリを使って簡単にシーンやメッシュの設定をしているのである。

 つらつらと眺めていたら、「かの『 Quadruple 』を使えば Delphi でも "Dolphin.exe" のよーなものが出来るのでは……?」、と考えが浮かぶ。
 思い立ったが吉日、と、まずは 3D イルカを表示するプログラムを書いてみることにしたのである。
 これが、どツボの始まりとは気付かずに。 (笑)


 まずは、イルカの 3D モデル "Dolphin.x" ( .X ファイル形式)を、「 Quadruple 」用の .SX 形式のデータに変換である。
 Quadruple 付属のツール「 SX-Simplify 」を使って .SX 形式に変換……
 ……できない。
 幾つかの frame に分けられたメッシュデータを含む .X ファイルを読み込めないよーである。
 ここで、 Direct-X7 SDK のヘルプを読んで .X ファイル・フォーマットのお勉強。
 そう簡単には、うまくいかないものである。

 改めて、データ "Dolphin.x" (テキストファイル)の中身を見ると、……コレ、ちょっとフォーマットはずれてませんカ?
 頂点データなどはそのまま使えるので、エディタでカリカリと書き直し。
 も一度「 SX-Simplify 」を使って変換。
 無事に .SX 形式のイルカ・モデルが出来たのである。

 一応 .SX 形式データのビューアで、表示できるか確認。
 …………………何も写りませんが。

 他の .X ファイルを .SX ファイルに変換すると、ビューアで表示される。
 イルカ・モデルだけ表示されず。
 うーん、頂点データはしっかり読み込まれているのだが。

 写らないイルカ・モデルをグリグリと回転させてみると、はじっこにチラリとポリゴンの影……。
 さては、 と、ビューアのカメラを思いっきり引いて見ると、超巨大なイルカ・モデルが。(笑)
 そう、実はイルカ・モデルが大きかった為に、カメラはイルカの中に入ってしまっていたのである。
 元のプログラム "Dophin.cpp" を見ると、イルカ・モデルを読み込んだ後に "too big.." な為、 1/100 にスケール・ダウンしておりましたとさ。

 とりあえず、イルカの 3D モデリングデータは、確保成功である。


 お次は、イルカ・データにテクスチャの貼り付け。
 眼と模様が貼られただけで、なかなかカワイイ。
 しかし、テクスチャ・データのドットが引き延ばされて、ちょっとカクカクした柄になってしまったのである。
 ここは、
SetTextureStageState(0, D3DTSS_MAGFILTER, Integer(D3DTFG_LINEAR));
SetTextureStageState(0, D3DTSS_MINFILTER, Integer(D3DTFG_LINEAR));
 と、「テクスチャが拡大されるときリニアに拡大縮小( 2x2 pixel 補間)」する設定にして、イルカ君の柄をなめらかに。 (縮小補間はいらんかったか)


 お次は、シーンの設定である。
 海の中だからライト(光源)と反射光を、青みがけて設定。
 うんうん、海中のようになってきたぞ。
 影の部分が暗すぎるので、アンビエント(環境光)を設定………するも変わらず。
 色々やってみたが、環境光は変わらないのである。
 しょーがないので、光源の方向を変えて影が目立たないようにする。
 根本的な解決になっておらぬが。

 お次は、フォグ(霧)の設定。 物が遠くへゆくと霞む効果を出すのである。
 海中なので、遠くへゆくと蒼く霞んで消えてゆく…、とゆー設定。
 遠くのオブジェクトをレンダリングしなくてもいいので、一石二鳥である。
 しかし! はた、と、フォグの範囲を設定する段階で、困る。
 フォグの範囲を指定する数値は浮動小数点( float )であるが、 SetRenderState に受け渡すパラメータは「 DWORD 型である float 変数のアドレス」でなくてはならぬのである。
 C であれば、 "*(( DWORD * ) ( &fFogStart ))" などと簡単に書けるのだが(簡単でもないか)、 PASCAL (Delphi) ではそーもいかない。
 うう、 PASCAL の限界か。

 ここで、「 Quadruple 」の作者 SANDMAN さんが作ったサンプル、「 LandScape 」を発見。 ありがたくソースを拝見。
 このソースでは、インライン・アセンブラを使用してキャストしていた。 ( move( Single , Result , 4 ); ) これまたありがたく使わせていただく。

 フォグを設定して、イルカ君を遠くにやると、 おお、海の向こうへ霞んでゆくようである。
 とりあえず、フォグ効果は成功。


 お次は! イルカの泳ぐアニメーションである。
 元ソースの "Dolphin.cpp" を読むと、イルカの泳ぐ様子は、頂点データと法線データをいじって変形させているよーである。
 ならば簡単! ………と、思ったが甘かった。

 ソースをよく読むと、3種類のイルカ「尾を下げているイルカ」「尾が真っ直ぐのイルカ」「尾を上げているイルカ」の 3D モデルデータを読み込み、3種類のデータをブレンド(頂点の座標を混ぜ合わせる)しているのである。
 そして、その3種類イルカ・データ "Dolphin_group.x" は、1つのファイルで「3つのフレームを含んだ『バイナリ・データ』」………。 (泣)
 手持ちのツールでは、 .SX 形式のデータに変換するのは無理である。
 何とか3匹のイルカ君を切り出す方法は無いものか…。

 Delphi で "d3dframe" を使う方法なぞを延々と検索。 (ロシアで Delphi 用の "d3dframe" を発表しているサイト発見したりする。)
 ここで、 Direct-X8 SDK 付属のイルカ・サンプルは、全イルカ・データがテキスト形式の .X ファイルであることを発見。
 手元にあった Direct-X8 SDK のイルカ・サンプルだけを、抜き出す。
 ハイ、ここで何故 Direct-X8 SDK に替えなかったかは、つっこまないよーに。

 「尾を下げているイルカ」「尾が真っ直ぐのイルカ」「尾を上げているイルカ」の .X ファイルが個別に手に入ったので、ちょちょっと書き換え、ツールで .SX 形式ファイルに変換。
 3つのポーズのイルカ・データが、見事に表示できたのである。

 あとは、これらのイルカ・データと、デフォルトのイルカ・データの頂点 (x,y,z) と法線 (nx,ny,nz) をブレンドして尾を上げ下げすれば一段落………せず。 (泣)
 頂点・法線をブレンドすると、でろーんと、イルカの形が崩れて「この世にいないよーな生物」になってしまうのである。 これでは UMA である。

 データを見ると、同じイルカでも、 Direct-X7 SDK 付属のイルカ・データと、 Direct-X8 SDK 付属のイルカ・データは、頂点のデータがまったく異なる。
 = 故に、ブレンドすると崩れるのである。

 しょーがないので、頂点のデータが同じ(とゆーか関連のある) Direct-X8 SDK 付属イルカ・データをデフォルトのデータにする。
 すると、ブレンドは成功。 イルカ君は、尾を上げ下げするのである。

 が、何故かテクスチャが張り込まれず、のっぺらぼうのイルカ君。
 Direct-X8 SDK 付属イルカ・データを見ると、テクスチャ用の座標データ ( tu , tv ) が無い。
 何とかテクスチャをラップするよう張り込もうとしたが、その度に「この世にはいないクトゥルーの眷属」のよーな生物が出来上がるのである。

 ここで、ちょいと行き詰まる。

 Direct-X8 SDK 付属イルカ・データを使えば、イルカ君の尾の上げ下げは上手く行く。 だけど、テクスチャがうまく貼れない。
 元の Direct-X7 SDK 付属イルカ・データを使えば、今まで通りに表示されるが、訳判らぬ "Dolphin_Group.x" を読み込まねば尾の上げ下げは出来ない。

 ちょいとしばらく思案して、 "Dolphin_Group.x" から頂点データ「だけ」を切り出すことに決定。

 Direct-X7 SDK のヘルプを読んで、バイナリの .X ファイルのフォーマットをお勉強。  Delphi で "Dolphin_Group.x" から、頂点データを切り出すツールを作り始める。
 (ここから、手段と目的が入れ替わっております。)
 Delphi におけるバイナリ・ファイルの扱いと、4バイトのバイナリから浮動小数点値に変換する方法に手間取りつつも、ペキペキとツール製作。
 "Dolphin_Group.x" 内の頂点データの位置は、頂点数 285 ( $11D ) がカギである。 (バイナリデータで "1D 01 00 00" )
 頂点データの先頭と思われるアドレスにシークして読み込み、浮動小数点に変換して、 ( x , y , z ) と表示させると……。

 ビンゴ!
 元イルカ・データから変形されたと思われる、3種類のイルカデータを切り出すことに成功。 (これだけ眺めていると、もう座標値で判るわい)

 そして、切り出したデータを .SX 形式のファイルに変換。
 元のイルカ・データとブレンドすると……。
 見事にイルカ君が尾を上げ下げするようになったのである。
 う、うれしい……。
 と、ゆーか、表示するだけでこれだけ苦労する私もアレである。


 さて、尾の上げ下げは、Application の OnIdle イベント内で行っていたのであるが( Timer では不正確故)、当然ながら速いPCではイルカ君がピチピチと「ハトヤのCM」状態。
 システム・タイマーを参照( QueryPerformanceCounter )して同期をとり、ゆったりと尾を上げ下げ。

 イルカ君がまったりと動いているのを見て、一段落。
 あとは、自由に泳がせたいトコロである。


◆ 「イルカくるくる・ファイル」

 話だけではナニなので、とりあえず、データとコンパイルしたファイルを「らいぶらり」にアップロード。
 興味のある方は、どーぞ。
  ◆ 「 Delphi Dolphin 」の DownLoad

 ★ 注意
  ・ 左クリック・ドラッグで回転、右クリック・ドラッグで拡大縮小
  ・ Direct-X7 以降、必須
  ・ 未完成なのでハングするかもしれません。 御自身の責任でどーぞ。


◆ 「謝辞」

 「 Quadruple 」とサンプルを制作した SANDMAN 氏に深く感謝いたします。

  ◆ 「 Electrical Fireworks 」 →




■  6月15日 (日)

◆ 「歴史 RTS 『クニのはじまり』」

 以前よりチェックを入れていたブライアン・レイノルズの歴史 RTS
  「 RISE OF NATIONS 」 の体験版を、今さらながらプレイ。
 お、面白れーぞ、これは。

 古代から現代までの進化を、短時間かつマルチプレイで行うとゆーことで、大味になるのではないかと懸念を抱いていたが、思い過ごしだったようである。
 「都市を中心」にした内政と戦闘、「知識」が資源の1つであること、が上手にミックスされて「国の発展」が RTS としてまとまっている。
 見事である。

 さらに気付いたことであるが、自ユニットのAIが「比較的」かしこく、「あまり」無駄な操作をすることが無いのである。
 例えば、「市民」をしばらくほっぽらかしておくと、勝手に仕事を見つけて作業をしたり、以前にやっていた作業へ戻ったりするのだ。 (今まで出来なかったのが不思議かもしれない)

 とはいえ展開がスピーディーで、しばらく RTS から離れていた私にとっては、ちとツラいものがある。
 などと言いつつ、何度目かのプレイ。

 大理石や宝石などの希少資源を押さえつつ、河川を利用して「自然の要塞」を気取り、順調に都市を増やす。
 近代へ移行したところで、COMの攻撃をかいくぐり前線付近に飛行場を建設。 最新の戦車・歩兵と共にCOM都市へ進軍。 爆撃と歩兵部隊の侵攻がうまくハマり、COM都市を次々と陥落。(電撃戦やね〜)
 勝利条件の「領土70%」まであと少し。
 COM首都に迫るも守りは堅く、なかなか落ちず。 苦戦している間に、COMは「不思議」を次々と建設して、勝利目前でCOMに「不思議の建設による勝利」をかっさらわれる。 (そんな勝利条件、知らなかったぜ…。)

 くっそー。


◆ 「『 RISE OF NATIONS 』は Direct-X9 が…」

 さて、この「 RISE OF NATIONS (体験版)」であるが、
  「 Direct-X9 必須」
 とゆーことで、インストールをためらっていたのである。
 ウチのPCのビデオカードやサウンドカードは新しいものではなく、さらには Direct-X9 を入れることによって不具合の出るゲームもある故。

 ちなみにウチのシステムは、
  Pentium III 850MHz / Canopus SPECTRA-5400 R2 (RIVA-TNT2) … & Direct-X 8.1a
 である。

 しかし、ブライアン・レイノルズが開発時のインタビューで「 Direct-X8 環境で開発している」と言っていたことを、ふと思い出す。
 まー、ダメで元々と、ウチのシステムにインストール。

 しっかり動きました。
 ……と、思っていたら、途中でハング
 たはー、やっぱり無理あるかなー。 などと思いつつ付属の Read Me ファイルを読んでいたら、トラブルシューティングの項に「商人を作ったときにハングする場合」が。 ハイ、見事に「市場」で「商人」を作っておりました。
 希少資源からボーナスを獲得するのに必須の「商人」を作れないのは辛いので、原因究明。

 「そーゆー時はビデオ・ドライバーを更新せよ」とのことだったので、 Canopus のサイトから「 Green Driver Ver.3.23 」をダウンロードしてインストール。
 それが効果アリか判らぬが、その後、プレイ中にハングすることはなくなったのである。

 とゆーわけで。
 ビデオドライバを更新すれば、 Direct-X8 環境でも「 RISE OF NATIONS 」をプレイすることは可能のようである。
 (お試しになる場合、御自身の責任で行っていただきたい。)


◆ 「夕陽のドリフト」

 ビデオドライバを更新した、ウチのシステムであるが。
  「 Colin McRae Rally 2.0 」
 をプレイすると、グラフなど半透明になる部分が赤みがかる症状が発生。
 (αブレンドにおいてRのパラメータがまったく無視されているような…)

 「気にしない」とは思ったが、走っていると頭に浮かぶのは小林旭の歌声「燃える男の〜赤いトラクタ〜」
 仕方がないので、ビデオドライバーを「 Green Driver Ver.2.33 」に入れ直してみる。 (最新のドライバにするまでは「 Ver.2.32 」だった)

 これで「 Colin McRae Rally 2.0 」は、正常に動作。
 「 RISE OF NATIONS 」はハングする……かと思ったら正常動作。

 ………よくわからぬが、めでたしめでたし、とゆーことで。
 どなたかの参考になれば幸い。



■  6月 9日 (月)

◆ 「名作映画」

 なんと。
 あの名作映画、「穴 ( LE TROU ) 」が DVD 化されているではないかかかっ!!!
 間髪入れずに購入である。

・ 「穴 ( LE TROU ) 」
  (1960 年/フランス 監督&脚本:ジャック・ベッケル)
 殺人未遂の容疑をかけられサンテ刑務所へ投獄された青年ガスパールは、脱走兵や政治犯など一癖も二癖もある者がいる監房へ移送される。
 しかし、長期の刑が確定している彼らは脱獄を計画していた。 新参者であるガスパールも仲間に加え、脱獄計画が始まる。
 最低限の物しかない身の回りの品を使い、計画は着々と進められて行く…。


 派手なアクションもなく、雰囲気を盛り上げるような音楽も無い。
 が、道具に使える日用品を加工する冷静さ、静けさの中で響くコンクリートを打つ音、ベッタリと流れる汗、息を殺す暗闇の中、……淡々と進む計画の中、全員の緊迫感が迫ってくる。
 まるで自分が脱獄に参加しているようである。

 この映画、ずいぶん以前に深夜のTV映画で観たのだが、口惜しいことにビデオには後半部分しか録画せず。
 レーザーディスクなり発売されるであろうと思っていたが、何とその頃、セルビデオまでもが絶版に……。

 昨今、昔の映画が復刻されてきたのだが、ネットで『映画』『穴』と検索しても出てくるのは「マルコヴィッチの穴」と「パンツの穴」(笑)くらい。

 もう諦めていた時に、今回デジタルニューマスター版で復刻である。
 いやはや、また鑑賞できるとは、本当に嬉しい。

 改めて観た「穴」は、やはり静かな緊迫感ただよう名作であった。


◆ 「ゲーム製作備忘録」

 このところ、ソートルーチンが派手に思えるくらいの「地味〜」なトコロを書いていたのである。

 データは今のところ、 CSV 形式で書いたテキストファイルを CommaText で読み込ませて、楽々と「改変→読込」させているのであるが、各種パラメータの相互関係を整理するのにしばし地味な作業が続いたのである。
 いわゆる、拡張性も考えたシナリオ&ユニット各種データのフォーマットと、ソレの読み込み部分。

 例えば、1プレイヤーは何人もの「キャラクター」を持っているので「キャラクター」を参照し、「キャラクター」には「クラス(職種)」があるのでそのデータを参照し、「クラス」には「特殊スキル」があるのでさらにはまたそのデータを参照し、そして「特殊スキル」は……、とゆー風に延々と続く。
 後々追加はあろうが、やっとこさ、互いの関連を整理し終わってデータ・フォーマットを仮決定したのである。
 (慣れた方には当たり前の話でありましょうが)

 地味な作業だった為、一時、アンチエイリアスをかけた Image を表示する Draw ルーチンを書いて逃避。 Photoshop でマスク画像も作って。
 えーと えーと えーと
 アドベンチャーゲームが出来ちゃうぞ、このままじゃ。 (大嘘)




◆ TOP INDEX へもどる