OpenGL - Comprendre la relation entre le modèle, la vue et la matrice mondiale

8

J'ai un peu de mal à comprendre comment ces matrices fonctionnent et comment les configurer les unes par rapport aux autres pour obtenir un bon fonctionnement du système.

À ma connaissance, la matrice de modèle est la matrice d'un objet, par exemple un cube ou une sphère, il y en aura beaucoup dans l'application / le jeu.

La World Matrix est la matrice qui définit l'origine du monde 3D. le point de départ.

Et la matrice de vue est la "caméra", tout est traduit avec cela pour vous assurer que vous avez l'illusion d'une caméra réelle alors qu'en fait tout bouge à la place de cette matrice?

Je suis un peu perdu ici. J'espérais donc que quelqu'un ici pourrait m'aider à bien comprendre cela.

Est-ce que chaque modelMatrix est traduit / multiplié avec la matrice du monde et le worldMatrix puis avec le viewMatrix? Ou est-ce que chaque modelMatrix est traduit / multiplié avec le viewMatrix et ensuite avec le worldMatrix?

Comment toutes ces matrices sont-elles liées et comment configurez-vous un monde avec plusieurs objets et une "caméra"?

ÉDITER:

Merci beaucoup pour les commentaires déjà. J'ai fait quelques recherches sur Google et je pense que je le comprends un peu mieux maintenant, mais serait-il possible d'obtenir des conseils sur le pseudo-code?

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

Dois-je multiplier ou traduire le viewMatrix avec le modelMatrix ou l'inverse? et quoi encore? J'ai actuellement une méthode de dessin telle qu'elle n'a besoin que de 2 matrices pour les arguments à dessiner.

Voici ma méthode de tirage:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

Quelles sont ces matrices supposées être? Merci beaucoup d'avance à nouveau les gars.

Sam
la source
1
Savez-vous ce qu'est la matrice? Savez-vous comment multiplier les matrices / vecteurs? Savez-vous ce que représente la matrice (transformations linéaires / affines)? Si vous ne le faites pas, vous feriez mieux de commencer par des mathématiques en premier.
Ivan Kuckir
Probablement une bonne idée de se concentrer là-dessus. une idée de quoi rechercher ou de bonnes sources que vous connaissez en ligne?
Sam
1
Progressez jusqu'à l'algèbre linéaire, puis recherchez le rendu 3D de base, puis les didacticiels. Les intertubes regorgent de bonnes sources mais vous devez le faire étape par étape ou, comme vous l'avez remarqué, vous vous perdez totalement.
Patrick Hughes

Réponses:

19

Dans une scène de rendu 3D, trois matrices principales sont généralement utilisées pour transformer un objet de son propre espace local (espace objet / modèle) en un espace homogène appelé espace d'écran.

Monde

  • La matrice mondiale étant la première, est unique pour chaque objet de votre monde et est responsable de la transformation des sommets d'un objet de son propre espace local, en un système de coordonnées commun appelé espace mondial.

Vue

  • Après cela, la matrice de vue fournit le concept d'une caméra mobile, alors qu'en réalité, la caméra est en fait le seul point de référence constant dans le monde. La matrice de vue est une transformation qui est appliquée à chaque objet de la scène (mais qui n'est pas unique à chaque objet) et fournit l'illusion d'une caméra. La matrice de vue est essentiellement l'inverse de ce qui pourrait être considéré comme une matrice mondiale pour la caméra. Pourtant, au lieu de déplacer la caméra elle-même, elle fournit les mouvements opposés au reste de la scène (l'illusion;)).

Projection

  • Enfin, la matrice de projection est chargée de convertir un monde 3D en un espace d'écran homogène que vous voyez sur votre écran. Il s'agit de la matrice utilisée pour représenter votre tronc de vue, et est généralement représentée sous forme de projection orthographique ou en perspective.

Au niveau le plus simple, chacun de vos objets doit contenir sa propre matrice de monde, votre "scène" ou le contexte que vous utilisez doit contenir une matrice de vue pour représenter une caméra et une matrice de projection pour convertir les coordonnées du monde en coordonnées d'écran. Tous ces éléments doivent ensuite être passés au vertex shader (avec la matrice du monde changeant pour chaque objet, mais pas nécessairement la vue ou la projection) pour être transformés.

Evan
la source
J'ai mis à jour mon message, pourriez-vous peut-être m'aider avec le pseudo-code que j'ai écrit pour m'aider à mieux comprendre la réponse?
Sam
Puis-je prendre le texte exact de cette réponse sans créer de violation du droit d'auteur?
arandomguy
1
Oui, vous pouvez l'utiliser
Evan
La matrice "World" ne devrait-elle pas être appelée matrice "Model", et la combinaison de Model et View, la matrice "ModelView", devrait-elle être la matrice "World"?
BAR
La terminologie exacte peut varier selon la base de code utilisée. Certains pipelines de rendu combinent certaines matrices, tandis que d'autres les laissent divisées. J'ai vu certains systèmes utiliser la terminologie que vous décrivez ici.
Evan
3

La bonne réponse est ici /programming/6461740/xna-worldmatrix-and-viewmatrix

Tout d'abord, il n'y a pas de réelle différence entre une "World Matrix" et une "View Matrix" , ce sont toutes les deux des matrices de transformation et la distinction est quelque peu arbitraire. Certains systèmes combinent même les deux (OpenGL a simplement une matrice "ModelView" ).

Traditionnellement, la «matrice mondiale» est utilisée pour déplacer des modèles individuels de «l'espace modèle» vers «l'espace mondial». Ensuite, la «matrice de vue» est utilisée pour déplacer tous les modèles de l'espace mondial dans leurs positions relatives devant la caméra (qui, en fait, «déplace la caméra»). Et enfin la "Projection Matrix" convertit les positions 3D en leurs positions 2D sur l'écran (généralement avec une projection en perspective). Parce que ce sont des matrices, elles peuvent être multipliées ensemble en une seule matrice qui peut transformer des points en une seule étape.

Rusty Shackelford
la source