ゲーム開発におけるベクトル


19

プログラミングとゲームプログラミングは初めてです。ベクトルと数学について読んでいますが、質問があります-ゲームプログラミングでベクトルを使用するにはどうすればよいですか?ベクトルを使用している簡単な例を(2Dで)誰でも教えてください。

私は例を見つけましたが、ほとんどがコンソールにあり、そこで数字を出力しますが、大きな例はわかりません。


基本TL; DRベクトルは線形代数のトピックの一部であり、行列につながります。行列と線形代数を使用すると、マインスイーパソルバーから3Dワールドプロジェクションまで何でも記述して、カーソルの下にあるオブジェクトを確認できます。線形代数は、ゲーム開発者にとって数学の単一の最も有用で必要なブランチです。今すぐ学んでください。後悔しない。
ロバートマサイオリ

すべての素晴らしい回答に感謝します!しかし、なぜこのチュートリアルではベクターを使用しないのですか?:zetcode.com/tutorials/javagamestutorialまたは、ある開発者は他の開発者を使用しますか?
vqwer

言うまでもありませんが、おそらく著者は初心者向けにシンプルで基本的なものにしたかったのでしょう。
マイクセンダー

実際に著者は、それらを使用しての点アレイを見てclass Star ここに
はMaik Semder

またここPoint2D使用されているclass ResizeRectangle
マイクセンダー

回答:


31

ベクターとは何ですか?

ベクトルは、さまざまな次元の座標のセットです。ベクトル内の各座標は、ベクトルが存在する空間のその方向の絶対位置を表します。

  • 1次元ベクトルは{1}になります。これは、たとえば、X = 1の位置、または時間t = 1です。
  • 2-Dベクトルは{-4,3}になります。これは、たとえば、X軸では-4、Y軸では3の位置になります。また、X軸に戻る位置(-4メートル)の温度(3度)である場合もあります。
  • 3-Dベクトルは{1,2,3}になります。これは、X軸に沿ったスペース1、Y軸に戻った2、Z軸に沿った3の位置になります。または、1色が赤1、緑が2、青が3です。または、ある時点T({3})のXY位置({1,2})である可能性があります。

すべての場合において、問題のベクトルに意味を割り当てていることに注意してください。ゲームのジオメトリに使用されているベクトルは一般的に見られますが、ベクトルで他のことをできない理由はありません。

なぜベクターを使用するのですか?

まず、ベクターを使用する必要はありません。あなたがxとyを追跡している限り、またはあなたが気にするどんな座標でも、何らかの形で大丈夫です。

ただし、ベクトルを使用する利点は、方向や位置などをきちんと表していることと、ベクトルを定義して、人生を楽にする数学的操作があることです。

これらの簡単な例については、内積を考慮してください。

トップダウンスタイルのゲームにレーダーシステムがあるとします。レーダーのセクターに現れる敵(2Dのパイ型のくさび)には、画面に小さな赤い点が表示されます。そのため、レーダーセクションにいる敵を把握する必要があります。

敵が三角形の内側にいるかどうかをテストできます。また、レーダーセクターの両側を定義する平面/線の2つの半空間の交差点に敵が含まれているかどうかをテストすることもできます。

または、ドット製品を使用してチェックを行うこともできます。方法は次のとおりです。

  1. レーダーの中心から「レーダーの前面」に向かうベクトルを作成します。それを正規化します。
  2. レーダーの中心から、レーダーの可視性を確認するオブジェクトに向かうベクトルを作成します。それを正規化します。
  3. 2つの正規化されたベクトルの内積を取ります。
  4. その積の逆余弦を取り、それがレーダーの幅の角度の半分より小さいかどうかを確認します。ある場合は、ブリップを描きます。

これは非常に便利であり、異なる方向に向けるレーダー(前方ベクトルを変更するだけ)と異なる幅(レーダー幅角度を変更するだけ)を簡単に使用できるようになりました。これらの場合にも同じコードを再利用できます!

