Construisons un moteur graphique 3D points, vecteurs et concepts de base

Les moteurs de jeux 3D qui se cachent derrière les plus grands jeux d'aujourd'hui sont des travaux stupéfiants de mathématiques et de programmation, et de nombreux développeurs de jeux trouvent qu'il est difficile de les comprendre dans leur intégralité. Si vous manquez d'expérience (ou d'un diplôme universitaire, comme moi), cette tâche devient encore plus ardue. Dans cette série, mon objectif est de vous présenter les bases des systèmes graphiques dans les moteurs 3D..

Plus précisément, dans ce didacticiel, nous aborderons des points et des vecteurs, ainsi que tout le plaisir qui en découle. Si vous maîtrisez l'algèbre (variables et maths de variables) et l'informatique (notions de base de tout langage de programmation orienté objet), vous devriez pouvoir suivre la plupart de ces tutoriels, mais si vous rencontrez des difficultés l'un des concepts, s'il vous plaît poser des questions! Certains de ces sujets peuvent être terriblement difficiles.

Vous pouvez également obtenir une aide supplémentaire sur Envato Studio, où vous trouverez de nombreux services de conception et de modélisation 3D fantastiques à des prix abordables.. 

Services de conception et de modélisation 3D sur Envato Studio

Notions de base des systèmes de coordonnées

Commençons par les bases. Les graphiques en trois dimensions nécessitent le concept d'un espace en trois dimensions. Le plus utilisé de ces espaces est appelé espace cartésien, ce qui nous donne l'avantage des coordonnées cartésiennes (les notations de base \ ((x, y) \) et les graphes 2D espacés d'une grille enseignés dans la plupart des lycées)..


Sur la photo: le fléau de l'existence de nombreux lycéens.

L'espace cartésien à 3 dimensions nous donne un axe x, y et z (décrivant la position en fonction du placement horizontal, du placement vertical et de la profondeur, respectivement). Les coordonnées de tout point dans cet espace sont indiquées par un tuple (dans ce cas, un triplet, puisqu'il y a trois axes). Sur un plan à 2 dimensions, un tuple pourrait être représenté par \ ((x, y) \), et dans un plan à 3 dimensions, il est représenté par \ ((x, y, z) \). L'utilisation de ce 3-tuple est qu'il montre l'emplacement d'un point par rapport à l'origine de l'espace (qui lui-même est généralement représenté par \ ((0,0,0) \)).

Pointe: Tuple: liste (ou séquence) ordonnée d'éléments en informatique ou en mathématiques. Ainsi, \ ((K, y, l, e) \) serait un 4-tuple, montrant une séquence de caractères qui composent mon nom.

Dans cet espace, nous allons définir un point comme représentation d'un triplet. Cela peut aussi être montré comme:

\ [P = (x, y, z) \]

En plus de cette définition d'un point, il faut définir ses parties.

Chacun des éléments de ce 3-tuple est un scalaire (nombre) qui définit une position le long d'un vecteur de base. Chaque vecteur de base doit avoir une longueur d’unité (c’est-à-dire une longueur d’exactement 1), donc 3-tuples tels que \ ((1,1,1) \) et \ ((2,2,2) \) ne peuvent pas être des vecteurs de base car ils sont trop longs.

Nous définissons trois vecteurs de base pour notre espace:

\ [\ begin aligné
X & = (1,0,0) \\
Y & = (0,1,0) \\
Z & = (0,0,1)
\ end aligné \]


La source: http://www.thefullwiki.org/Arithmetics/Cartesian_Coordinate.

Le système de coordonnées

Parlons maintenant de la définition mathématique de notre système de coordonnées, de son incidence sur notre système graphique et des calculs que nous pouvons effectuer..

Représentant des points

le point d'origine de notre système de coordonnées peut être décrit comme le point \ (O \), qui représente le 3 -uple (0,0,0). Cela signifie que la représentation mathématique de notre système de coordonnées peut être décrite comme suit:

\ [\ O; X, Y, Z \ \]

Par cette affirmation, vous pouvez dire que \ ((x, y, z) \) représente la position d'un point par rapport à l'origine. Cette définition signifie également que tout point \ (P \), \ ((a, b, c) \), peut être représenté par:

\ [P = O + aX + bY + cZ \]

A partir de là, je ferai référence aux scalaires en minuscule et aux vecteurs en majuscules - ainsi \ (a \), \ (b \) et \ (c \) sont des scalaires et \ (X \), \ ( Y \) et \ (Z \) sont des vecteurs. (Ce sont en fait les vecteurs de base que nous avons définis précédemment.)

Cela signifie qu'un point dont le tuple est (2,3,4) pourrait être représenté par:

\ [\ begin aligné
(2,3,4) & = (2,0,0) + (0,3,0) + (0,0,4) \\
& = (0,0,0) + (2,0,0) + (0,3,0) + (0,0,4) \\
& = (0,0,0) + 2 (1,0,0) + 3 (0,1,0) + 4 (0,0,1) \\
& = O + 2X + 3Y + 4Z \\
\ end aligné \]

Nous avons donc pris ce concept abstrait de "point dans l'espace 3D" et l'avons défini comme quatre objets distincts ajoutés. Ce type de définition est très important chaque fois que nous voulons mettre un concept dans le code.

Mutuellement perpendiculaire

Le système de coordonnées que nous utiliserons possède également la propriété précieuse d’être mutuellement perpendiculaire. Cela signifie qu'il existe un angle de 90 degrés entre chacun des axes où ils se rencontrent dans leurs plans respectifs.


Notre système de coordonnées sera également défini comme "droitier":

Source: http://viz.aset.psu.edu/gho/sem_notes/3d_fundamentals/html/3d_coordinates.html.

En termes mathématiques, cela signifie que:

\ [X = Y \ fois Z \]

… Où \ (\ times \) représente l'opérateur multi-produit.

Si vous n'êtes pas sûr de ce qu'est un produit mixte, vous pouvez le définir à l'aide de l'équation suivante (en supposant que vous ayez deux tuples 3):

\ [(a, b, c) \ times (d, e, f) = (bf - ce, cd - af, ae - bd) \]

Ces déclarations peuvent sembler fastidieuses, mais elles nous permettront ultérieurement de faire beaucoup plus facilement une variété de calculs et de transformations. Heureusement, vous n'avez pas à mémoriser toutes ces équations lors de la construction d'un moteur de jeu. Vous pouvez simplement construire à partir de ces instructions, puis créer des systèmes encore moins compliqués. Eh bien, jusqu'à ce que vous ayez à éditer quelque chose de fondamental dans votre moteur et à vous rafraîchir à nouveau!


Points et vecteurs

Avec toutes les bases de notre système de coordonnées verrouillées, il est temps de parler de points et de vecteurs et, plus important encore, de la manière dont ils interagissent les uns avec les autres. La première chose à noter est que les points et les vecteurs sont des choses nettement différentes: un point est un emplacement physique dans votre espace; un vecteur est l'espace entre deux points.


Pour éviter toute confusion, j'écrirai les points en italique majuscule, sous la forme \ (P \), et les vecteurs en majuscules gras, sous la forme \ (\ mathbf V \)..

Nous allons traiter deux axiomes principaux lors de l’utilisation de points et de vecteurs:

  • Axiome 1: La différence de deux points est un vecteur, donc \ (\ mathbf V = P - Q \)
  • Axiome 2: La somme d'un point et d'un vecteur est un point, donc \ (Q = P + \ mathbf V \)
Pointe: Un axiome est un point de raisonnement, souvent considéré comme assez évident pour être accepté sans argument.

Construire le moteur

Ces axiomes étant énoncés, nous disposons maintenant de suffisamment d'informations pour créer les classes de blocs de construction qui sont au cœur de tout moteur de jeu 3D: Point la classe et la Vecteur classe. Si nous devions créer notre propre moteur à l'aide de ces informations, il y aurait d'autres étapes importantes à suivre lors de la création de ces classes (principalement liées à l'optimisation ou aux API existantes), mais nous allons les laisser pour le souci de la simplicité.

