¿Cómo puedo imprimir valores vectoriales de tipo glm:: vec3 que se han pasado por referencia?


Tengo un pequeño cargador obj y toma dos parámetros y los pasa de nuevo a las variables de entrada.. sin embargo, esta es la primera vez que hago esto y no estoy seguro de cómo imprimir dichos valores ahora. Aquí está mi función principal para probar si el cargador está funcionando. Tengo dos vectores de tipo glm::vec3 para contener el vértice y los datos 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 línea comentada anteriormente es lo que está generando información inútil. Si lo dejo así y corro el programa me arrojan un montón de errores ( también sin formato y largo para pegar aquí) y si añado el operador de referencia obtengo una salida como esta:

0x711ea0
0x711eac
0x711eb8
0x711ec4    // etc

¿Alguna idea de lo que estoy haciendo mal?

Author: iKlsR, 2012-07-17

3 answers

Glm tiene una extensión para esto. Añadir #include "glm/ext.hpp" o "glm/gtx/string_cast.hpp"

Luego para imprimir un vector por ejemplo:

glm::vec4 test;
std::cout<<glm::to_string(test)<<std::endl;
 90
Author: user2103388,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-04 13:51:36

Creo que la solución más elegante podría ser una combinación de las dos respuestas ya publicadas, con la adición de plantillas para que no tenga que volver a implementar el operador para todos los tipos de vectores/matrices (esto restringe la definición de la función a los archivos de encabezado, sin embargo).

#include <glm/gtx/string_cast.hpp>

template<typename genType>
std::ostream& operator<<(std::ostream& out, const genType& g)
{
    return out << glm::to_string(g);
}
 12
Author: JAB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-27 14:58:52

glm::vec3 no sobrecarga operator<< por lo que no puede imprimir el vector en sí. Lo que puedes hacer, sin embargo, es imprimir los miembros del vector:

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

Aún mejor, si lo usas mucho, puedes sobrecargarte operator<< a ti mismo:

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

    return out;
}

Luego para imprimir, solo use:

std::cout << vertices[i];
 12
Author: chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-10 00:53:45