Vecteurs dans le développement de jeux

19

Je suis nouveau dans la programmation et la programmation de jeux. J'ai lu quelque chose sur les vecteurs et les mathématiques, mais j'ai une question - où utiliser les vecteurs dans la programmation de jeux? Peut-être que n'importe qui peut donner un exemple simple où vous utilisez des vecteurs (en 2D)?

J'ai trouvé des exemples mais la plupart du temps ils sont dans la console où ils produisent des nombres, et de grands exemples que je ne comprends pas.

vqwer
la source
Les vecteurs TL et DR de base font partie du sujet d'algèbre linéaire et mènent aux matricies. Avec Matricies et Linge Algebra, vous écrivez n'importe quoi, depuis un solveur de démineur jusqu'à une projection mondiale 3D pour voir quel objet se trouve sous votre curseur. L'algèbre linéaire est la branche la plus utile et la plus nécessaire des mathématiques pour tout développeur de jeux. Apprenez-le maintenant; vous ne le regretterez pas.
Robert Massaioli
Merci à tous pour les réponses géniales! Mais pourquoi quelque chose comme n'utilise pas les vecteurs dans ce tutoriel?: Zetcode.com/tutorials/javagamestutorial Ou un développeur utilise-t-il un autre non?
vqwer
Difficile à dire, probablement l'auteur voulait garder les choses simples et basiques pour les débutants.
Maik Semder
En fait, l'auteur les utilise, regardez le tableau de points class Star ici
Maik Semder
Aussi ici est Point2Dutilisé dansclass ResizeRectangle
Maik Semder

Réponses:

31

Quels sont les vecteurs?

Les vecteurs sont des ensembles de coordonnées de dimensions variables. Chaque coordonnée dans un vecteur représente une position absolue dans cette direction de l'espace dans lequel se trouve le vecteur.

  • Un vecteur 1-D serait {1} . Cela pourrait être, par exemple, une position à X = 1. Ou un temps t = 1.
  • Un vecteur 2D serait {-4,3} . Cela pourrait être, par exemple, une position à -4 sur l'axe X et 3 sur l'axe Y. Il pourrait également s'agir de la température (3 degrés) à une position (-4 mètres) en arrière sur l'axe X.
  • Un vecteur 3-D serait {1,2,3} . Cela pourrait être une position dans l'espace 1 le long de l'axe X, 2 en arrière sur l'axe Y et 3 en haut sur l'axe Z. Ou cela peut être 1 rouge, 2 verts et 3 bleus dans une couleur. Ou, il pourrait s'agir d'une position XY ( {1,2} ) à un moment T ( {3} ).

Notez que dans tous les cas, nous avons attribué une signification aux vecteurs pour notre problème. Bien que vous trouverez généralement des vecteurs utilisés pour la géométrie dans les jeux, il n'y a aucune raison que vous ne puissiez pas faire autre chose avec eux.

Pourquoi dois-je utiliser des vecteurs?

Tout d' abord, vous ne devez utiliser des vecteurs. Tant que vous gardez une trace de x et y, ou de toutes les coordonnées qui vous intéressent, d'une certaine manière, tout va bien.

Cependant, l'avantage d'utiliser des vecteurs est qu'ils représentent parfaitement des choses telles que la direction et la position, et ont également défini plusieurs opérations mathématiques qui vous facilitent la vie.

Pour un exemple simple de ceux-ci, considérons le produit scalaire .

Supposons que vous ayez un système radar dans un jeu de style descendant. Chaque ennemi qui apparaît dans le secteur du radar (un coin en forme de tarte en 2D) devrait avoir un petit point rouge sur votre écran. Donc, vous devez déterminer quels ennemis se trouvent dans votre section radar.

Vous pouvez tester si les ennemis sont à l'intérieur d'un triangle. Vous pouvez également tester si les ennemis sont contenus dans l'intersection des deux demi-espaces des plans / lignes définissant les deux côtés du secteur radar.

Ou, vous pouvez simplement utiliser un produit scalaire pour effectuer la vérification. Voici comment:

  1. Créez un vecteur allant du centre du radar vers "l'avant du radar". Normalisez-le.
  2. Créez un vecteur allant du centre du radar vers l'objet dont nous voulons vérifier la visibilité radar. Normalisez-le.
  3. Prenez le produit scalaire des deux vecteurs normalisés.
  4. Prenez l'arc cosinus de ce produit et vérifiez s'il est inférieur à la moitié de l'angle de la largeur du radar. Si c'est le cas, dessinez un blip.

Ceci est très pratique et vous permet également d'avoir des radars qui pointent dans différentes directions (changez simplement le vecteur avant) et ont des largeurs différentes (changez simplement l'angle de largeur du radar) - et vous pouvez également réutiliser le même code pour ces cas !

