Au-delà des projets de jeux «novices»

22

Je lisais cette réponse sur le type de calcul qu'un développeur de jeux devrait connaître et cette partie m'a vraiment frappé:

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

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

C'est ainsi que je penserais à le faire, donc je suppose que cela montre mon niveau de compétence. Au moins pour les types de jeux 2D à défilement horizontal et de style arcade que j'ai créés dans le passé, c'est tout ce dont j'avais besoin. Ça et un peu de trigonométrie.

En fait, je n'ai pas utilisé beaucoup d'algèbre linéaire ou même entendu parler de quaternions avant de lire ce post. Est-ce parce que ces calculs n'apparaissent que lorsque vous travaillez avec la 3D ou est-ce parce que mes jeux 2D sont assez simples que je me suis éloigné des implémentations naïves.

Question de suivi: si je veux me familiariser avec ce type de calcul, quel type de projets dois-je entreprendre? IE: écrire un moteur de jeu, travailler sur un jeu 3D, etc.

Mike C
la source
1
khanacademy.org est idéal pour apprendre les mathématiques pour débutants et avancés. Plus theres réalisations! Rien de tel que la théorie des jeux pour animer un milieu universitaire ennuyeux.
deceleratedcaviar

Réponses:

16

Le vrai truc avec ceci est la science au niveau secondaire; ce que vous auriez dû faire. Si vous n'avez pas effectué de recherche rapide sur Google, vous commencerez . Pour expliquer comment vous évitez la mentalité de «novice», prenez l' exemple de l' atterrisseur lunaire .

Une fois que vous avez lu [change in position] = [velocity] * [time passed]qu'il devient clair qu'il faudrait garder une trace de ces variables:

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

Ensuite, vous appliqueriez simplement la vitesse à la position de chaque image:

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

Maintenant, nous aimerions modifier la vitesse de chaque image afin d'ajouter de la gravité. Selon la même source exacte [change in velocity] = [acceleration] * [time passed]. Par conséquent, nous pouvons appliquer exactement le même principe:

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;

Maintenant, vous avez besoin d'un moyen pour le joueur de contrôler son vaisseau spatial. En lisant plus sur la physique de base, vous apprendrez que le mouvement est le résultat de la force - je ne trouve pas de source mais [change in acceleration] = ([force] / [mass]) * time(pour autant que je m'en souvienne). Ainsi, lorsque le joueur appuie sur une touche, vous devez simplement définir les variables fxet fysur quelque chose et appliquer l'équation lors de votre mise à jour.

En fin de compte, vous devez penser à la physique autour des objets dans votre jeu - et au lieu d'essayer de les faire bouger comme vous le pensez, préférez rechercher l'équation .

Remarque future: rappelez-vous que ce n'est certainement pas la meilleure façon de faire de la physique (cela s'appelle l'intégration d'Euler et peut conduire à des scénarios étranges à de faibles fréquences d'images) - vous devez examiner d' autres façons de faire les choses (cet article a belle rédaction sur les bases nues aussi). Cependant, restez avec l'intégration d'Euler pour l'instant, car cela signifie que vous essayez d'apprendre une chose de moins.

Quels jeux vous apprendraient à penser dans le bon état d'esprit?

Comment testeriez-vous que vous avez fait les choses correctement et avec le bon état d'esprit? Insérez un Sleep(10 milliseconds)dans votre boucle de jeu et tout devrait toujours bouger et réagir de la même manière que le framerate complet.

Enfin, veuillez vous tenir à l'écart de la 3D (et donc des quaternions et des matrices) jusqu'à ce que vous ayez une bonne expérience de la mise en œuvre des jeux 2D. Je me risquerais à dire que bon nombre de développeurs de jeux ne savent pas vraiment comment fonctionnent les Quaternions ou les matrices - mais savent simplement comment les utiliser - les approcher beaucoup plus tard (ou jamais, les jeux 2D sont très amusants et peuvent être assez réussi). Vous n'avez pas vraiment besoin de connaître l'algèbre linéaire et ainsi de suite pour le faire au niveau de base (mais cela aide vraiment, alors allez à certains cours du soir si vous le pouvez).

