ベクターゲーム(ワイヤーフレーム、エリートのような)の理論と実装?


7

EliteStar Wars Atariなどのベクターゲームが根本からどのように構築されたかについて詳しく知りたいです。問題は、OpenGLやDirectXのような最新の3D APIを使用してベクターグラフィックスを実装する方法ではありません。これを行うのは非常に簡単であり、ゲームのようにゼロからベクター/マトリックスシステムを構築する必要がないためです。

これらのゲームについて私が推測するいくつかのこと:

  • 彼らは非常に低レベルで動作し、ASMで書かれています
  • 彼らは実際の3Dゲームであり、After Burnerのようにそれを偽っていません。Wolfenstein 3Dとは異なります。アフターバーナーはrotozoom /ラスターエフェクトを使用し、Wolfenstein 3Dはレイキャスティングと2Dスケーリングを使用しました。上に移動できないため、実際には3Dではありません。Duke Nukem 3Dが使用したビルドエンジンが気に入っても、壁以外はすべてスプライトです。Star Foxは実際の3Dモデルを使用しているので、それに近いですが、実装はSNESのSuper-FXチップを使用しており、おそらくスキャンライントリックを採用しています。Eliteはおそらく(少なくともElite NESのような一部の実装では)上記のスキャンライントリックを使用していることを知っていますが、カスタムビルドのアーケードマシンを使用していたため、SWAについてはわかりません。どちらにせよ、私はそれについてもっと知りたいです。
  • それらの3Dモデルは実際の3Dモデルです。それらはベクトルとして定義され、カメラの位置に従って変換されます。

エリートのソースを分解して自分でどのように行われたかを確認することをお勧めしますが、その前に、それらがどのように作成されたか、および同様の手法を示す最新のオープンソースプロジェクトがあるかどうかを知りたいと思います。 。Oolite(OpenGLとObj-Cを使用)のようなEliteのリメイクを意味するのではなく、OpenGLのようなAPIを直接使用することを避け、OpenGLのようなAPIを直接使用しないプロジェクト-必ずしも低レベルのプロジェクトではなく、SDL(OGLなし)のような2Dライブラリを使用する少なくとも今のところは十分です。

MESA3Dのソースコードには、EliteやSWAなどのゲームが実装したルーチンの多くが含まれていることを知っています。ゲームのコンテキストでそれらを確認したいだけです。EliteとSWAが基本的に行ったのは、ラスタライズを実装し、モデルとローダーのフォーマットを作成したことです(少なくともSWAには、ツールを使用してモデラーから構築されたモデルがあると確信していますが、TIEファイターをハードコーディングすることは不可能ではありません)正確に行うのは難しいことです)、そして他の多くのことに気付かないかもしれません。しかし、それに入るのは本当に時間がかかり、そこにあるものの多くは気にしません。Eliteのようなゲームは、コンピューターとコンソールが当時持っていたROMとRAMが低いため、非常に軽量であったことを覚えておいてください。

私は3Dグラフィックスに不慣れです。すべての私の仮定は、3Dジオメトリと学校レベルの数学についての私の限られた知識に基づいています。しかし、私はこれらのゲームがどのように機能するかについて、詳細について知りたいと思っています。存在すれば、エリートや同様のゲームの開発についての本を購入します。いくつかの一般的な提案で十分です。


エリートとスターウォーズが非常に異なる方法で機能したことは言及する価値があります。Eliteは、3Dモデルをピクセルにソフトウェアラスタライズしましたが、Star Warsは、ピクセルさえもないベクターディスプレイで実行されていました。代わりに、表示ビームは画面に任意の色の線を直接描画しますが、それらを埋めることはできませんでした。
Trevor Powell

投影された点にブレゼンハム線(またはDDA線)を描画しませんでしたか(同様の三角形で導出できます)。
user712092 2011年

回答:


3

問題は、OpenGLやDirectXのような最新の3D APIを使用してベクターグラフィックスを実装する方法ではありません。これを行うのは非常に簡単であり、ゲームのようにゼロからベクター/マトリックスシステムを構築する必要がないためです。

ベクトルは文字通り単なる数字のリストです。行列は、数値のグリッドにすぎません。興味深い部分はあなたがそれらに使う数学ですが、それも簡単です-この種のことが説明されている学校レベルの数学の本を手に取ってください。これは約50〜100行のコードなので、ここでの作業を過大評価しないでください。

彼らは実際の3Dゲームであり、After Burnerのようにそれを偽っていません。Wolfenstein 3Dとは異なります。

レイキャスティングは、通常の幾何学的アプローチよりも間違いなく「リアル」であるため、ウルフェンシュタイン3Dはほとんどがリアル3Dです。それでも、あなたはそれが別のモデルであり、ここで関心のあるモデルではないことを識別するのは正しいことです。