他にベクターを使用する理由は何ですか?

2Dを使用している場合、複雑な効果とモーション(スピニング、スケーリングなど)を実現する最良の方法は、おそらくシーングラフを使用することです。惑星には軌道船があり、船には軌道ドローンがあります。ベクトル計算を使用しないこの計算は、本当にひどいです。

ベクトル演算では、それぞれが点と3x3変換行列を持つものとして表します。惑星はその変換を使用し、船はその変換と惑星の変換を使用し、ドローンはその変換と船の変換と惑星の変換を使用します。

惑星が移動すると、その変換を変更し、船とドローンが自動的に「無料」で配置されます。ずっときれいなコード。

まだ納得できません。 ベクターは、ほぼすべてのグラフィックライブラリで使用される位置、ジオメトリ、およびモーションのネイティブ表現でもあり、OpenGLおよびDirectXでも使用できます。それらを使用せずに逃げることはほとんどありません。

結論 ベクターは、幾何学的な問題をきれいかつエレガントに解決する明確なコードを書くための強力なツールです。


14

2Dの例は画面座標で、画面上のピクセルを識別し、xコンポーネントとyコンポーネント[x、y]を持ちます。つまり、左上の画面位置[0、0]です。

別の例:テキストが右画面の境界から左画面の境界にスクロールすることを想像してください。ここで、スクロールテキストの速度をピクセル/秒、つまり[-20、0]で定義する必要があります。つまり、テキストは毎秒20ピクセル左にスクロールし、高さは変更されません。

別のより高度な例:さまざまな画面解像度800x600、1024x768などで実行される2Dゲームを想像してください。これは、0.0〜1.0の画面幅と0.0〜1.0の高さを内部的に使用してゲームロジックを分離することで簡単に実行できます実際の画面解像度から。これで、画面に描画するときに、内部ベクトルに解像度ベクトルを掛けるだけです。

screen_pos = internal_pos * screen_ressolution

ここで、3つの変数はすべて2Dベクトルであり、xおよびy成分を持っています。つまり、このinternal_pos [0.5、0.25]の場合:

[400, 150] = [0.5, 0.25] * [800, 600]

したがって、内部位置[0.5、0.25]は実際の画面位置[400、150]に変換されます

これが基本的なものでした。ベクトルの真の利点は、行列を使用して頂点を変換(回転、拡大縮小、ミラーリングなど)できる線形代数のアプリケーションです。つまり、すべての内部位置を90度簡単に回転させるか、画面yを交換する必要がありますつまり、使用するサードパーティライブラリがこの規則を使用するため、画面の上部から下部に0を配置します。


ベクトルは、ある種のリストのような単一次元配列ではありませんか?画面の解像度について話しているとき、多次元配列(X軸とY軸ごとに1つの座標)を言っているのではありませんか?ここでは、「ベクトル」が行列と混同されないようにしています。=)
ウィルマルクイラー

画面用@Will完全なピクセルデータが言い換えれば解像度が、できない、多次元配列、基本的にビットマップが、幅と高さの値として扱うことができる
はMaik Semder

2
多くの場合、ベクトルは数学とプログラミングでまったく異なる方法で処理されることに注意してください。数学的に言えば、ベクトルは多次元配列ではありませんが、何らかの基礎に関するそのコンポーネントは一緒にそのような配列を定義します。ベクトル自体は座標不変です。操作screen_pos = internal_pos * screen_resolutionは、あなたが書いたように座標不変ではなく、より適切に書くことができますscreen_pos = map_to_screen * internal_pos。ここmap_to_screenで、は線形マッピングです(これは行列、この場合は対角線として書くことができます)。

6

Wolfire Gamesブログのゲーム開発におけるベクターの優れた説明は次のとおりです。

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


