web-dev-qa-db-fra.com

Comment imprimer des valeurs vectorielles de type glm :: vec3 qui ont été passées par référence?

J'ai un petit chargeur obj et il prend deux paramètres et les transmet aux variables d'entrée .. cependant c'est ma première fois et je ne sais pas comment imprimer lesdites valeurs maintenant. Voici ma fonction principale pour tester si le chargeur fonctionne. J'ai deux vecteurs de type glm::vec3 pour contenir le sommet et les données normales.

std::vector<glm::vec3> vertices;
std::vector<glm::vec3> normals;    

int main() {
    bool test = loadOBJ("cube.obj", vertices, normals);
    for (int i = 0; i < vertices.size(); i++) {
       std::cout << vertices[i] << std::endl;   // problem line
    }

    return 0;   
}

La ligne commentée ci-dessus est ce qui génère des informations inutiles. Si je le laisse comme ça et que je lance le programme, je reçois un tas d'erreurs crachées sur moi (trop non formaté et trop long pour être collé ici) et si j'ajoute l'opérateur de référence, j'obtiens une sortie comme celle-ci:

0x711ea0
0x711eac
0x711eb8
0x711ec4    // etc

Une idée de ce que je fais mal?

40
iKlsR

glm a une extension pour cela. Ajouter #include "glm/ext.hpp" ou "glm/gtx/string_cast.hpp"

Puis pour imprimer un vecteur par exemple:

glm::vec4 test;
std::cout<<glm::to_string(test)<<std::endl;
99
user2103388

Je pense que la solution la plus élégante pourrait être une combinaison des deux réponses déjà publiées, avec l'ajout de modèles pour que vous n'ayez pas à réimplémenter l'opérateur pour tous les types de vecteur/matrice (cela limite cependant la définition de la fonction aux fichiers d'en-tête) .

#include <glm/gtx/string_cast.hpp>

template<typename genType>
std::ostream& operator<<(std::ostream& out, const genType& g)
{
    return out << glm::to_string(g);
}
14
JAB

glm::vec3 ne surcharge pas operator<< pour que vous ne puissiez pas imprimer le vecteur lui-même. Cependant, vous pouvez imprimer les membres du vecteur:

std::cout << "{" 
          << vertices[i].x << " " << vertices[i].y << " " << vertices[i].z 
          << "}";

Encore mieux, si vous l'utilisez beaucoup, vous pouvez surcharger operator<< toi même:

std::ostream &operator<< (std::ostream &out, const glm::vec3 &vec) {
    out << "{" 
        << vec.x << " " << vec.y << " "<< vec.z 
        << "}";

    return out;
}

Ensuite, pour imprimer, utilisez simplement:

std::cout << vertices[i];
12
chris