エリートのソースを分解して自分でどのように行われたかを確認するのが最善の方法だと思います

特にエリートにこだわらないでください。特別なものは何も使用していません。ソフトウェアのラスタライゼーションは、どのソフトウェアがそれを実行したかに関係なく、ほとんど同じです。各オブジェクトを取得し、そのすべての座標をワールド空間に変換します。次に、ビューアーに関連するすべてのワールド空間座標をビュー空間に変換し、それらを2Dに投影してスクリーン空間に配置します。各変換は基本的に回転と並進であり、正しい仮定をすれば、通常、投影は除算に過ぎません。

目に見えない面を削除する方法など、すぐに思い出せないトリッキーなビットがいくつかありますが、頂点の順序だけで実行できると思います-画面で時計回りの場合は、2つの接続された頂点間に線を描画しますスペース、そうでない場合はしないでください。(例えば。)

TIEファイターをハードコードすることは不可能ではありません。正確に行うことは困難です。

それらのモデルのほとんどは、約20か30の頂点しかありませんでした-簡単にハードコーディングの領域内で。私は元の作者が最初にモデルをグラフ用紙に描いてから、頂点の値をコードにコピーしたことを期待しています。


だから私のラスタライゼーションは正しいと思いましたか?私があなたの言ったことを正しく理解していれば、それは、たとえばOpenGLを使用した標準の3Dプログラミングと似ています。行列の乗算などですよね?しかし、裏面カリングとZバッファリングを理解する必要があります。ラスタライズの優れたオープンソース実装を知っていますか?アルゴリズムはそれほど難しくないと思いますが、理解するためにコードをいじってみたいので、何もコピーしたくありません(また、非常に特殊な修正Z80 ASMを使用しているため)。ある種のリファレンスを持っています。
EliteIsAwesome 2010年

もちろん、ベクターグラフィックスのソフトウェアレンダリングはすべて、定義によりラスタライズされます。ソースコードの例は知りませんが、スクリーンスペースに頂点があれば、ブレゼンハムアルゴリズムを使用して線を描くことができます。裏面カリングとZバッファリングに関しては、Eliteには「面」がなく、エッジだけがあり、どの種類の深度バッファも使用していませんでした-そのための十分なメモリがありませんでした。 90年代半ばにゲームに実際に使用され始めました。
カイロタン

はい、私はZ-バッファリングが比較的後で来たことを知っていました。代わりに "Z-カリング"と言ったはずです。もっと単純なアルゴリズムの1つを使用する必要があると思います。ブレゼンハムのアルゴリズムを教えてくれてありがとう、それはかなり安価に見えます。
EliteIsAwesome

2

3D空間で任意の(制限されていない)ジオメトリをサポートする頂点ベースの3Dを探しています。レイトレーシング本来の意味ではあり、それは自由の無制限度(DOF)をサポートすることが可能という点で、本当の3D。ただし、レイキャスティング(レイの方向を除いてレイトレーシングに似ている本来の意味ではなく、ゲーム開発の意味で)は、自由度を制限します。コマンチのボクセルレイキャスター、または実際にはプレーヤーが純粋な2D空間で移動しているWolfensteinにあるような高さマップベース。軸による制限なしに任意の形状をサポートする3Dエンジンは、何らかの画面スペースの表現にすぎません その表現に関係なく、3D世界のモデルの。

彼らは非常に低レベルで動作し、ASMで書かれています

エリートの場合、おそらくご存じのとおり、そうでした。他の同様のゲームの一部は、あらゆるケースで、ASMまたは機械コード記述で厳しく書かれており、今日のALUのようなものを使用せずに、要求の厳しい数学的処理を考慮しています。本当にパフォーマンスクリティカルなコードベースの小さな部分しかないので、これらの一部の重要度の低い部分(3Dコンストラクションキットや作成したゲームなど)がC ++で記述されたと考えられます。ただし、繰り返しになりますが、特に16ビット時代以前のマシンではリソースが限られているため、アセンブラーと生のマシンコードが混在しているように見えます(実際には、0と1の巨大なシーケンスを入力し、それらをディスクとしてディスクに保存できます。プログラム-あなたがミスをした場合、天国はあなたを助けます)。

彼らの3Dモデルは実際の3Dモデルです

そのようなゲームをゼロから構築するプロセスに関する追加の注記:

