「初心者」ゲームプロジェクトを超えて


22

私はゲーム開発者が知っておくべき数学の種類に関するこの答えを読んでいて、この部分は本当に目立っていました:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

それは私がそれをやろうと思う方法ですので、それは私のスキルレベルを示していると思います。少なくとも私が過去に作成した2Dの横スクロール型のアーケードスタイルのゲームについては、それだけで十分です。それと少しの三角法。

実際、私はその投稿を読む前に、線形代数をあまり使用しておらず、四元数も聞いていません。これは、これらの数学が3Dで作業するまで表示されないからか、それとも私の2Dゲームが単純であるために、単純な実装で逃げたからです。

フォローアップの質問:そのタイプの数学に精通したい場合、どのタイプのプロジェクトに着手すべきですか?IE:ゲームエンジンの作成、3Dゲームの作成など。


1
khanacademy.orgは、初心者から上級者向けの数学を学ぶのに最適です。さらに実績もあります!退屈なアカデミアを活気付けるゲーム理論のようなものはありません。
減速

回答:


16

これの本当のトリックは、高校レベルの科学です。あなたがすべきだった。簡単にグーグルで検索しなかった場合は、すぐに始められます。「初心者」の考え方を避ける方法を説明するには、月着陸船の例を取り上げます。

[change in position] = [velocity] * [time passed]これらの変数を追跡する必要があることが明らかになったことを読んだら:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

次に、各フレームの位置に速度を適用します。

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

次に、重力を追加できるように、各フレームの速度を変更します。まったく同じソースによると[change in velocity] = [acceleration] * [time passed]。したがって、まったく同じ原則を適用できます。

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

ここで、プレイヤーが宇宙船を制御する方法が必要です。基本的な物理学についての詳細を読むと、運動は力の結果であることがわかります。ソースを見つけることはできませんが[change in acceleration] = ([force] / [mass]) * time(覚えている限り)。そのため、プレイヤーがキーを押すfxと、fy変数と変数を何かに設定し、更新中に方程式を適用するだけです。

最終的には、ゲーム内のオブジェクトの周囲の物理学について考える必要があります。そして、オブジェクトを思い通りに動かそうとする代わりに、方程式を調べます

将来注:これは間違いなく(これはオイラーの統合と呼ばれ、低フレームレートでいくつかの奇妙な状況につながることができます)物理学を行うための最善の方法ではないことを忘れないでください-あなたがに見てする必要が物事の他の方法(その記事はかなり持っています素朴な基礎についても素敵な記事)。ただし、今のところオイラーインテグレーションに固執してください。これは、1つ少ないことを学ぼうとしていることを意味します。

どのゲームが正しい考え方で考える方法を教えてくれますか?

正しく、正しい考え方で物事を行ったことをどのようにテストしますか?Sleep(10 milliseconds)ゲームループにを挿入すると、すべてが移動し、フルフレームレートと同じように反応するはずです。

最後に、2Dゲームを機能させるための十分な経験を積むまで、3D(およびクォータニオンとマトリックスの強化)を避けてください。多くのゲーム開発者は、QuaternionsやMatricesが実際にどのように機能するかを実際には知らないが、それらを使用する方法を知っているだけであると言いたいと思います。(または、2Dゲームはとても楽しく、成功)。基本レベルでこれを行うために、線形代数などを実際に知る必要はありません(しかし、本当に役立つので、できれば夜のクラスに行ってください)。

