
2002-02-01
この数ヶ月というもの,現実から斜め45度横方向に目をそらしつつ,気付かないふりで自らを欺き耐え忍んできたのだけど,もうさすがに我慢の限界に来たようだ。ついに禁断のリファクタリングに手を出してしまう。
とは言っても,数千行のファイル1つを再構築しようってだけの話なんで,それほど大変な作業でもない。ただ,コードの再構築ってのはゲームの内容にはほとんど影響が出ない作業なんで,既にプロジェクトが作り込みの段階に入っている状態で行うには,少し覚悟が必要かもしれない。
みんなゲームとしての作り込み作業に一生懸命なのに,そういったことにまったく関係無い作業をいまさら始めるって,ゲームプログラマ的にどうよ,ってことにならざるを得ないのだ……ってのは,ちょっと肝っ玉小さ過ぎるかなあ。
とにかく,このまま放っておけば最終調整段階でままならないことになって苦労しそうな気配がすることは確か。最終的なクオリティを上げるためにも必要な作業なんじゃよ,と自らを説得しつつ,作業に突入する。
で,中規模ながらもしたたかに絡まってしまったコード塊を小さなパーツ群に分解しつつ,いちおう個々のモジュールを隠蔽する機構を追加していくんだけど,するとそのうちに,山のような数のアクセスメソッドを追加しながら虚ろにキーボードを叩き続ける自分の姿に気付く。だめだこりゃ。
こんなヘタれたアクセスメソッドを書き連ねるぐらいだったら,いさぎよく hoge_t をエクスポートしろコラー! って感じなんだけど,僕はチキンなのでいちいちこういう余計なコードを追加しては,インストラクションキャッシュをぐしゃぐしゃにして実行速度を重くしてしまう。だいいち,このコードは hoge_t が val という内部値を持っていることを何ら隠蔽していないわけで,せいぜいアクセス制限を追加する機会を得たってぐらいのこと。本当に必要なの?
しかし,僕は基本的にヘッダに構造体の定義を書かないスタイルをとっているので,こういう単純なブリッジの役割をする関数はいやがおうにも増えてしまう。 C++ で書くときも,
って感じで, private な部分はヘッダに書かないことを徹底してるんだけど,これもやはりコード量が飛躍的に増大するんで,書いてる途中でげんなりしてしまう。ていうか,21世紀にもなってヘッダファイルなんて機構がまかり通ってる事の方がおかしいんじゃないか,っておもうことしきり,なんだけど。
2002-02-02
GJK についてはとりあえず保留にしといて(凸物体に特化した衝突判定が必要になったときにまた思い出そう……),ヒエラルキー構造化方面の技術の調査に針路を補正しようとおもう。そんなわけで,ます手始めに SOLID のページに置いてある "Efficient Collision Detection of..." をプリントアウト。 AABB Tree を使ったヒエラルキー構造化について述べられた論文だ。
http://www.win.tue.nl/~gino/solid/
AABB は Axis Aligned Bounding Box の略で,各軸に垂直な面のみを扱う Bounding Box のこと。この手の Bounding Volume 構造のなかでは OBB (Oriented Bounding Box) が最も効率が良いとされているんだけど,件の論文では,そこをなんとか AABB でも頑張れないかねえ,ってことについて思案している。
OBB は自由に回転可能な Bounding Box のこと。1つの OBB を扱うには,回転に 3x3 行列 (float*9) と,原点からの移動量に float*3 ,それと各軸の幅に float*3 で,全部で float*15 つまり 64 byte ぐらいを消費することになる。回転に正規化クオータニオン (float*3) を使うことも可能かもしれないけど,処理の高速化の都合上,実行時には行列で保持せざるを得ないとおもう。
通常,ヒエラルキー構造化ってのは,各葉ノードに単一のポリゴンが格納されるように構成される。すると,アクションゲームの地形モデルの当たりのように,数千,あるいは万程度のポリゴンから構成されるモデルをヒエラルキー構造化するとなると,ひとつひとつのノードにおける消費メモリ量っていうのは,全体に対して意外とばかにならない影響を及ぼすことになるのだ。
そういった観点からみた場合, AABB なら float*6 だけで表現できるために, OBB よりも有利になれる面がある。件の論文の趣旨は主にそこにあるようだ。
いちおう, AABB は交差判定処理が OBB よりも軽いというメリットがあるので,ヒエラルキーを辿る段階においては OBB よりも高速に処理することができる。しかし, AABB は OBB よりもフィット率が低いので,実際には交差していないポリゴンまで多く列挙されてしまい,ポリゴンとの交差判定の段階においては OBB よりも重くなってしまう。処理量の比率としては, BV 交差判定よりもポリゴン交差判定の方が重い傾向にあるので,総合すると AABB の方が重くなってしまうのではないか,というのが一般的な評価だ。件の論文には実際に両者の処理時間を比較した結果が挙げられているのだけど,結局のところ AABB の方が確実に重いということになってしまっている。
しかし,前述した容量の問題はやはり無視できないものだ。そういった理由から実際に AABB を採用しているケースは多いようで,例の SOLID も, Pierre Terdiman 氏の高速衝突判定ライブラリ "OPCODE" もヒエラルキー構造化には AABB を採用している。特に OPCODE のページにある RAPID (OBB ベースのライブラリ)との比較記事は興味深いもので,特定の条件においては RAPID を大きく上回る性能を弾き出していることがわかる。
http://www.codercorner.com/OpcodeDemo.htm
いつの時代もコンシューマゲームマシンってのは狭いメモリに苦労するものだから,ここいらの見極めにはひときわ慎重にならなければいけないかもしれない。
2002-02-03
今日は夕方出動。まだ再構築作業が終わってないもんね。
せっかく XML を使うんだったら,それをドキュメントとして表示する方法も覚えておこうか,ってわけで, XSLT について調べてみることにした。
http://www.asahi-net.or.jp/~ps8a-okzk/xml/
XML 文書に対してスタイルシートを付加するための手段として提案されているのが XSL ("Extensible Stylesheet Language") だ。しかし,この仕様がなかなか固まらないものだから,その前にとりあえずの代替手段を用意しとこうか,ってことで策定されたのが XSLT らしい。 XSLT は XSL のうち XML のツリー構造を変換する機構だけを抜き出したもので,この機構によって XML を XHTML へと変換することが可能となる。
スタイルシートって言うぐらいだから, CSS みたいなもんなのかなあ,とかおもっていたんだけど,実際のところは "Language" って名前に付いているぐらいで,よほどプログラミング言語に近い機能を持っているようだ。
"Studying XML" の解説はすごく丁寧に系統立てられているものだから,道程をあまりにも長く感じてしまうのだけど,お気楽に使うならばそれほど難しいものでもなくて,基本的にはパターン置換みたいなノリでなんとかできてしまう感じ。それを awk みたいな感覚って表現したら,ちょっとおおざっぱ過ぎてしまうだろうか。
http://www-6.ibm.com/jp/developerworks/xml/010914/j_x-xslt.h...
しかし,プログラミング言語と呼ぶには少しまどろっこしいものだなあ,とおもう。 XML を使ってスクリプト言語をデザインしたらこういう感じになるんだろうなあ,って,ある種の悪夢を見ているような印象の。
ところで, X3D っていう,いわば VRML を XML にしたような規格が存在するんだけど(まだ策定中だっけな), XSLT でもって XML を X3D に変換するような感じにすれば, XML 文書を 3D 視覚化することなんかが可能になるわけですな……。
そんな感じで, XML を使った無茶な野望はどんどん広がっていく。実際そんなにうまくいくはずはなくて,いろんな所に落とし穴は待ち受けている。たぶん,予想を上回る巨大なデータを要求された瞬間とかに一気に破綻が生じて,痛い思いをすることになるんだよな,とかなんとか。その臨界点を冷静に見極められるようになればいいんだけど。
2002-02-04
なにげに slashdot.jp を閲覧していると, nanoloop という GameBoy 用のシーケンサソフトのことが話題に登っていた。
http://slashdot.jp/article.pl?sid=02/02/03/0921225
下手な懐古趣味を発揮しては痛い目ばかりを見ている僕としては,こういった話題には慎重にならざるを得ないはずなんだけど,ちょっと試しにサンプルを聴いてみると,これがなかなか面白い音を出しているなあと感じる。ううぅ,これは意外といけるのかも。
GB の音源は基本的に PSG で構成されているんだけど,この "nanoloop" ではソフトウェアによる擬似 FM 変調を実現している模様。 PSG 3音のうち1音をソフトウェア音源として割り当てているようだ。
マニュアルを読んでみるんだけど,シーケンサの操作方法が独特っぽくてよくわからない。狭い画面と限られた操作方法で最適なインタフェースを実現するためか,ちょっと特殊な作りになっているようだ。エミュレータ用のサンプル ROM が置いてあるので,実際に試してみるのが最もわかりやすいのかもしれない。
んで,実際に試してみたんだけど,やっぱりいいかもなあ,これ。エミュレータではいまいち音の再現性に問題があるみたいなので(これはエミュレータの性能次第だとはおもうけど),実物に触れてみたい。なにより, GB で動くっていう所から生ずる優れた携帯性とおもちゃ感覚が重要なんであって……とか言ってるとまたきっと呆れられてしまうので,ひとりでこっそり楽しむのが吉かとおもった。
"chiptune" って呼ぶとなんかかっこよすぎるし,それを免罪符にして懐古趣味に浸っている気がして微妙な感じなんだけど,とにかくそういうのが流行る気配を見せているようだ。
それで,最近もっとも感動したのが, VORC で紹介されていた Virt 氏の "fx EP" 。
http://www.mono211.com/content/releases/mtkmp60.html
ファミコン時代のコナミ全盛期の頃(一昨年こそがコナミの全盛期だったのかもしれないけど,多くのファンにとってのそれは紛れもなく MSX - ファミコン時代のことだ)のテイストをそのまま持ってきたような楽曲群。「悪魔城ドラキュラ」のバロック調ロックとでも言うべきエッセンスを凝縮した類稀なる傑作,ってとこ。 VORC の Hally 氏の言葉を引用するなら,
まさにその通りだとおもう。しかし,果たしてそれが何の意味を持つのか,ってとこは,僕にはとうてい理解のできないことかもしれない。
だから,僕は僕で,単に懐古趣味で楽しんでいるだけ,ってことにしておこうとおもう。
2002-02-05
えーと,ナムコの野球ゲームより,スクリーンショット。
http://www.watch.impress.co.jp/game/docs/20020129/namco0a.ht...
むーう,アスペクト比が狂ってる。画像のサイズを見てみると,横 512 ピクセルで,縦 448 ピクセルだ。まあたぶん,そういうフレームバッファの構成を使用しているんだろうけど,そのままスクリーンショットをダンプしてしまうと,ディスプレイを通した出力とは明らかに異なる画面比率になってしまう。 NTSC の画面比率は 4:3 だから,それにフィットするように伸ばすか縮めるかしなければならないのだけど。
まあ,こんな感じで, PS2 を横解像度 512 ピクセルとして使用しているゲームは,最近特に多くなってきているようだ。 MGS2 もその設定だし,バーチャ4に至っては 512 x 244 インターレスという,超節約設定に走っている模様。うーん,ただでさえインターレスでフリッカーしまくるってのに,横も粗くしたら縦方向のエッジまでジャギーを起こしてしまうだろうに……。たぶん,悪名高い PS2 の VRAM の狭さに恐れをなして極限設計を追求してしまったのだろうけど,それにしてもはやり過ぎてしまったものだなあ,とおもう。
ついでに,いろいろとスクリーンショットを観察してみたりする。
http://www.watch.impress.co.jp/game/docs/20020201/namco20.ht...
http://www.watch.impress.co.jp/game/docs/20020201/namco21.ht...
ソウルキャリバー2の画像。剣の軌跡エフェクトなんだけど,モーションの単純なトレースにしては滑らか過ぎるかもなあと,なんとなくおもった。スプラインで内挿とかはもちろんしているんだろうけど,それにしても「線」がうまく出ているなあ,と。実際のモーションはもうちょっと波のある動きをしているはずなので,なんかしらの平滑化処理によって粗立ちのない曲線に変換しているのかもしれない。してないかもしれないけど。
ところで,職場のデザイナのひとが言っていたのだけど,床のモデリングにかなり気合入ってるような気がする。この微妙な起伏に足が追従したりするのかなあ。うーむ。やりかねん。
http://www.watch.impress.co.jp/game/docs/20020202/ds09.htm
「ダブル・スティール」の戦車。こんだけ違和感無くセルフシャドウが落とせたらいいなあ,っていう感想。フレアやデフォーカスの雰囲気も,このスクリーンショットが最もバランス取れているとおもう。
PS2 の登場以来,ゲーム機でも Z バッファとフレームバッファの再利用ができるようになって,それらを応用したデフォーカス・エフェクトなんかがにわかに流行ったりしたものだけど,個人的には,それとわかるほどデフォーカスをかけるのはちょっとどうかなあ,とおもうことがある。
普通,3Dゲームってわりと広角なカメラ設定を使用するのだけど,実際にそれくらい広角なレンズ設定にすると被写界深度はかなり深くなるはずなので,下手にデフォーカスをかけるのは逆効果ではないかとおもうのだ。
「僕と魔王」なんかの場合は,逆にそれがいい効果を出していたとおもう。あれってたぶん,被写界深度を異様に浅くしたことにより,人形劇で使われるような接写レンズのテイストを表現できた,ってノリなんじゃないかとおもってみたりするんだけど……ちょっとこじつけっぽい気もする。
えーと,マイナーゲームなんだけど,「フェイズ・パラドックス」のように,遠景と近景を明示的に切り分けて,遠景にのみデフォーカスを適用する,ってのは,処理的にも演出的にも納得行くところかもしれない,って,ちょっとおもっている。
2002-02-06
"Efficient Collision Detection of..." から, AABB にもそれなりのメリットがあることが伝わってきたんだけど,とりあえず次は OBB について調べてみたいとおもっている。 OBB については受け売り程度の知識しかないので,まずはその実像を把握しておく必要があるのだ,とかかっこつけてみたり。
http://www.cs.unc.edu/~geom/OBB/OBBT.html
OBB と言えば RAPID ライブラリ。ちなみに, RAPID は "Robust and Accurate Polygon Interference Detection" の略。うまいこと考えたもんだね。んで,これに付属の論文 "OBB-Tree: A Hierarchical Structure for..." をダウンロード。この論文の他にも衝突判定関連などでいくつかの功績を残している Gottschalk 氏は,現在 NVIDIA 社に勤務しているようだ。ふむ……。
この論文では,厳密な証明などはほとんどすっ飛ばしてあって,高速な実装方法の解説と,その結果の分析に終始している。その中でも特に肝となっているのが,ポリゴン群から "tight-fitting" な OBB を生成する手法の説明と,高速な OBB の重なり判定法の解説。重なり判定の方では "separating axis" 法の存在がその核となっているのだけど,これの説明はまんまごっそりと省略されてしまっている。応用範囲の広そうなネタだから,後に文献をあたってみるのがいいかもしれない。
ついでに,直線対 OBB の交差判定も気になったので,これも別途に調べてみた。これについては,マイバイブルこと "Real-Time Rendering" の p299 に掲載されている。立方体を, "slab" と呼ばれる平行な平面組の交差領域ととらえ,その交点位置のパラメータの min-max から重なりを判定できる,ってネタ。軽くトリッキーな感覚だ。よかよか。
ちなみに,各種交差判定については Real-Time Rendering のウェブに置いてあるこの表がとても便利だ。
http://www.realtimerendering.com/int/
文献へのリンクも充実。書籍の RTR もそうなんだけど,幅広く情報を把握し,それらを上手い具合にまとめ上げている所がすごいなあとおもう。
2002-02-07
今月号の CG World を買ったのに,全然読んでないことに今ごろ気が付いた。わりと面白そうな記事が多かったので買ったのだけど,真面目に読む時間がなかなか無い。今月号はレンダラ特集なので,そういえば BMRT とか全然いじってないなあ,なんてことをおもいだしたりしながら,やっぱり読まない日々が続くのであった。
倉地氏のコラムにある流体シムのネタが,難しそうだけどちょっと面白そうだ。そういえば, MGS2 の後半の方のイベントに,建物内に流れ込む激流をパーティクルで表現しているイベントがあったような気がするんだけど,そこまでもう一度行くのが,とてもじゃないけどめんどくさくて,いまだに確認していない。ああいう激流系の水流だったら,単純なパーティクルでも数を出せばそれっぽい雰囲気を出せるのかもしれない。静的な水面をパーティクルで処理するには,パーティクル間の相互影響とか陰関数曲面展開とかせにゃならんだろうとおもう。どれも重い処理ばかりだ。局所的なものならなんとかなるかもしれないけど……。
最近,衝突判定関連のサイトを無思慮に嗅ぎ回っているんだけど,その過程で辿り着いたページのうち,重要とおもわれるものをメモしておこうとおもった。
ノースカロライナ大の調査グループ "gamma" のページ。 CG 関連技術のわりと全般的な研究を行っているみたいなんだけど,衝突判定関連の研究がダントツで充実しているようだ。 "RAPID" (OBB) や "PQP" (Swept-Sphere) などの著名なライブラリを産出している。
下の2つの論文は,衝突判定処理に関する大域的なレポート。方針を固めるにはいい資料だとおもう。
ftp://ftp.cs.unc.edu/pub/users/manocha/PAPERS/COLLISION/cms....
ftp://ftp.cs.unc.edu/pub/users/manocha/PAPERS/COLLISION/wafr...
http://www.stanford.edu/~jgao/collision-detection.html
スタンフォード大の Jie Gao 氏の,各種衝突判定アルゴリズムに関するオーバービューのページ。リンクの量が尋常でない感じ。出発点として優れたページかもしれない。
2002-02-08
昔から人のソースコードを見るのは比較的好きで,良さげなプログラムがソース付きで置いてあるのを見つけては,改造するとか移植するとかそういう目的を持って読解するでもなしに,ただ覗いて喜んだりとかする行為を繰り返している。
文書としての情報が不足している場合なんかには,生きているコードこそが最良の資料としてはたらくこともあるとおもうんだけど,まあたいていの場合はそういった意図も何もないわけで,単純に覗き趣味を発揮しているだけですなあ,とおもった。
元祖3D自由軸回転ゲーとして有名な "DESCENT" のソースコード。 "DESCENT 2" も有り。
"DESCENT" は,3Dの無重力空間を自由に動き回るシューティングゲームだ。宇宙モノだったらそういうのも珍しくはないんだけど,このゲームは主に建物の中を踏破するのが目的で,しかも上下感覚を意図的に狂わせるような構造のステージデザインがなされているものだから,操作している本人でさえも簡単に酔ってしまうような,ある意味最凶と言うべきゲームだった。
こういうゲームを平気で,むしろ楽しみながらプレイするんだから,欧米人はすごいよなあ,とかおもったものだけど,よく考えれば向こうの人も DOOM 酔いとかするんだから,やっぱりなんていうか,昏迷期にありがちな無茶ゲーだったってことなのかなあ,とおもう。
んで,肝心のソースの方は,アセンブラでゴリゴリ書いてある部分とかが比較的多くて,そういう技術に感心のある人にとっては,参考になることも多いんじゃないかとおもう。当時は何かと "DOOM" が取りざたされることが多かったんだけど, DOOM とその同胞たちがいわゆる "2.5-D" 表現でひいひい言ってたような時期に,自由な視点移動で,しかもパースコレクト付きのテクスチャマッピングとか実現していたんだから,技術レベルとしては相当高いものだったのだろう。
486 や Pentium は,昨今の 86 系 CPU における歪んだ実装よりも,高速化の手順がずっと単純で明快だった。だから,この頃のアセンブラコードってのは,ある種の最高水準を迎えていたのだとおもう。
http://abuse2.com/downloads.php3
crack.com の "Abuse" 。シェアウェア時代を香りを今に伝えるソフト。この頃のPCゲーはやたらとシェアウェアによる販売が流行っていたんだけど,その流行もある時期を境に急に廃れてしまったような気がする。まあ,シェアウェアが流行っていたのは,流通手段を持たないような小規模なソフトハウス群が市場のメインストリームを担っていたってところに起因するものだろうから,それが廃れたってことは,市場として成熟されたことを示しているのかもしれない。
ゲーム内容は,なんていうか,テクザーから自動照準と飛行形態変形を取り払って,かわりに銃火器をやたら増やしたようなノリのゲーム。2Dアクションなんだけど,マウスで自由に狙いを付けれるのが独特。いまいち独特過ぎて何とも言えない雰囲気だったけど,慣れれば楽しいようだ。
ところで,これのソースはほとんど何も読んでいない。そういうのもたまにはあるよなあ。これは一種の収集癖なんだから。
2002-02-09
ftp://ftp.idsoftware.com/idstuff/source/q1source.zip
id software の "Quake" のソース。 Quake には "Quake C" っていう独自のスクリプト言語のインタプリタが搭載されていて,プログラム本体に改変を加えること無しにかなり広範囲のモディファイが可能となっている。それじゃあなんでソースを公開したのかと言えば,メインプログラマー John Carmack の単なる趣味。
こんぐらい有名なゲームなら,例えばモバイルマシンへの移植とか,アンソロジー・シリーズとか,そういうのであと何回か稼げそうなもんなんだけど,それをコミュニティへのネタ提供っていういまいち弱い理由によって公開しちゃうんだから,凄いなあとおもう。ちなみに,ゲームデータの方はいまだ配布禁止なので,ゲーム自体の商品価値を放棄したわけじゃないんだけどね。
最近になって "Quake 2" のソースコードも公開された。
ftp://ftp.idsoftware.com/idstuff/source/quake2.zip
Quake 2 では Quake C は廃止され,ゲームエンジンを DLL に閉じ込めた上でメイン部分のソースを公開することにより,技術的な部分は隠蔽しつつゲームとしてのモディファイを可能にする,という手法がとられている。
"Quake" シリーズは,ゲームサーバ(キャラの挙動等を担当)とゲームクライアント(表示・入力系を担当)を完全に分離した形で実装する,いわゆる「クライアント・サーバ」方式を実現している。ネットワーク対戦への対応を本格的に考慮した上での設計だ。まあそんなわけで,ネットゲーのシステムを設計する場合にも,参考になることがあるのかもなあ,とおもった。
あと,なにげにツールのソースなんかも全部公開されている。 BSP Tree の処理なんかは,ランタイムよりもむしろ前処理の方が重要だから,こちらも参考になる部分は多いとおもう。実際にこのツールを使ってあまたのマップが作成されている,って実績が重要なところだ。
ftp://ftp.idsoftware.com/idstuff/source/q1tools_gpl.tgz
ちなみに, Quake のマップエディタのオリジナルは, NeXT Station 用に組まれていた。 NeXT なので,当然 Objective C 。熱いなあ。
id software とソースコードと言えば, Quake とか Quake 2 なんだけど,それ以前のゲームのソースコードも公開されている。
ftp://ftp.idsoftware.com/idstuff/source/wolfsrc.zip
これは, FPS の元祖 "Wolfenstein 3D" のソースコード。ゲームとしては年代ものだけど,ソースコードをいじるにはちょうどいいくらいの量なんじゃないかとおもう。たぶん, sourceforge あたりで検索すれば, gcc か VC++ 用に修正されたソースが見つかるだろうから,本気で改造するならばそちらを当たった方がいいかもしれない。
ftp://ftp.idsoftware.com/idstuff/source/doomsrc.zip
こちらは,かの有名な "DOOM" のソースコード。その昔は,このソースコードも無しに,人力解析と人力パッチによる改造をやりだす熱い人がいらっしゃったもんだけど,最近はそんな苦労も無しに改造しまくれるんだから,有り難い世の中になったものですなあ,とおもった。
2002-02-10
http://unreal.epicgames.com/Downloads.htm
Unreal の「隠蔽された」ソースコード。ゲームエンジンは DLL に閉じ込めて,外枠のソースコードのみを公開することによって MOD を可能にするっていう,いわゆる Quake 2 方式。ここで面白いのが, Unreal シリーズはフルに C++ で書かれているってとこ。中大規模なゲームの「生きた」 C++ コードを部分的ながらも垣間見ることができるということは,それなりに重要な意味を持っているとおもう。少なくとも, C++ がぜんぜんダメな僕にとっては。
Unreal のコードを覗いていてちょっと面白かったのが,例外の使いかた。例外をゲームプログラミングにおいて使用することの是非,ってところだけで十分に議論に値するという側面もあるんだけど,とりあえずそれは置いておいて, Unreal の場合はこんな感じってこと。
こういうマクロを定義しておいて,
といった感じで,各所の重要な関数を括るように仕掛けてある。で,この "guard" と "unguard" で括った中で例外が発生すると, appUnwindf 関数がグローバルなスタックに自分の関数名を順に追加していく。これは,要するにスタックバックトレースを実現しているわけだ。それで,トップレベルに到達するまで誰にも捕捉されないと,トップレベルに設置されたトラップがダイアログにデバッグ表示を行い,アプリケーションを停止する,ってわけ。
そもそもデバッガを使えば済む問題だし,どうせ VC++ 限定なんだったら,専用の特殊な API によってスタックを解析するという技もある。だから,こういうちょっと面倒な機構を用意するのもどうかとおもうんだけど,ちょっとしたテクニックとしては面白いかもしれない。ちなみに,製品版をプレイしていてもこのデバッグダイアログが表示されることがあるんだけど,ユーザーにデバッグさせるかこの,って感じの。もう。
あと Unreal は,どうやらオブジェクトのシリアライザ/デシリアライザを真面目に組んでいるような気配がある。「ゲームの保存=オブジェクトの永続化」っていう思想をまともに実現しているようだ。詳しく調べたわけじゃないので,だいぶ憶測なんだけど。
2002-02-11
最近,職場の床で寝袋に包まって寝ていると,さすがに寒さを感じるようになってきた。シリコンとカソード管が連続的に放出する熱のおかげで365日空調は冷房設定であるところの伝説を築き上げたこのフロアも, ISO なんちゃらの影響でだいぶ節電癖が身に付いてきたようだ。まったく,ゲーム会社が ISO14001 なんぞ取得して何が楽しいんだか。でも,その方向性は悪くないとおもうから,まあ,捨てたもんじゃないってこと。
この連休で,だいぶマックと松屋に貢献してしまったような気がする。だから今日はヴィ・ド・フランスにしておこう。職場のひとに教えてもらったんだけど,これはフランス語で「フランスの生活」の意味。質素ながらもエキゾチックなデザインの給仕服に身を包んだ彼(女)らの心の中は,きっとフレンチでエスプリなオーラが宿っているのだろう。だけど,その身から発せられるお決まりの掛け声は,どう聞いても近所の八百屋のおばさんとかが発するそれと同系列のものであって……えーと,つまり,もうちょっと静かに商売した方がいいんじゃないかな,って,僕はおもったわけ。
ひょんなことから,職場の kzm 氏から "GB X-Changer" を頂いた。うひょ,こりゃすげえ。
とは言っても,これ,何に使ったらいいんだろう。 WonderWitch でさえ1週間で飽きてしまった僕にとって, Z80 の壁はもっと分厚いものであろうに。 "Flash Advance Linker" だったら喉から手が出るほど欲しいんだけどね。
せっかく頂いたのに何にも使わないんでは悪い気がしたので,とりあえず開発環境について調べてみることにした。
http://isweb7.infoseek.co.jp/computer/code-gb/
はー, GBDK さえ入れれば C も使えるんですか。てっきり Z80 をガリガリ書くもんだとおもってたんだけど,便利なもんだな。ていうか,実のところ正式な Z80 でもないことが判明した。要らない部分を徹底的に排除したサブセット版って感じかなあ。 I/O ポートを I/O 命令経由じゃなくてメモリマップト I/O で操作するってのも,いかにも任天堂的で面白いとおもう。
んで,よくよく調べてみると, GB のサウンド機能に対する僕の認識が間違っていたことに気が付いた。
http://www.geocities.co.jp/Playtown/2004/gmbspecj.txt
実は4音とも異なる機能を持っているんだな。ていうか,スイープと任意波形を持ってるんだから,もはや PSG ですらないんだけど。んで, nanoloop のソフトシンセ部分は任意波形のチャネルを使っているわけか。
2002-02-12
GB について調べたついでに,ファミコンについてもちょっと調べてみることにした。というのも, kzm 氏と,そういえばファミコンって末期には FM 音源とか積んじゃってましたよねー,とかいう話になったときに,その詳細についておもい出そうとしてもおもい出せなかったのが,今でも気になってしょうがないのだ。別に知っていたところでどうなるって知識でもないし,すごく下らないことなのだけど,このまま知らないで済ませるのも,それはそれでとても気持ちの悪いことだとおもった。
とりあえず,資料はここらへん
http://www.classicgaming.com/EPR/nintendo.htm
なんだけど,いまいち詳細に欠けていて頼りない。しょうがないので,あとはエミュレータのソースを参考にしてみることにした。
しかし,こういったエミュレータを書くひとたちは,みんなどうやって元の資料を手に入れるのだろう。あるとこにはあるってことなんだろうか。
ファミコンの音源を担当するのは "APU" (Audio Processing Unit) と呼ばれるユニットだ。アナログ音源を4音と, DPCM のデジタイズ音源を1音持っている。アナログ音源の構成は,デューティー比の変更可能な矩形波を2音と,波形固定の三角波を1音と,ノイズ1音。 APU という名前は付いているものの,実際には IC は存在しないため(CPUチップ内部に組み込まれている),一般に "pAPU" (pseudo-APU) と呼称されるそうだ。
矩形波信号のデューティー比というのは,パルスの HI 区間と LO 区間の比率を表すもので,この比率が偏るほど高周波成分を多く含む信号になる。デューティー比 50% がいわゆる普通の矩形波で,これはやや温かみのあるソリッドな音となる。 MSX とかの PSG でもお馴染みの音だ。で,これのデューティー比を操作して偏りを加えていくと,いかにもファミコンっぽいクリスピーな音に変化する。ちなみに三角波の方はサイン波に近い特性を持っていて,重みのある目立たない音が特徴だ。ファミコンでは主としてベースラインに使用されることが多かったようだ。
pAPU に積まれているデジタイズ音源は 1bit DPCM ,つまり差分方式のサンプリング音源で,各サンプルは 1bit (+1 or -1) の幅しかない。これでは,どう頑張ってもくぐもったノイズ混じりの音しか表現できない。これとは別に, 8bit サンプルデータをリアルタイムにレジスタに書き込む "RAW mode" もあるんだけれど,これは CPU を完全に食い潰してしまうために,ごく特定の用途にしか使うことができなかった。
そういった音質上の問題もあるし,極めて狭いメモリ空間の制約もあったんだとおもうけど,とにかくそんなわけで,初期から中盤にかけてのタイトルにおいては, DPCM が日の目を見ることはあまりなかったようだ。燃えプロの「ペボー」とか,そんなんばっかやね。
これが,ファミコン後期の手馴れたタイトルになってくると,音源として実に効果的に使用してきている。「バットマン」とか「マザー」とか,パーカッション系の音がなかなか良かったんで,当時の僕は,これは特殊な音源を積んでいるんだなあ,とかおもい込んでいたのだけど,あれは実は標準音源だけで構成されているんだってことを,今更になって悟ることになったわけで。
2002-02-13
基本構成についてはだいたいわかってきたので,次は特殊音源について調べてみた。
まず調べたのは,僕の最もお気に入りであるところのサンソフト「ギミック!」。このソフトでは "FME7" と呼ばれるチップを使用していたようだ。この "FME7" に格納されている音源は,矩形波/三角波/ノコギリ波/ノイズの4種類の波形が選択可能なエンベロープ付きのアナログ音源で,3音まで同時に発声することができる。
当時の状況からしてみれば,これだけでもわりと強力な存在なんだけど,「ギミック!」の BGM を決定的に特徴付けていたのは,なんと言っても DPCM によるゴワゴワしたベースラインだった。すごくくぐもった音の荒々しいベース音なんだけど,ファミコンらしからぬパワフルな表現がとても新鮮だった。 1bit DPCM でも,ベースぐらいならなんとかできる,って見切ったのが,白眉だったんだなあ,とおもう。
事の発端となった「ファミコンで FM 音源」なんだけど,これはコナミの RPG 「ラグランジュ・ポイント」のカートリッジに積まれていた "VCR7" のことだ。これは音源的に見るとヤマハの "YM2413" ,つまり一般に "OPLL" と呼ばれていた FM 音源チップと同性能のもののようだ。
http://www.dj.il24.net/~markun2/ma-net/sndgen/japanese/ym241...
YM2413 は MSX 用の拡張カートリッジ "FMPAC" に積まれていたことでも有名なチップ。単音では2オペレータ FM シンセシスによる安っぽい音ながらも,同発で9音まで鳴らせられるために,それなりに厚みのある和音が表現できる音源だった。ちなみに,ファミコンソフトに VCR7 が積まれたのは,後にも先にも「ラグランジュ・ポイント」だけだった模様。時はまさにバブル経済のまっただ中だったわけだし,いろいろ無茶した結果として生まれたあだ花的存在だったのかもしれない。
ちなみに VCR7 の祖先となる "VCR6" は, "MA.DA.RA" や「悪魔城伝説」など,比較的多くのソフトに積まれたチップだ。当時は,どこかの噂で SCC 音源と同等らしいとか聞いた気がするんだけど,実際には「矩形波x2+三角波」という,それほど強力でもない音源だったらしい。ふむ……。
ついでに調べてみたんだけど, "SCC" はコナミの MSX 向けソフトで数多く採用された音源で,32ステップの任意波形を5音まで同時に発声することのできる音源だ。 TTL 回路で構成されているらしいんで,いちおうデジタルシンセってことになるのかな。
2002-02-14
もういい加減ゴールは近いはずなのだけど,そういう気配があまり感じられないのはなぜなのだろう,とかぼんやりおもいながら,ぽちぽちと作業。また1つ峠が近づいてきたのだけど,まだ残りは多いのだから,ならべく無傷で切り抜けたいところだ。
「ソウルリーバー2」をプレイしてみた。オリジナルは半年ぐらい前に出ていたような気がする。
http://www2.eidos.co.jp/sr2/main.html
以前よりスクリーンショットなんかで見かけていた通り,背景はかなり美しい。 PS2 にしてはリッチにテクスチャを使用しているところが男前だ。歪んだ精神世界の表現がなかなかいいとおもう。
その,背景の出来の良さとは対照的なんだけど,キャラクタのアニメーションについてはだいぶヌルい所があるようだ。カットシーンのキャラクタアニメーションはモーションキャプチャでやって欲しかったなあ。キャラの挙動や操作性についても,ちょっとつっかかる所がある感じ。でもまあ,元は PC ゲーなんだし……とか考えてしまうと,案外許せてしまう気がするから,不思議だ。
まあ,総じて雰囲気はいいゲームだとおもう。暇があったらやっていたのかもしれないけど,全然暇じゃないのでパス。
John Carmack の .plan ファイルを閲覧。
http://www.bluesnews.com/cgi-bin/finger.pl?id=1&time=2002021...
永遠のワナビー君であるところの僕としては, JC の .plan が更新されたとあればチェックしないわけにはいくまい,なのだ。ところで,いまどき finger とか真面目に使ってるのって,このひとたちぐらいじゃないんかとおもうんだけど。
で,内容は要するに GeForce4 や READEON 8500 はなかなか良い,ってことなんだけど,僕にはずいぶん縁の遠い話だなあ,とおもった。6枚マルチテクスチャとか,とりあえず死ぬまでに一度ぐらいはやってみたいもんですな,って感じで。
あと,なにげに気になったんだけど,本文中に "an NVIDIA" って表現が出てくる。 "a NVIDIA" じゃないってことは,やっぱり「エヌビディア」って読んでるってことなんだろうとおもう。「ヌビディア」じゃないのかしら。かなりどうでもいいけど……。
やはり GeForce 4 MX にはダメ押しが出されたので, GeForce 3 系のシュリンク版が出るのを待つことにしたい。
2002-02-15