数学、何よりもまず。本物であるには、固定小数点演算を使用します。数学の最後に何を実装できるかによって、作成できるゲームの種類が決まります。限目。これがブラーベンとベルがエリートにした哲学であることを保証します。プロトタイプを作成し、最適化し、すすぎ、繰り返します。何が可能か見てください。次に、可能にしたことを中心にゲームを設計します。今日のシステムではこれは当てはまりません。可能なこと(ローエンド)はすでにわかっているからです。基本的な構成要素である3Dベクトル、回転行列、四元数の実装を見つけます(できれば背後の数学を理解してください。ただし、これは100%必要なことではありません)。計算するのが安い)など。それも効率とデータ構造がパフォーマンスに与える影響を過小評価しないでください。

次に、コードを記述します。これらの構造と操作を実装します(より幅広いゲームに付随する構造とロジックも同様です)など)、C ++などの高水準言語またはさらに優れた(高速)Cでは、必要に応じて、そこからasmブロックに最適化します。私はこれをx86または他の最新のアーキテクチャで実行することを想定しているので、これで十分です。Motorola 68000ベースのシステムなどの16ビット時代のハードウェアの場合、Cを使用してASMにリファクタリングすることがよくあります。8ビットのハードウェアであれば、Cは限られたビットで実行できると思いますが、おそらく無慈悲にASMにリファクタリングするでしょう。8ビットまたは16ビットシステムで作業する場合は、アーキテクチャ、これらのプラットフォームで使用されるますます不明瞭なトリックなどに精通する必要があります。したがって、文字通り、このルートはお勧めしません。最近のダークアート(驚くべきことに、これらのほとんど機能しなくなったシステムのために開発しているコミュニティはまだあります)。

あなたのオールドスクールテクニックの徹底的な調査は称賛に値します。あなたは確かに、今日のハードウェアで想像を絶するほど多くのことができるということを理解することになるでしょう。


私が3DCK以外に覚えているいくつかの同様のゲームをチェックしてください。

  • 暗黒面
  • スターグライダー
  • 間期
  • ウイルス(すばらしいゲーム)
  • 征服者(ウイルスと同じエンジン、バディと1人のキーボードでこれをプレイするために使用されました。1人は戦車の砲手で1人は運転手、素晴らしい思い出)
  • 傭兵(エリートの数か月後にリリース)
  • ダモクレス(およびその他の傭兵の続編とミッションディスク)
  • Novell NetWars for x86アーキテクチャ(Dosboxなどでも実行できますが、ネットワークで実行するには本格的なセットアップが必要だと思います)

レイキャスティングベースのエンジンが実際の3Dではないことについて、私はそれらのほとんどが2次元の空間を表すだけであるという事実に言及していました。エリートは360度の動きを許可しました。これが3Dゲームの定義です。3D表現の定義はより柔軟です、私は完全に同意します!編集:私はあなたの完全な答えに感謝したいと思いました。興味があれば、私はゲームボーイで小さなエリートのようなデモを開発しています。ボクセルエンジンで頑張ってください!
EliteIsAwesome

ええ、そうです、私はそのセクションを洗練して再洗練しました、私はあなたが何を意味していたかを知っています、この質問をする前にあなたが良い研究をしたと言うことができます。あなたのゲームについて、私は非常に興味があります。フィードや購読できるものはありますか?
エンジニア

最善を尽くした。私はすでに数学を深く掘り下げるつもりでしたが、あなたがすでに言及したもの以外に、私が考慮すべきもっと多くの主題を提案できますか?それらを恐れていません!
EliteIsAwesome

ちょうど再編集-レイトレーシングとレイキャスティングの説明。これは重要な違いです。本来の意味でのレイキャスティングは、レイトレーシングの最適化にすぎませんでしたが、後に「レイキャスター」とは、ウルフェンシュタイン/ドゥーム/デュークヌケム3Dスタイルで実装されたゲームを意味するようになりました。数学に関しては、私のものは決して印象的ではありませんでした。しかし、あなたが私が述べたそれらのトピックでさえ、あなたは驚くべき量をすることができます。さらに、ゲームプログラマー向けの3D数学とゲームプログラマー向けのデータ構造を確認してください。GPU Gemsシリーズ、および計算幾何学に関するPaul BourkeのWebページ。
エンジニア、

はい、ありがとう。広範囲な計算を一連のレジスタとメモリに変換するのは難しいと思いますが!私は自分のプロジェクトについてほとんどブログやフィードを作成していません。ソース資料は非常に少ないためです。しかし、私はそれがとても魅力的だと思ったのはそのためだと思います。私がこれから何かを作ったとしたら、私はおそらくここに数秒間来なければならないので、あなたはそれについて聞いていると思います!また、www.everyvideogame.com/showthread.php?p=11539をチェックアウトし、ベクターゲームのあなたのリストに追加する
EliteIsAwesome
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.