これは現在、リンクのみの回答です。読者がこのリンクから収集することを期待する主なポイントの大まかな要約を含めることを検討してください。これにより、リンクが変更、破損、または将来利用できなくなった場合でも、答えはそのままになります。
DMGregory

1

ベクトルは、値と方向の両方を持つエンティティです。実世界および物理学ベースのゲームのベクトルの例には、速度と運動量が含まれます。値のみを持ち、方向を持たないプロパティはスカラーと呼ばれ、位置、質量、密度などが含まれます。

ベクターは、ベクターのような物理的特性をエミュレートするゲームに必要です(言及したように-速度、加速など)。ベクトル計算に使用される数学は、線形代数と呼ばれます。


速度はスカラーで、速度ベクトルの長さ
マイクセンダー

正解-修正済み
エランガルペリン

1
通常、位置はベクトルと見なされ、距離はスカラーです。
Ali1S232

位置は、スカラー(またはスカラーのコレクション)または軸の開始点を指すベクトルの両方と見なすことができます。
エランガルペリン

1

何かを表現するために各次元に数字がある場所では、これらの数字のコレクションはベクトルと考えることができます。位置、速度、加速度はベクトルの代表的な例です。場合によっては、向きをベクトルとして表すことも実用的です。

基本的なものについては、これらの数値をベクトルと見なしてもしなくてもかまいませんが、何らかの物理学を行いたい場合は、ベクトルの数学を調べる必要があります。


位置はベクトルではない
エランガルペリン

速度でもなく、スカラーでもあり、速度でもベクトルです
Maik Semder

2
@Eran Galperin私はそれが数学者の間でかなり広く見られていることを知っています。ただし、ポイントとそれに対応する位置ベクトルの違いは非常にアカデミックです。区別について大騒ぎする実用的な理由はありません。
aaaaaaaaaaaa

1
実用的な理由があります。4Dの均質な座標とマトリックスを操作したら、その区別をする必要あります。ただし、この質問の範囲には関係ありません。
マイクセンダー

@eBusinessそれは事実である「ビュー」ではありません。そして、私は数学ではなく、教育による物理学者です。
エランガルペリン

0

非常に簡単に言えば、ゲーム内のあらゆる場所にある位置や方向を持つものは、ベクトルを使用します。ベクトルは点のようなものです

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

しかし、違いは本当にこれに帰着します。点は単なるドットですが、ベクトルは矢印です。

あなたが持っている場合

Point2.x = 5;

Point2.y = 10;

この場所でx 5とy 10という意味です

ただし、ベクトルを宣言するとき...

Vector2.x = 5;

Vector2.y = 10; 

0,0からx 5、y 10への矢印を宣言するあなたの本当に言っているim;

ベクトルが指しているポイントをどこからでも空間のポイントにすることもできます。たとえば、ポイントとベクトルを使用してオブジェクトを移動し、Point2を使用してその位置を保存し、vector2を使用して移動します。

point2.x = 10;

point2.y = 15;

これで、ベクトルを使用してこのポイントを移動できます。このポイントをx軸上に10単位移動して、

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

ベクトル矢印が指示した場所にポイントが移動しました。

ポイントは今

point2.x = 20;

point2.y = 15;

最後に注意すべき点は、同じタイプのデータを保持しているという理由だけで、ベクトルがポイントのように使用されたり、その逆の場合があることです。


ベクトルです。これは、点Pへの原点からのベクトルだ
ダック共産

1
@Duck技術的にそれがベクトルposition_pointからorigin_pointを減算することによって求めることができることを同次座標を参照し、正しくない言えば、それはそれらが等しくなりませんv = pos - originので、v != pos原点が点であるので{0, 0, 0, 1}
はMaik Semder

@Duck:点ベクトルではなく、点と原点がベクトルを定義します。これは、原点が0である場合、ほとんどの場合と同じくらい良好です。

@Duckでは、なぜそれをあなたのポイントPと呼んだのですか?笑
EddieV223
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.