プログラミングとゲームプログラミングは初めてです。ベクトルと数学について読んでいますが、質問があります-ゲームプログラミングでベクトルを使用するにはどうすればよいですか?ベクトルを使用している簡単な例を(2Dで)誰でも教えてください。
私は例を見つけましたが、ほとんどがコンソールにあり、そこで数字を出力しますが、大きな例はわかりません。
class Star
ここに
プログラミングとゲームプログラミングは初めてです。ベクトルと数学について読んでいますが、質問があります-ゲームプログラミングでベクトルを使用するにはどうすればよいですか?ベクトルを使用している簡単な例を(2Dで)誰でも教えてください。
私は例を見つけましたが、ほとんどがコンソールにあり、そこで数字を出力しますが、大きな例はわかりません。
class Star
ここに
回答:
ベクターとは何ですか?
ベクトルは、さまざまな次元の座標のセットです。ベクトル内の各座標は、ベクトルが存在する空間のその方向の絶対位置を表します。
すべての場合において、問題のベクトルに意味を割り当てていることに注意してください。ゲームのジオメトリに使用されているベクトルは一般的に見られますが、ベクトルで他のことをできない理由はありません。
なぜベクターを使用するのですか?
まず、ベクターを使用する必要はありません。あなたがxとyを追跡している限り、またはあなたが気にするどんな座標でも、何らかの形で大丈夫です。
ただし、ベクトルを使用する利点は、方向や位置などをきちんと表していることと、ベクトルを定義して、人生を楽にする数学的操作があることです。
これらの簡単な例については、内積を考慮してください。
トップダウンスタイルのゲームにレーダーシステムがあるとします。レーダーのセクターに現れる敵(2Dのパイ型のくさび)には、画面に小さな赤い点が表示されます。そのため、レーダーセクションにいる敵を把握する必要があります。
敵が三角形の内側にいるかどうかをテストできます。また、レーダーセクターの両側を定義する平面/線の2つの半空間の交差点に敵が含まれているかどうかをテストすることもできます。
または、ドット製品を使用してチェックを行うこともできます。方法は次のとおりです。
これは非常に便利であり、異なる方向に向けるレーダー(前方ベクトルを変更するだけ)と異なる幅(レーダー幅角度を変更するだけ)を簡単に使用できるようになりました。これらの場合にも同じコードを再利用できます!
他にベクターを使用する理由は何ですか?
2Dを使用している場合、複雑な効果とモーション(スピニング、スケーリングなど)を実現する最良の方法は、おそらくシーングラフを使用することです。惑星には軌道船があり、船には軌道ドローンがあります。ベクトル計算を使用しないこの計算は、本当にひどいです。
ベクトル演算では、それぞれが点と3x3変換行列を持つものとして表します。惑星はその変換を使用し、船はその変換と惑星の変換を使用し、ドローンはその変換と船の変換と惑星の変換を使用します。
惑星が移動すると、その変換を変更し、船とドローンが自動的に「無料」で配置されます。ずっときれいなコード。
まだ納得できません。 ベクターは、ほぼすべてのグラフィックライブラリで使用される位置、ジオメトリ、およびモーションのネイティブ表現でもあり、OpenGLおよびDirectXでも使用できます。それらを使用せずに逃げることはほとんどありません。
結論 ベクターは、幾何学的な問題をきれいかつエレガントに解決する明確なコードを書くための強力なツールです。
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を配置します。
screen_pos = internal_pos * screen_resolution
は、あなたが書いたように座標不変ではなく、より適切に書くことができますscreen_pos = map_to_screen * internal_pos
。ここmap_to_screen
で、は線形マッピングです(これは行列、この場合は対角線として書くことができます)。
Wolfire Gamesブログのゲーム開発におけるベクターの優れた説明は次のとおりです。
http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
ベクトルは、値と方向の両方を持つエンティティです。実世界および物理学ベースのゲームのベクトルの例には、速度と運動量が含まれます。値のみを持ち、方向を持たないプロパティはスカラーと呼ばれ、位置、質量、密度などが含まれます。
ベクターは、ベクターのような物理的特性をエミュレートするゲームに必要です(言及したように-速度、加速など)。ベクトル計算に使用される数学は、線形代数と呼ばれます。
何かを表現するために各次元に数字がある場所では、これらの数字のコレクションはベクトルと考えることができます。位置、速度、加速度はベクトルの代表的な例です。場合によっては、向きをベクトルとして表すことも実用的です。
基本的なものについては、これらの数値をベクトルと見なしてもしなくてもかまいませんが、何らかの物理学を行いたい場合は、ベクトルの数学を調べる必要があります。
非常に簡単に言えば、ゲーム内のあらゆる場所にある位置や方向を持つものは、ベクトルを使用します。ベクトルは点のようなものです
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;
最後に注意すべき点は、同じタイプのデータを保持しているという理由だけで、ベクトルがポイントのように使用されたり、その逆の場合があることです。
v = pos - origin
ので、v != pos
原点が点であるので{0, 0, 0, 1}