Sinon, pourquoi utiliser des vecteurs?

Si vous êtes en 2D, le meilleur moyen d'obtenir des effets et des mouvements complexes (rotation, mise à l'échelle, etc.) est peut-être d'utiliser un graphique de scène. Une planète a un navire en orbite, le navire a un drone en orbite. Le calcul pour cela sans utiliser les mathématiques vectorielles est vraiment, vraiment moche.

Avec les mathématiques vectorielles, nous représentons chacun comme ayant un point et une matrice de transformation 3x3. La planète utilise sa transformation, le navire utilise sa transformation et la transformation de la planète, et le drone utilise sa transformation et la transformation du navire et la transformation de la planète.

Lorsque la planète bouge, vous changez sa transformation et le vaisseau et le drone se positionnent automatiquement "gratuitement". Code beaucoup plus propre.

Toujours pas convaincu. Les vecteurs sont également la représentation native de la position, de la géométrie et du mouvement utilisée par presque toutes les bibliothèques graphiques - et certainement OpenGL et DirectX. Vous ne risquez pas de vous échapper sans avoir à les utiliser.

Conclusion Les vecteurs sont un outil puissant pour écrire du code clair qui résout les problèmes géométriques de manière propre et élégante.

ChrisE
la source
14

Un exemple 2D est des coordonnées d'écran, il identifie un pixel sur l'écran et a une composante x et une composante y [x, y], c'est-à-dire la position supérieure gauche de l'écran [0, 0]

Un autre exemple: imaginez un texte défilant de la bordure d'écran droite à la bordure d'écran gauche. Vous devez maintenant définir la vitesse du texte défilant en pixels par seconde, c'est-à-dire [-20, 0] ce qui signifie que le texte défile de 20 pixels vers la gauche par seconde et ne change jamais la hauteur.

Un autre exemple plus avancé: imaginez un jeu 2D qui est censé fonctionner sur différentes résolutions d'écran 800x600, 1024x768 etc. Cela peut facilement être fait en utilisant en interne une largeur d'écran de 0,0 à 1,0 et une hauteur de 0,0 à 1,0 pour découpler la logique du jeu à partir de la résolution d'écran réelle. Maintenant, lorsque vous dessinez à l'écran, vous multipliez simplement le vecteur interne par le vecteur de résolution:

screen_pos = internal_pos * screen_ressolution

notez que les 3 variables sont ici des vecteurs 2D, elles ont une composante x et une composante y, c'est-à-dire pour cette internal_pos [0,5, 0,25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Ainsi, la position interne [0,5, 0,25] est transformée en position d'écran réelle [400, 150]

C'était l'essentiel. Le véritable avantage des vecteurs est l'application en algèbre linéaire où vous pouvez utiliser des matrices pour transformer vos sommets (rotation, échelle, miroir, etc.), c'est-à-dire pour faire pivoter facilement toute votre position interne de 90 degrés, ou vous devez permuter l'écran-y position 0 de haut en bas de l'écran, car c'est-à-dire qu'une bibliothèque tierce que vous utilisez utilise cette convention.

Maik Semder
la source
Un vecteur n'est-il pas un tableau à une dimension, comme une liste quelconque? Lorsque nous parlons de résolution d'écran, ne parlons-nous pas d'un tableau multidimensionnel (une coordonnée pour chaque axe X et Y)? Juste pour être sûr que le «vecteur» n'est pas mélangé avec une matrice ici. =)
Will Marcouiller le
@ Les données complètes des pixels de l'écran peuvent-elles être traitées comme un tableau multidimensionnel, essentiellement une image bitmap, mais les valeurs de largeur et de hauteur, en d'autres termes la résolution, ne peuvent pas
Maik Semder
2
Notez qu'un vecteur est souvent traité assez différemment en mathématiques et en programmation. Mathématiquement parlant, un vecteur n'est pas un tableau multidimensionnel, bien que ses composants par rapport à une base définissent ensemble un tel tableau. Le vecteur lui-même est invariant aux coordonnées. L'opération screen_pos = internal_pos * screen_resolutionn'est pas invariante aux coordonnées comme vous l'avez écrite, elle pourrait être écrite de manière plus appropriée screen_pos = map_to_screen * internal_pos, où se map_to_screentrouve un mappage linéaire (qui peut être écrit comme une matrice, dans ce cas une diagonale).
leftaroundabout
6

Voici une excellente explication des vecteurs dans le développement de jeux sur le blog de Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