Bonus final: Une chose que mon professeur d'art m'a toujours dit: "ne dessinez pas ce que vous pensez voir, dessinez ce que vous voyez". La même chose s'applique ici "ne modélisez pas ce que vous pensez qu'il se passe ( object.position++), modélisez ce qui se passe (` object.position + = velocity * time) "- au moins dans des limites raisonnables (vous ne modélisez pas un système parfaitement précis, mais faites quelque chose qui est une bonne immitation).

Jonathan Dickinson
la source
J'aime votre idée d'insérer un décalage artificiel pour les tests. De plus, la gravité de la Terre est de 9,8 et non de 9,1
Steve
Soyez prudent avec "ne modélisez pas ce que vous pensez arriver, modélisez ce qui se passe" à moins que vous n'écriviez une simulation réelle. Échelle selon les besoins de votre projet. Parfois, "ce que vous pensez qui se passe" est une bonne réponse pour votre conception.
chaosTechnician
@chaosTechnician à ce niveau est "ce que vous pensez qui se passe" object.position++. Je vais clarifier la réponse.
Jonathan Dickinson
-1 pour instead of trying to make them move in the way you would think, rather look up the equation. Il s'agit de comprendre les équations, pas de les rechercher. Le plus important est de rendre le jeu amusant, et qui sait, peut-être que vous trouverez une accélération variable qui rend la gravité plus amusante. Mais il sera très difficile de savoir comment procéder si vous ne comprenez pas les équations.
BlueRaja - Danny Pflughoeft
3
@ BlueRaja-DannyPflughoeft, c'est exactement ce que je lui ai expliqué: ne pas connaître l'équation en premier lieu signifie que vous ne pouvez jamais la comprendre - et la seule façon de les comprendre est de les utiliser dans une situation réelle.
Jonathan Dickinson
3

Je pense que certaines parties de la réponse que vous avez liée sont un peu élitistes dans leur présentation. Vanter les vertus des mathématiques vectorielles, puis dire qu'un objet a besoin d'une position, d'une direction et d'une accélération est incohérent, car cela va vraiment se résumer à quelque chose comme object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime- ce qui, fondamentalement, n'est pas si différent object.position.x++. Les quaternions sont l'une des nombreuses façons de représenter les rotations; Je les aime mais ils ne sont pas essentiels à la compréhension des rotations 3D. Malgré ce que de nombreux utilisateurs du Quaternion impliqueront, ils ne sont pas le Saint Graal des mathématiques rotationnelles.

Les principes de l'algèbre linéaire sont présents dans le simple mouvement 2D, la rotation, etc. mais les calculs sont plus simples car il n'y a que deux dimensions. Voici un exemple .

Il existe de nombreuses façons d'apprendre / d'améliorer vos connaissances en algèbre linéaire:

  1. J'ai envisagé de suivre un cours d'algèbre linéaire mais ma charge de cours est déjà assez lourde donc je n'ai pas pu justifier le travail supplémentaire.
  2. Ma compréhension de l'algèbre linéaire s'est développée de manière beaucoup plus importante lorsque j'ai suivi une série de cours de programmation de moteurs de jeux. Pour moi, l'utilisation des vecteurs, des matrices, etc. a été (généralement parlant) plus répandue du côté moteur que du côté jeu. Bien sûr, cela ne veut pas dire que je n'ai pas utilisé de matrices dans le code du jeu - je ne les utilise tout simplement pas aussi souvent que dans le codage des moteurs. ymmv
  3. Il existe également de nombreux livres qui peuvent également vous aider à comprendre les mathématiques que vous devez connaître. J'aime ce livre qui a un chapitre intitulé "3D Math for Games".

Enfin, si la conception de vos jeux ne nécessite pas de calculs complexes, ne l'utilisez pas. :) Mais, bien sûr, cela ne vous empêche pas de vous plonger dans la conception d'un jeu qui le fait.

chaosTechnicien
la source
0

Les quaternions pour 2D seraient une surpuissance totale, sans parler du calcul beaucoup trop cher. La rotation bitmap (2D) est gérée implicitement par un grand nombre de plates-formes / bibliothèques, car elle est si fondamentale pour écrire n'importe quelle application, et même là où elle ne l'est pas, la rotation des bitmaps 2D n'est rien de plus qu'un simple déclencheur. En 3D, les choses deviennent considérablement moins intuitives pour l'être humain moyen, à moins bien sûr que cet être humain n'ait grandi en écrivant du code 3D alors qu'il aurait dû faire du vélo.

L'algèbre linéaire s'applique à la 2D comme à la 3D et devrait être quelque chose que vous connaissez même si vous n'avez fait que des mathématiques au premier cycle du secondaire. Si vous avez déjà fait des intersections de lignes ou tracé périodique sur une ligne (intégration), vous avez utilisé l'algèbre linéaire.

L'apprentissage des mathématiques 3D commence généralement par le placement d'un objet simple (comme un cube) dans l'espace 3D, et la mise en œuvre d'une caméra mobile qui peut voir cet objet sous différentes perspectives, et cette perspective peut commencer orthogonale pour rendre les choses encore plus simples. Il s'agit de projeter des points sur un plan 3D représentant votre écran (formule ici , vous étendre cela aux axes x et z en plus de y). Vraiment, c'est le début de l'écriture de tout moteur 3D, quel que soit votre niveau d'expérience. Flash et Processing.js sont deux excellents moyens de prototyper quelque chose comme ça facilement.

Ingénieur
la source
0

Vous êtes sur la bonne voie que l'algèbre linéaire et les mathématiques plus complexes impliquent généralement des graphiques 3D et de l'espace 3D. Mais il y a encore plus de mathématiques qui peuvent être faites dans les jeux 2D. Les mathématiques physiques peuvent devenir assez hardcore, et cela devient plus complexe si vous considérez la physique des corps mous et la dynamique de la spline B (et toujours en 2D, gardez à l'esprit)

Essayez de créer ou de disséquer une bibliothèque de physique qui couvrira la gestion des collisions et la réponse pour les formes 2D courantes. L'algèbre linéaire est assez utile pour calculer les vecteurs de trajectoire des collisions. Le produit scalaire est assez lié au cercle unitaire utilisé en trigonométrie. Pourtant, la complexité de la physique des corps rigides augmente de façon exponentielle lors de son application en 3D.

Les graphiques 3D vous permettent de mieux comprendre les calculs matriciels, les quaternions, l'algèbre linéaire et certains calculs appliqués. La première chose que vous comprendrez probablement est l'utilisation de matrices pour déplacer et manipuler des objets dans l'espace 3D.

ChrisC
la source
0

Si vous écrivez des jeux 2D, vous utilisez probablement déjà l'algèbre linéaire .. vous ne le savez tout simplement pas! L'apprentissage formel au moins des notions de base sur les vecteurs est assez facile, mais contribue grandement à simplifier la réflexion sur des mouvements par ailleurs complexes.

Par exemple, nous recevons beaucoup de questions ici sur les équations à utiliser pour simuler un mouvement courbe, comme pour un boulet de canon tiré d'un canon ou un missile à tête chercheuse. Mais si vous comprenez les vecteurs, la seule "équation" dont vous avez besoin est celle pour ajouter deux vecteurs ensemble. Non seulement cela, mais l'ajout de choses comme la traînée d'air ou la friction devient incroyablement simple - il suffit de calculer le vecteur de traînée et de l'ajouter à la vitesse. Presto!

BlueRaja - Danny Pflughoeft
la source