最終的なボーナス:美術の先生がいつも言っていたことの1つは、「あなたが見ていると思うものを描かないで、見ているものを描く」ことです。同じことは、ここに適用され、「あなたは何をモデル化していないと思います(たまたまobject.position++)、モデル何が起こるか( `object.position + =速度*時間)」 -少なくとも合理的な範囲に(あなたは完全に正確なシステムをモデル化しますが、メイクされていません良い模造品です)。


テストのために人為的なラグを挿入するというあなたのアイデアが好きです。また、地球の重力は、ありません9.1 9.8である
スティーブ・

実際のシミュレーションを作成しているのでない限り、「起こると思うことをモデル化せず、起こることをモデル化する」ことに注意してください。プロジェクトの必要に応じてスケーリングします。時々、「考えられること」がデザインの良い答えになることがあります。
カオス技術者

このレベルの@chaosTechnicianは、「あなたが考えていること」ですobject.position++。答えを明確にします。
ジョナサンディキンソン

-1の場合instead of trying to make them move in the way you would think, rather look up the equation。それはについてです理解しそれらを見ていない、方程式を。最も重要なことは、ゲームを楽しくすることであり、可変加速度が重力をより楽しくすることを知っているかもしれません。しかし、方程式を理解していない場合、その方法を推論するのは非常に困難になります。
BlueRaja-ダニーPflughoeft

3
@ BlueRaja-DannyPflughoeftそれはまさに私が彼に説明したことです。そもそも方程式を知らないということは、決して理解できないことを意味します-そして、それらを理解する唯一の方法は、実際の状況で使用することです。
ジョナサンディキンソン

3

あなたがリンクした答えの一部は、彼らのプレゼンテーションでは少しエリート主義者だと思います。ベクトル数学の美徳を称賛し、オブジェクトには位置、方向、および加速が必要であると言うことは、一貫して具体object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime的ではありませんobject.position.x++。四元数は、回転を表す多くの方法の1つです。私はそれらが好きですが、3D回転を理解するのに不可欠ではありません。多くのQuaternionユーザーが示唆することにもかかわらず、彼らは回転数学の聖杯ではありません。

線形代数の原理は、単純な2Dの移動、回転などに存在しますが、2次元しかないため、数学はより単純です。 以下に例を示します。

線形代数の知識を学習/改善する方法はたくさんあります:

  1. 私は線形代数のコースを取ることを考えましたが、私のコース負荷はすでにかなり重いので、余分な仕事を正当化することができませんでした。
  2. 一連のゲームエンジンプログラミングクラスを受講するにつれて、線形代数に対する私の理解はさらに大きくなりました。私にとって、ベクター、マトリックスなどの使用は、(一般的に言えば)ゲーム側よりもエンジン側の方が一般的です。もちろん、それはゲームコードでマトリックスを使用しなかったということではありません。エンジンコーディングで使用するほど頻繁には使用しません。ymmv
  3. また、知っておくべき数学を理解するのに役立つ本もたくさんあります。「3D Math for Games」という章があるこの本が好きです。

最後に、ゲームの設計が複雑な数学を必要としない場合は、使用しないでください。:)しかし、もちろん、そうすることでゲームの設計を掘り下げることを止めさせないでください。


0

2Dのクォータニオンは、計算量が多すぎることは言うまでもなく、完全に過剰になります。ビットマップの回転(2D)は、非常に多くのプラットフォーム/ライブラリによって暗黙的に処理されます。これは、アプリケーションを記述するのに非常に基本的であるためです。もちろん、人間が自転車に乗るべきだったときに人間が3Dコードを書いて育ったと言わない限り、3Dでは、物事は平均的な人間にとってかなり直感的ではなくなります。

線形代数は3Dと同様に2Dにも適用でき、中学校の数学しかやっていなくても慣れ親しんでいるはずです。線の交点、または線上の周期的なプロット(積分)を行ったことがある場合は、線形代数を使用しました。

3D数学の学習は通常、3D空間に単純なオブジェクト(立方体など)を配置し、さまざまな視点からそのオブジェクトを表示できる可動カメラを実装することから始まります。画面を表す3D平面にポイントを投影することです(ここでの式、yに加えてこれをx軸とz軸に拡張します)。本当に、それはあなたの経験のレベルに関係なく、3Dエンジンを書くことの始まりです。FlashとProcessing.jsは、このようなものを簡単にプロトタイプ化する2つの優れた方法です。


0

あなたは、線形代数とより複雑な数学が通常3Dグラフィックスと3Dスペースを含むことを軌道に乗っています。ただし、2Dゲーム内で実行できる数学はまだあります。物理演算はかなりハードコアになる可能性があり、ソフトボディ物理学とBスプラインダイナミクスを考慮すると、さらに複雑になります(さらに2Dでは、留意してください)

一般的な2D形状の衝突処理と応答をカバーする物理ライブラリを構築または分析してみてください。線形代数は、衝突の軌道ベクトルを計算するのに非常に役立ちます。ドット積は、三角法で使用される単位円に非常に関連しています。ただし、剛体物理学の複雑さは、3Dで適用すると指数関数的に増加します。

3Dグラフィックスにより、行列計算、四元数、線形代数、および適用された計算の詳細を理解できます。おそらく最初に取り上げるのは、マトリックスを使用して3D空間でオブジェクトを移動および操作することです。


0

2Dゲームを書いているのであれば、おそらく既に線形代数を使用しているはずです。少なくともベクトルに関する基本を正式に学ぶことは非常に簡単ですが、そうでなければ複雑な動きについて考えることを単純化するのに大いに役立ちます。

たとえば、ここでは、大砲からの砲弾やホーミングミサイルなど、湾曲した動きをシミュレートするために使用する方程式について多くの質問があります。ただし、ベクトルを理解している場合、必要な「方程式」は、2つのベクトルを加算することだけです。それだけでなく、空気ドラッグや摩擦などの追加は非常に簡単になります。ドラッグベクトルを計算して、速度に追加するだけです。プレスト!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.