jhocking
la source
Il s'agit actuellement d'une réponse uniquement liée à un lien. Veuillez envisager d'inclure un résumé approximatif des principaux points que vous espérez qu'un lecteur pourrait glaner à partir de ce lien, afin que la réponse puisse se suffire à elle-même même si le lien change, se casse ou devient indisponible à l'avenir.
DMGregory
1

Un vecteur est une entité qui a à la fois une valeur et une direction. Des exemples de vecteurs dans le monde réel et des jeux basés sur la physique incluent la vitesse et l'élan. Les propriétés qui n'ont que des valeurs mais aucune direction sont appelées scalaires et incluent l'emplacement, la masse, la densité, etc.

Les vecteurs sont nécessaires pour les jeux qui émulent des propriétés physiques de type vectoriel (comme mentionné - vitesse, accélération, etc.). Les mathématiques utilisées pour les calculs vectoriels sont appelées algèbre linéaire .

Eran Galperin
la source
La vitesse est un scalaire, c'est la longueur du vecteur vitesse
Maik Semder
Correct - corrigé
Eran Galperin
1
et l'emplacement est généralement considéré comme un vecteur, c'est la distance qui est scalaire.
Ali1S232
La position peut être considérée à la fois comme un scalaire (ou une collection de scalaires) ou un vecteur qui pointe depuis le point de départ de l'axe.
Eran Galperin
1

Partout où vous avez un nombre pour chaque dimension pour représenter quelque chose, la collecte de ces nombres peut être considérée comme un vecteur. La position, la vitesse et l'accélération sont les principaux exemples de vecteurs. Dans certains cas, il peut également être pratique de représenter la direction de l'orientation comme vecteur.

Pour les choses de base, peu importe que vous considériez ou non ces nombres comme des vecteurs, mais si vous voulez faire n'importe quel type de physique, vous devez vous pencher sur les mathématiques vectorielles.

aaaaaaaaaaaa
la source
La position n'est pas un vecteur
Eran Galperin
La vitesse n'est pas non plus scalaire, la vitesse est un vecteur
Maik Semder
2
@Eran Galperin Je sais que c'est une opinion assez répandue parmi les mathématiciens. La distinction entre un point et son vecteur de position correspondant est cependant assez académique. Il n'y a aucune raison pratique de faire des histoires sur la distinction.
aaaaaaaaaaaa le
1
Il y a des raisons pratiques, une fois que vous travaillez avec des coordonnées et matrices homogènes 4D, vous devez faire cette distinction. Bien que cela ne soit pas pertinent pour la portée de cette question.
Maik Semder
@eBusiness ce n'est pas une "vue" c'est un fait. Et je suis physicien de formation, pas mathématicien.
Eran Galperin
0

Très simplement, tout ce qui a une position ou une direction, qui est partout dans un jeu, utilise des vecteurs. Un vecteur est comme un point

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Cependant, la différence se résume vraiment à cela. Un point n'est qu'un point, tandis qu'un vecteur est une flèche.

si tu as

Point2.x = 5;

Point2.y = 10;

vous dites que je veux dire à cet endroit x 5 et y 10.

mais quand vous déclarez un vecteur ...

Vector2.x = 5;

Vector2.y = 10; 

Votre vrai dire im déclarant une flèche de 0,0 à x 5, y 10;

vous pouvez même avoir le point à partir duquel votre vecteur pointe depuis un point dans l'espace de n'importe où, par exemple permet d'utiliser un point et un vecteur pour déplacer notre objet, nous utiliserons un Point2 pour stocker son emplacement et un vecteur2 pour le déplacer .

point2.x = 10;

point2.y = 15;

maintenant vous pouvez utiliser un vecteur pour déplacer ce point, disons que nous voulons déplacer ce point vers le haut de l'axe x 10 unités de sorte que vous avez

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

maintenant le point s'est déplacé là où votre flèche vectorielle le lui a indiqué.

le point est maintenant

point2.x = 20;

point2.y = 15;

Une dernière chose à noter est parfois qu'un vecteur est utilisé comme un point et vice versa simplement parce qu'ils contiennent le même type de données.

EddieV223
la source
Un point est un vecteur. C'est un vecteur de l'origine au point P.
The Communist Duck
1
@Duck techniquement parlant, ce n'est pas correct, se référant à des coordonnées homogènes, ce vecteur peut être trouvé en soustrayant le point d'origine du point de position, mais cela ne les rend pas égaux: v = pos - origindonc v != pospuisque l'origine est un point{0, 0, 0, 1}
Maik Semder
@Duck: Un point n'est pas un vecteur mais un point et l'origine définit un vecteur, qui est tout aussi bon que la plupart du temps si votre origine est 0.
@Canard alors pourquoi l'as-tu appelé ton point P? LOL
EddieV223