遥かドイツより nanoloop 到着。 65 ユーロ也。
エアクッション付きの安っぽい封筒の中には,薄いペラペラの説明書と,それにセロテープで貼り付けられた青い透明なカバーのカートリッジが入っていただけだった。カートリッジ自体は, small フォントで "nanoloop" と書かれたステッカーが貼り付けてあるだけの,極めて質素な外装。
さっそく借り物の GameBoy Pocket に挿し込んで電源を入れてみる。うーん,なんか画面がやたら薄いなあ。それでもまあ,いちおう正常に動いているようだ。試しに他のソフトを動かしてみると普通に表示されたから, nanoloop だけが薄くなる何らかの理由があるらしい。
とりあえずそこらへんに置いてあった各種ゲームボーイに手当たり次第ぶっ挿して試してみたんだけど, GBA 以外はどれも似たり寄ったりな結果が得られた。最もまともだったのは GBA で,画面は薄くならないし, TFT 液晶だから画質は格段にいい。音質についても,少なくとも pocket よりかは太い音が出ているようだ。ヘッドフォンを繋ぐと微妙なハム音が聴こえてくるような気がするんだけど,うんん,気にしない気にしない。
透明なプラスチックのカバーを透かして中の基板を覗いてみると, ATMEL の AT49B が使われていることがわかる。 ATMEL 社のウェブで調べてみたところ,これはフラッシュメモリの製品であるらしい。
http://www.atmel.com/atmel/products/prod108.htm
どうやら nanoloop は,マスク ROM による工場生産ではなくて,フラッシュカートリッジを媒体とした家庭内手工業による生産のようだ。まあ,生産量から言ってそういう手段を使わざるを得ないんだろうけど,やけに値段が張る理由の一端はそこにあるのだろう。
全然関係無いんだけど,なんかいろいろ探していて,その過程でこんなのを発見。
http://piza.2ch.net/log2/game/kako/944/944554048.html
http://www.geocities.co.jp/Playtown-Denei/2257/sample/thexde...
テグザー,シルフィード,懐かしいなあ。ちょっと前に遠藤雅伸氏が2ちゃんに降臨したときは,僕よりもちょっと上の世代のひとたちが一斉に色めき立っちゃって,いやあそんなに嬉しいのかねえ,とか,ちょっと他人事っぽく静観していたんだけど,テクザーやらシルフィードってのはまさに僕の原体験そのものなんであって,今度は僕のほうが興奮してしまうことになってしまった(このスレッド自体はだいぶ昔のものなんだけどね)。なるほど, "Major Havoc" がモチーフだったのか……。
最近ちょっとノスタルジーに浸りすぎのような気がする。ああ,不毛だ不毛だ。でも,シルフィードとか見てたら, FM 音源の CSM 音声合成とかってどういう原理なんだったんだかって,かなり気になってきた。
「ザカリテ」の喋りなんかを聴けばわかるように, CSM 音声合成ってば音質はそれほど良くなかったんだけど,必要リソース量が低いというメリットがあったために使われていたようだ。それこそ擬似 1bit PCM とかの方が音質では優れているとおもうんだけど,顕著な CPU 負荷がかかるってとこで,当時はあまり用いられなかったのではないかとおもう。
2002-02-16
flipcode より,面白そうな話題とか。
http://www.avault.com/articles/getarticle.asp?name=educate
ワシントン大学の CSE (Computer Science and Engineering) 科で来年度より「ゲーム開発」と題された修了課程が始まるそうだ。この課程は,ゲーム開発に必要とされるプログラミングの技術や数学の教養,アプリケーションについての知識などについて1年間かけて習得するというもの。発端はシエラ・オンライン社のリードエンジニア Vassily Filippov 氏の働きかけによるもので,授業には氏をはじめとした業界を代表するエンジニアたちが登場するとのことだ。
最新のコンピュータ・サイエンスにおける1つのアスペクトとしてゲームを引用するケースは数多くあっても,大学が「ゲーム開発」と真っ向打って取り組む試みは今回が初めてだろうとおもう。ゲームプログラマに対して必要とされる技術の水準ってのは年々上がってきているわけで,それに見合う人物を探すのは難しくなってきている,とは Filippov 氏の意見。それに大学側もゲーム市場というものを,一過性の現象ではなく,それなりに確立された分野として認識し始めているってことなのかなあ,とかおもった。
いつか spin でも取り上げられていた "Typhoon" エンジンの最新画像。
http://www.flipcode.com/cgi-bin/msg.cgi?showThread=02-13-200...
個人的に注目したいのが Horizon Mapping による影の生成部分。かなりいい雰囲気が出てるんではないかなあ,とおもう。ランドスケープのようにベースとなる平面が均一である場合, Horizon Mapping はかなり使える手段になる,っていうか,すごく扱いやすくなるんだよね。
でもまあ正直なところ,こういうランドスケープがそのまま使えるケースってのはそう多くないとおもう。フライトものとか,ストラテジーとかで使えることもあるかとおもうけど,それさえも全てに対して適用できるというわけではないし。
でもまあ,一度やってみたいなあ,ランドスケープで Horizon Mapping とか。
2002-02-17
結局借り物の GB Pocket じゃあ満足できなくて,半ば衝動的に GBA を購入してしまった。セットで使うための耳掛けヘッドフォンも入手,ついでにヨドバシのゴールドポイントカードも作ったし,なんかやたら達成感の得られる買い物をしたような気がする。実際には,言うほど金使ってないんだけど。
とりあえず GBA を使ってみて最初に気付いたのは, GB のカートリッジがやたら出っ張るってこと。いや噂には聞いていたんだけど,まさかこんなに出っ張るものだとは。この出っ張りのせいで微妙にポケットにも入れにくいし,ほんと,どうにかならないものだろうかって感じなんだけども。
電車の中での使用はほぼ問題無し。ただ,地下鉄ではかなり騒音に苦しめられる。普段は気付かなかったんだけど,地下鉄ってこんなにもうるさいものだったんだなあ,って,なにげにおもった。
nanoloop 自体に関しては,なかなか好感触。インタフェースはかなりとっつき良くないのだけれども,なんていうか,ビンテージっぽいテイストの,いかにもステップシーケンサって感じの雰囲気は悪くないとおもう。トラッカーのようないかにも表計算っぽいインタフェースと比べるならば,個人的にはこちらの方が好みだ。
ソフトウェアによる「擬似 FM 」は,あくまでも「擬似」なんで,実際には FM とは似て非なるものだ。どっちかって言うと LFO に近い。ぴょろぴょろした音が出て面白いんだけど,音程を付けて使うのとかはもはや不可能だろうとおもう。あと "R" こと矩形波チャネルが,いまいち使い所に困る感じがする。せめて2チャネル独立で操作できたほうがいいんじゃないかとおもうんだけど,そこは nanoloop の哲学ってとこなのかもしれない。
そんなわけで GBA に足を突っ込み気味の最近。 GBA デモとかも話題になっていることだし,無茶して FA-linker とか買ってみるのもいいかもしれない……って本気でおもうくらい冷静さを失いつつある自分がどうにも。
http://www.lik-sang.com/catalog/product_info.php?category=51...
Flash Advance カートリッジに nanoloop を入れ換えれば,出っ張り問題も解決できるような気がしてきた。うーむ。
GBA デモでは Oxygen (Leonard) の "3D Trip" がお気に入り。
http://www.pouet.net/prod.php?which=1575
Triton の "Crystal Dream 2" あたりの時代の雰囲気を彷彿とさせるものがあるとおもう。光源計算無しのフラットポリだけど,なかなかスムースに動いている。ラスタライズは全部 CPU でやってるのかなあ。
同期信号割り込みで BG 操作とか,そういうゲーム機っぽいテクニックで面白いことをやると面白そうだなあ,とかおもうんだけど,こういうのにやたら萌えてしまうのはやはり持ち前の後ろ向き志向の表れなんだろうか。
2002-02-18
ひげねこさんの日記より,面白そうなネタ。
http://www.ecse.rpi.edu/Homepages/wrf/research/arcsin/index....
テイラー級数以外にも近似法はあるよってに,ってことで,ここでは arcsin を例にあげて理想的な近似式を追求してみている。こういった類の基本アルゴリズムについては,枯れているようで実は枯れ切れていないものが多いとおもう。十数年前の定説をそのまま引きずってるような部分があるから,現状に照らしなおして叩いてみると,たくさんホコリが出てきそうな気がする。
乱数とか暗号化,ソートとか圧縮とか,そういう基本的なアルゴリズムって,ちゃんと調べるのはめんどくさいし,そこそこまともに動くものが簡単に手に入るだけに,あまりよく考えもせずにそういうのを使っちゃうんだけど,たまに,どうにも煮え切らない感覚に陥ることがある。特に乱数については,それなりに理想的な手法が編み出されているとおもうんだけど。
くだんのページの作者は,他にも面白そうなコンテンツを揃えているようだ。
http://www.ecse.rpi.edu/Homepages/wrf/research/misc.html
いつかまとめて読んでみたいところ。
nanoloop が届いて以来,通勤中の読書時間が nanoloop に吸い取られてしまったので,いよいよ積ん読が増えてきそうな雰囲気だ。なんだかんだいって nanoloop は面白いし,視覚も聴覚も持っていかれてしまうもんだから,おもわず駅を降り損ねてしまうこともあったりして。うーむ。
音源関連を調べていたときの余韻で,なんとなくエミュレータ関連のサイトを巡っていたんだけど,そのときに見つけた面白そうなページ。
なんと,デジカメに MAME と DOOM を移植してしまったというもの。デジカメってそういう使いかたもあるのか……。
ちょっと読んでみると, "Digita OS" という Flash Point 社が供給しているデジカメ用組み込み OS の上で動くアプリケーションとして作成されているとのこと。コダックの DC シリーズなど, Digita OS がバンドルされているデジカメで動くらしい。
しかしなんというか,本当に意味の無いハックなんだけど,その意味の無さが逆にとても素晴らしいなあ,とおもった。
2002-02-19
相変わらず地道に衝突判定に関する調査を続けている。あでも,実装には全然手を付けていないわけだから,単なる下調べっていうか,うんちくを貯めこんでるだけなんだけど。
とりあえず次に注目してみているのが SSV - Swept Sphere Volume をベースとした手法だ。ノースカロライナ大の team Gamma で制作されたライブラリ "PQP" (Proximity Query Package) などで使用されている。
http://www.cs.unc.edu/~geom/SSV/index.html
SSV ってのは,その名前が表しているように,球をスイープすることによって得られる形状のこと。例えば,球を線分をスイープした形状である "LSS" (Line Swept Sphere) は,線分から一定の距離内の領域を表し,いわゆる "Capped Cylinder" と呼ばれる形状と一致する。 PQP では LSS の他に PSS (Point Swept Sphere) や, RSS (Rectangle Swept Sphere) を SSV のバリエーションとして使用している。ちなみに PSS は単なる球のことだ。
PQP の関連論文では, SSV を使用することの利点として,「内容物にフィットしたボリュームを構築できること」,「判定が比較的高速であること」,「 SSV の使い分けによる柔軟性」などを挙げている。前者2つについては OBB に切迫する性能を持っているようだ。後者については,それをメリットとするにはいろいろ凝ったことをしなくちゃなんなそうなんで,あまり旨味としては感じられにくいかもしれない,とおもった。
個人的には SSV を使用する事自体に意義を見出すことができるとおもっている。 CG では ray 対 polytope の交差判定が,物理シムなんかでは polytope 対 polytope の衝突判定が重視されるようだけど,普通の日和ったジャンルのゲームのように比較的中途半端な分野においては, SSV 対 polytope の交差判定が重宝される傾向にあるとおもう。当たりの受け側(地形とか)はポリゴンで構成されていて,当たりの判定側(キャラとか)は SSV ,特に LSS や PSS なんかで近似してしまうわけ。
こういった場合に,ヒエラルキーや交差判定自体も SSV をベースとした仕組みで構成されていると,直交性に優れて軽量なライブラリを構築できそうな気がするのだ。
あくまでも希望的観測だけれども。
というわけで, PQP に付属の論文をざらっと流し読み。 SSV 同士の衝突判定は結局のところ,ベースとなるプリミティブ同士の距離の算出,っていう問題に終結される。 PQP ではこの距離の算出に Lin and Canny の方法を使用しているようだ。この "Lin and Canny" 法ってのは,空間を凸面体の外部ボロノイ領域で分割して場合分けすることによって,距離の算出を比較的単純な演算に集約させるって方法らしいんだけど……うーん,あのやたら長い thesis を読まなきゃならんのだろうか。
ftp://ftp.cs.unc.edu/pub/users/manocha/PAPERS/COLLISION/thes...
今の所,Lin and Canny 法について具体的に解説している資料は,僕の知りうる限りではこれだけ。しかしまあ, PQP で使用されているのはあくまでもこの手法の派生なので,あえて読まなくてもなんとかなりそうな気もする。ていうかなんとかしようよ。是非。
2002-02-20
というわけで Lin-Canny アルゴリズムなんだけど, PQP で使用しているのは rectangle 対 rectangle に特化したものなので, Lin-Canny 法自体をまともに勉強しておく必要はなさそうだ。
Lin-Canny 法は polytope の外部ボロノイ領域による分割をベースとしたアルゴリズムなんだけど,ボロノイ領域を利用した同様の手法には V-Clip 法というものがある。 Jie Gao 氏の解説によれば,それは Lin-Canny 法ほど複雑ではなく,しかも高速に衝突を検出できるものなのだそうだ。
http://www.merl.com/projects/vclip/
すごくおおざっぱに調べてみた感じでは, V-Clip 法はオブジェクトの交差を検出するためのアルゴリズムであって,オブジェクト間の最短距離を求めるものではないようだ。いちおう,今回僕が調べているのは,凸体もしくは三角形以下のプリミティブ同士における最短距離を求める手法について,ってとこなので, V-Clip 法はその趣旨には合ってないのかもしれない。
ただ,いくつかの文献では V-Clip 法を速度面では最も有望なアルゴリズムであると評価している。だから,ちょっと興味の湧くところではあるのだけれど。
こうしていくつかの衝突判定アルゴリズムに触れてみたんだけど,その結果わかったのは,やはり BSP Tree をベースとした衝突判定は,アルゴリズムの明快さという点では最も優れていたのかもしれないなあ,ということ。 BSP Tree では,究極的には「空間を平面によって二分する」という要素しか存在しないため,ストレートな実装ならば非常に簡単に実現できるという利点がある。
それならばなぜ BSP を使わないのかというと,実用面での致命的な欠点がいくつか存在するからだ。
すこし話がそれるのだけど, Gottschalk の "OBB Tree: A Hierarchical Structure for RapidInterface Detection" の序文には,次のような一節がある。リアルタイムアプリケーションで用いられるモデル表現の特徴について触れたものだ。
BSP を適用する際に最も問題となるのがこの点だ。一般的なモデラが吐き出したぐちゃぐちゃの「ポリゴン・スープ」から,矛盾のないソリッドな BSP Tree を生成するのは極めて困難なのは,多くのひとが指摘しているところだ(ついでに僕も指摘したことにしておこう)。 Stan Melax 氏はそれでも根性で乗り切るんだと言っているけど,それはひとえに彼のパワーあってのものだとおもう。
Quake シリーズなんかは, CSG オペレーションをベースとした独自のエディタを用意することにより「BSP 親和な」モデルを構築することを可能としてきた。しかしそれも曲面や起伏などの表現に対する要求によって破綻を迎えようとしている。 Carmack 氏は今まで使用してきた BSP / PVS の組み合わせをついに捨てるべきときが来たと判断しているようだ。
そんなわけで,汎用性をものにしたいならば,やはり「ポリゴン・スープ」と闘う道を選ぶしかないようだ。「中身のないモデル」で衝突判定するなんて気味が悪いとおもうけど,器用でありたいと願うのならばそうするしかないのだろうとおもう。
2002-02-21
最近は実装とか実験とかしてみる余裕が全然無くて,それだったらせめてもと,半ば執念でいろいろと読み物をあさってみている。ろくに理解もせずに読み捨てているのはどうかとおもうけど,それはともかく,次にターゲットにしているのは, Charles Bloom 氏が書き残した大量のテキスト群だ。
Charles Bloom 氏は Xbox の "Oddworld - Munch's Oddysee" のリードプログラマとして有名な人物。氏個人のウェブ "cbloom.com" で数多くのテキストやプログラムを公開しているほか, GDAlgorithm-ML などでも活発な論議を交わしている。ていうか,あまりにも活発なんで,ほんとうに仕事しているのかこのひとは……って感じもしないでもないんだけど。
とりあえずプリントアウトしてみたのは,影表現のあれこれに関して記されたテキスト。氏は昔から影の表現についていろいろと苦労しているようで,サイトにも数種類のテキストが残されている。
氏は基本的に,静的ライトマップ+動的シャドウマップをベースとした手法を支持しているようだ。他にも選択肢はいろいろと存在するものの,現実的な線で検討すると,この手法が最も無難であるとしている。
ちょっと面白かったのが,ライトマップとシャドウマップにおいて,影の部分はグラデーションを付けるべきではないとしている点。これはもしかしたら常識なのかもしれないけど,僕は,ライトマップといえば間接照明を意識してグラデーションをかけるのがあたり前だとおもっていたから,少し意外だった。
シャドウマップやステンシルシャドウを利用した影表現で最も問題になりやすいのが,オブジェクトの裏側にも影が浮き出てしまうという現象。これは,影の上に影を落とすと2重に暗くなる,という問題とも関連のあるもので,減算法の影表現ではよく生じる矛盾点のひとつだ。
cbloom 方式のライトマップでは,光の当たっていない部分は完全に黒としているので,その上に影を落としたとしてもさらに暗くなることはない。こうして輝度成分を乗じていった後に,ブラーを加えるなりアンビエントを加えるなりしてソフトな質感を与えればいい,としている。最後にアルベドを乗ずれば完成だ。
ただこのフローでは,複数の光源が影響している場合に矛盾が生じるとおもうんだけど,そこはどう対処するんだろう。まだ全然斜め読みなんで良くわかってない。自分でも考えてみなきゃ……。
とりあえずスクリーンショットを見てみるんだけど,うーん,いまいち参考にならない絵ばかりだなあ。ところで,日本語版は出ないんだろうか,これ。
http://www.xbox.com/oddworldmunchsoddysee/default.htm?cs_cat...
まあいずれは,光源毎にデプスシャドウを生成して,加算法でもってライティングとシャドウが同時に解決できるようになりました,とか,そういうノリになって欲しいものだけど,その日はまだだいぶ遠いようだ。とりあえずは DOOM III がどういった結末を迎えるのか,じっくりと見届けたい。
2002-02-22
今日は Xbox の発売日。忙しいからって誰も買ってこなかったらどうしよう,とか心配していたんだけど,約一名購入者がいらっしゃったので(ちなみに自腹),それを横から観察して楽しむことにした。
見た目のインパクトで言うと,やっぱ DOA3 だよねー,ってことになりそうなものだったんだけど,意外とそうでもなくて,むしろ僕が最も興奮したのは,セガの "JSRF" だった。
今作は前作と比較して,よりシミュレータ的な色が強められている気がする。シミュレータ的ってのは,別に挙動がリアルになったとかそういう意味ではなくて,ミッションをクリアするとかストーリーを進めるとかいった要素よりも,純粋に町中をインラインスケートで乗り回すという行為自体を楽しむゲームになってきているなあ,という意味で,シミュレータ的かなとおもったわけ。端的に言えば "Tony Hawk's Pro Skater" 的になった,ってことなんだけど。
僕は,どちらかと言えば,遊び手に対して高い自由度の与えられたゲームが好きなので, JSRF がこういった路線に傾いてきたのはむしろ大歓迎だった。逆に,中途半端に制限の加えられたゲームなんかは,ものすごく煩わしく感じることがある。「クレイジータクシー」なんかは,その典型的な例だ。
町の中を気ままにドライブしながら,時には乗客を乗っけたり,時にはクルマをボコボコに痛めつけてみたり,それだけで十分楽しいのに,なんで制限時間に縛られなきゃならないんだろう,って,プレイしながらずっとそんなことを考えていた。ビデオゲームとしてのフォーマットを尊重するあまりに,単純に本質的な部分で楽しませるという方向性で挑戦することを恐れてしまっているのかもしれない。すごく勝手な解釈だけどね。
まあとにかく,せめておまけでフリードライブでも付いていれば,それですべてが良かったのだけども。
そんなわけで,今最もプレイしたいゲームが GTA3 - "Grand Theft Auto 3" だ。
http://www5d.biglobe.ne.jp/~osgames/PS2/gta3.htm
北米だけで既にミリオンを達成しているタイトルなんだけど,日本向けにローカライズされるという話は一向に聞かない。内容が内容だけにビビってるんだろうか。うーむ。
JSRF に話を戻すと,えーと,背景の作り込みが圧倒的だなあ,とおもった。ここまで密度感のあるビジュアルを達成したゲームは,本作がはじめてなのではないだろうかとおもう。空が見えなくなるほどに建物やガジェットが画面を覆い尽くしているっていう感覚は,個人的には,とても新しい感動だとおもった。
唯一気に入らなかったのは,オブジェクトのリアクション。サンドバックを叩いてみたり,積みあげられた箱に突っ込んでみたりすると,それなりにリアクションが用意されているんだけど,いかにも素っ気ない動きばかりだ。物理挙動云々とまでは言わないから,せめてもうちょっと面白い動きがあればいいんだけどさ。
2002-02-23
cbloom.com の "Coding for Game Programmers" を通読。
http://www.cbloom.com/3d/techdocs/coding.txt
ゲームプログラミングとはどうあるべきか,ってことについて散文的に述べられたテキストだ。常識的な「お約束」事項の焼き直しになっている部分も多いけれど,業務実績のある氏が語ることによって生まれる言葉の重み,ってのが重要だとおもう。ていうかほら,ワナビーだし。
C++ に関して記述された部分については,純粋に参考になった。個人的に C++ を利用することによって生じる弊害に対して大きな恐怖心を持っているので,こういった実践的な話題にはとても興味がある。できれば C++ で絶対に失敗しない方法を身につけてから実戦に投入したいものだ(そんなものが存在するかどうかは定かではないけれど)。
いかにもゲームプログラマらしい意見だとおもう。しかし言っていることは至極もっとなこともかもしれない。特にテンプレートなんかは,内部でどんな動作がなされているのか把握していないと,最終的にとんでもない事態を引き起こすことになりそうな気がする。
そんなわけで,ミキタさんも推薦の "Effective C++" を読んでみようかとおもう。テンプレートについても知識を得ておきたいので "Effective STL" も必要かもしれない。大変だよう。
Kawachi 氏よりメールを頂いた。内容は,各種衝突判定アルゴリズムについて概略的な解説をされたもの。いやあ,有り難いのなんのって,専門家の方からコメントがもらえるとは。
そんなわけで,いつくか得る事もあって,やはり V-Clip の論文に一度は目を通してみようかとおもう。なかなか難しそうな内容だし, GJK のときのトラウマが残っているだけに腰が引けるんだけど,まあ,仕事ってわけでもないし,お気楽にね……。
2002-02-24
今日は久々にまともな休日。しかしすぐにまた忙しくなる予定なので,それに備えて髪を切っておくのだ,ばっさりと。それにしても今日はいい天気だ。こんな日には,多摩川の河川敷に出かけて昼寝でもきめこみたいものだね。実際には,あそこは休日には人で溢れかえっているんで,そんな事をする余裕も無いとおもうんだけど。
久しぶりにゲーセンに立ち寄って,「斑鳩」を初プレイ。イージーモードだったら僕でも楽しめるぐらいの難易度で,ちょっと安心した。属性変換を積極的に楽しませるような作りになっているのも好印象。これが,変化するのはスコアだけだったりすると,僕みたいなヘタレには辛かったとおもう。
演出やデザインが,なんだか知らないけどやたらかっこいい。そこも「レイディアントシルバーガン」の正統な継承であることを感じさせるところだ。白黒配色の都合でもあるのかもしれないけれど,全体的に透明感に溢れるビジュアル。それでいてソリッドな印象を与えるデザインが素晴らしいとおもう。ただ,各所に用意されている演出が,シューティングゲームとしての流れを中断するようなタイミングになってしまっているのは,ちょっとまずいことかもしれない。
帰りがけに,近くに新しくできた古本屋に立ち寄り,安彦良和の「虹色のトロツキー」を購入した。安彦良和の漫画は,安定した表現力と,淀みの無いストーリーテリングに魅力を感じる。いまいち落ち着き過ぎていて盛り上がりに欠けるとおもうところもあるけど,まあ,総じて水準の高い作品を出すひとだという印象がある。
ああ,そういえば,いまさらながら無性に「巨神ゴーグ」が見たくなったんだよなあ。 DVD 出ないかなあ。
http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=%8B%90%90_...
カノープスの開発室 "G.I.Works" のページ。
http://www.giworks.com/index.htm
技術的こだわりには定評のあるカノープスの開発室ともあって,なかなか職人気質なテキスト群を読むことができる。特に「液晶ディスプレイのデジタル接続の現状」はとても参考になった。
http://www.giworks.com/main/digitallcd/digitallcd.htm
デジタルにすりゃあいいってもんでもないんだよ,って話。 DVI 接続の方が当然品質が高くなるもんだという先入観があるんだけど,そう決め付けることもできないんだなあ。なるほど……。
2002-02-25

