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.
Réponses:
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:Ensuite, vous appliqueriez simplement la vitesse à la position de chaque image:
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: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 variablesfx
etfy
sur 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).la source
object.position++
. Je vais clarifier la réponse.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.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érentobject.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:
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.
la source
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.
la source
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.
la source
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!
la source