Les exemples de classe ci-dessous vont tous être en pseudo-code afin que vous puissiez suivre le langage de programmation de votre choix. Voici les grandes lignes de nos deux classes:

Classe de points Variables: num tuple [3]; // (x, y, z) Opérateurs: Point AddVectorToPoint (Vector); Point SubtractVectorFromPoint (Vector); Vecteur SubtractPointFromPoint (Point); Function: // plus tard, cela appellera une fonction d'une API graphique, mais pour l'instant, // devrait simplement imprimer les coordonnées des points sur l'écran drawPoint; 
Classe de vecteur Variables: num tuple [3]; // (x, y, z) Opérateurs: vecteur AddVectorToVector (vecteur); Vecteur SubtractVectorFromVector (vecteur); 

En guise d’exercice, essayez de renseigner chacune des fonctions de cette classe avec un code fonctionnel (en fonction de ce que nous avons décrit jusqu’à présent). Une fois que tout est terminé, testez-le en créant cet exemple de programme:

main var point1 = nouveau point (1,2,1); var point2 = nouveau point (0,4,4); var vecteur1 = nouveau vecteur (2,0,0); var vecteur2; point1.drawPoint (); // devrait afficher (1,2,1) point2.drawPoint (); // devrait afficher (0,4,4) vector2 = point1.subtractPointFromPoint (point2); vector1 = vector1.addVectorToVector (vector2); point1.addVectorToPoint (vector1); point1.drawPoint (); // devrait afficher (4,0, -2) point2.subtractVectorFromPoint (vector2); point2.drawPoint (); // devrait afficher (-1,6,7)

Conclusion

Vous avez réussi jusqu'à la fin! Cela peut sembler énormément de maths de ne faire que deux cours - et c'est définitivement le cas. Dans la plupart des cas, vous n’aurez jamais à travailler sur un jeu de ce niveau, mais avoir une connaissance intime du fonctionnement de votre moteur de jeu est néanmoins utile (même si ce n’est que pour la satisfaction de soi)..

Si vous pensiez que cela était amusant, assurez-vous de consulter mon prochain tutoriel sur les bases du système graphique: transformations!

Bien sûr, une fois que vous avez créé le moteur graphique, vous devez ajouter du contenu. N'hésitez donc pas à consulter la vaste sélection d'actifs de jeu et de modèles 3D sur Envato Market..