ダブルスティール発売記念ということで, ThumbDrive の中で放置状態のフレアエフェクト実験のあれこれについてまとまった結論を出そうかとおもっていたんだけど,気付いたら,いつのまにか GBA 開発キットの URL を Iria に突っ込んで並列ダウンロードしている真っ最中だった。
http://www.io.com/~fenix/devkitadv/download.html
http://www.geocities.co.jp/Playtown-Yoyo/2534/
資料は「すずめ愛好会」さんのものを使用。簡潔にまとめられており,初心者が手を出す分には最適な資料だとおもう。
http://float.jp/cafe/agb/index.html
次に ARM についての前知識を得ておこうとおもい, ARM のホームページを捜索。組み込み用途で有名な ARM アーキテクチャなんだけど, GBA で使われているのは "ARM7TDMI" のようだ。
http://www.arm.com/armtech/ARM7_Thumb
いちおうれっきとした 32bit の RISC アーキテクチャなんで, WonderWitch のときのような悶々とした感情を抱え込む心配もないかもしれない。あのときは, int が 16bit 長であるという事実に対して,それは当然の事と理解しながらもやはり驚きを禁じ得なかったわけで。
ARM7T の "T" は Tumb の "T" で, Thumb モードっていう 16bit 長インストラクションに対応していることを示している。業務でゲームを作る場合なんかは,高速でメモリの節約できる Thumb モードをガリガリ使うことになるんだろうけど,趣味でやる分にはそれほど重視しなくても良さそうだ。
んで,とりあえず GBA っていったら回転拡縮だろう,ってことで,それに挑戦してみたのが上の図。回転軸の設定方法が分からなくて原点で回転しちゃってるんだけど,なんとなく雰囲気はわかってきた。レジスタに2行2列の行列を書き込めばいいだけだ。なるほど,スーファミの回転拡縮なんかはこういう仕組みになってたんだな,ってちょっと感動。 "F-ZERO" のようにパースをかけるには,ラスタ割り込みを使って走査線ごとに拡大率を変化させるんだろう。
GBA のハードウェアは極めて単純かつ明快で,かなり使いやすい雰囲気がする。次は VSYNC を取ってみようとおもったんだけど,メモリマップされた I/O を監視する方法ではなかなかうまくいってくれない。割り込みを使わないとだめなのかな。まあ,また機会があったら挑戦してみようとおもう。今回はこれでおしまい……。
2002-02-26
なんとなく virt 氏のホームページを訪問。
おもわず全曲ダウンロードしてしまった。氏は chiptune 方面の活動で有名な人物だけど, chiptune 以外でも非常に優れた作品が多い。傾向としては,落ち着きのあるクラシカルな曲と,ノリノリのファンク系な曲を得意としているみたいだ。個人的には "We Feel" に目から鱗……シャカタクを心から愛する僕としては,これを外す訳には行くまい,と。あとトリップホップ風味な "A New Place (Alliance)" もかなり,これは。
GBA の曲も何個か置いてあるんだけど, GBA って極めるとこんな感じの音になるんだなあ,って感じ。たしか GBA は PCM x 2 + GB のはずなんだけど,デジタイズが4音ぐらい同時に鳴っているようにも聴こえる気がする。もちろん CPU で合成するのは可能なんだけど, 16MHz の ARM で動いている限りは,それほど贅沢はできないはずだ。
http://float.jp/cafe/arm/index.html
ARM アーキテクチャの解説を読んでいて面白いなあとおもったのが,各命令にコンディションによる修飾が付加できるってところ。つまり,全ての命令に条件式を含めることができるってことらしい。例えば,
って感じ。うーん,面白いなあ。アセンブラを趣味でいじる分には,なかなか理想的な環境かもしれない。
GBA の開発環境を評価するにあたって,完成度の高いエミュレータが存在するという事実を無視するわけにはいかない。実際に訊いたわけではないので定かではないけど,業務で GBA の開発をやっているひとたちもエミュレータを利用しているのではないかとおもう。たぶん標準の開発環境としては専用の ICE なんかが用意されているんだとおもうけど,実機に対しての動作の忠実度という以外の部分においては,圧倒的にエミュレータの方が使い勝手に優れているからだ。ロードは早いし,デバグは完璧だし(ハードウェアのステートだって見放題だ),開発環境としては実に理想的なものではないかとおもう。
そんなわけで, PE/CE や WonderWitch に手を出すくらいだったら GBA をやってみては,と,これから会う人全てに吹き込もうとおもう次第。アングラ性は高いんだけどね。
2002-02-27
JR 代々木駅で下車し東口に降りて,路線沿いに新宿駅方面へと数百メートル歩くと,紀伊国屋は南新宿店にたどり着く。通勤途中に本屋に寄るときは,いつもここを利用するようにしている。 amazon.co.jp の登場以来,専門書を買うために本屋に足を運ぶことも少なくなったのだけど,なんでか "Effective C++" は amazon で取り扱ってなかったものだから,しょうがなくて,久しぶりに紀伊国屋に寄ってみることにしたのだった。
それで, "Effective C++" と,ついでにたまたま見つけた CG World 別冊 "MAKING OF GAME GRAPHICS 1998-2001" を購入した。
"Effective C++" は, C++ を使う上でハマりやすい落とし穴を指摘する,って内容の本。思想的なことはかなり薄くなっていて,現実的に C++ を扱うにはどういったスタイルをとればいいのか,という点についてストイックに語っている。ようするに「転ばぬ先の杖」ってとこかなあ。
"MAKING OF GAME GRAPHICS" の方は,ろくに文章は読まずにでろでろと流し読み。豊富な画面写真が楽しげだ。スネークのボーン構造ってこんなのなのねー,とか,そういう楽しみ方でいいんではないかと。どうせ大半が古い内容なんだし。
しかしこの本を見ていると,業界の SoftImage 浸透率が異様に高いことに気付かさせられる。今でさえ Maya, XSI, 3DS などの多様な選択肢が用意されているものの,ひと昔前までは本当に SI ばっかだったんだなあ,と思い知らされる。
今までツール制作には何度か手を出してきたものの,どれも中途半端な仕事ばかりで,ひどく後悔した覚えしかない。やはり,インハウスツールをフルスクラッチで作り上げるのは……なんていうか,少なくとも片手間でやるべき仕事では無いな,とおもう。次の機会には,是非とも,既存のソフトを有効に活用した制作環境構築に持って行きたいなあ,と考えている。つまり,もっとツールを買っていきましょう,ってことなんだけど。
個人的には Houdini とかすっごい面白そうで興味あるんだけど,さすがに買ってくれないだろうなあ。
http://www.sidefx.com/index2.shtml
最近関心を持ち始めていることに, C++ コンパイラがどんなコードを吐いているのか,ってことがある。そこの不透明さが嫌がゆえに C を重用しているという現状があるので, C++ に移行するにはまずそこを克服することが必要なのかもしれない,と考えたわけ。
んで,とりあえず疑問なのが,
という2つのファイルが存在する場合に,関数 list<int>::push_back はどのように解決されているのか,ってところ。 a.cxx と b.cxx はそれぞれお互いのことを知らないから,オブジェクトファイルのレベルでは,それぞれのファイル毎に list<int>::push_back が生成されるはずだ。それじゃあ,最終的な出力には list<int> を使用しているファイル分だけの push_back が含まれているんだろうか……っていう疑問。
で,結論から言うと,「同様のコードのなかから1つだけが選択されて,それを共用するような構造になる」というのが正解のようだ。
map ファイルを見てみると,
というように, a.o の push_back だけがリンクされているのがわかる。
a.o と b.o のリスティングを見てみると,
こんな感じで,たしかにどちらにも push_back のコードが存在するんだけど,擬似命令 "linkonce" によってどちらか一方だけがリンクされる指定になっているようだ。
http://www.gnu.org/manual/gas-2.9.1/html_node/as_102.html
オブジェクト a および b は static 宣言されているので,その宣言はファイル内に閉じ込められているんだけど, list<int>::push_back の定義については大域的に扱われるみたいだ。でも,構造体とかクラスの定義ってローカルスコープに縛られるんじゃなかったっけ。それじゃあ,それぞれのファイルにおける list<int> の定義はあくまでも独立していて,コードが共用されるのは最適化処理の一部ってことなんだろうか……ああ,わけわかんないや。そもそもテンプレートをこれっぽっちも理解していないのだから,まずそこからなんとかせねば。
2002-02-28
スケジュールにちょっと歪みが生じてきて,どうやら今晩に峠がやってきそうな雰囲気になってきた。取り急ぎ必要とされる作業は無いけど,緊急事態に備えて机下でスタンバイ with 睡眠(案の定叩き起こされた)。昼頃起きて,しばらくしてから帰宅。風呂に入って,すぐに職場にとんぼ返り。風呂と着替えのためだけに帰宅するのって,移動時間のことを考えるとかなり不毛なんで嫌なんだけど,背に腹は替えられないのだからしょうがない。しょうがないんだってば。
早朝,待ち時間に入ったタイミングで,職場に置いてあった「ゼノサーガ」をプレイしてみる。もう眠くて眠くて,とてもじゃないけど作業してらんないもんね。
んで,んー,まあ,なんていうか……こういうのも受ける人には受けるんだろうなあ,ってのが感想。正直,どの程度の需要があるのか見当も付かない。一体,何本ぐらい売れるのだろう。
ゼノサーガは PS2 初の片面2層 DVD を使用したソフトだ。むしろ片面2層が使えることを知らないひとの方が多いかもしれない。 FFX が2枚組になるなんて噂が流れたこともあったけど,当然片面2層にすることも考えたんだろうなあ(結局は容量を節約して1枚に収めたようだ)。片面2層は製造費と開発コストの面から見てあまり効率がよろしくないので,メーカーとしては避けたい手段であるようだ。
片面2層の DVD-R なんて存在するんだろうか,とおもって, DVD-R について少し調べてみた。結局,片面2層 DVD-R についてはわからなかったのだけど, DVD-R には "DVD-R for General" と "DVD-R for Authoring" の2種類が存在することを初めて知った。 DVD には疎いんで(いろいろややこしいんだよなあ)よくわからないけど, "for Authoring" にはデータの改竄を物理レベルで保護するための仕組みが用意されているようだ。
http://www.watch.impress.co.jp/pc/docs/article/20000907/key1...
http://www.pioneer.co.jp/crdl/tech/dvd/6-4.html
ゼノサーガが片面2層を使用した主な要因は,その圧倒的なムービー量にあるようだ。序盤にレンダリングムービーがあるほかには,ほぼ実機での画像が続いているような印象があるんだけど,実はその3割ぐらいはムービー (MPEG) で占められている。それも前半をちょろっと見ただけの話なんで,全体でどのくらいの割合になるのかは,僕には分からない。
実機でのレンダリング,もしくは,実機画像に似せた絵でのレンダリングなんだけど,それをわざわざムービー化してあるのは,多分,ムービーにしてしまった方が何かと楽だから,っていう理由なんだろうとおもう。ムービーなら凝った特殊効果も簡単に入れられるし,カットの切り替えでローディングを挟む必要も無い。ムービーを効果的に多用した例には「 FF8 以降の FF シリーズ」なんかがあるけど,あちらはあくまでもハイクオリティ CG としてのムービーだからしょうがないとしよう。それに対してこちらは「実機画像の代替としてのムービー」だからなあ……。なんだか少し腑に落ちないものを感じる。開発効率は確かに良くなるんだろうけど。