c++ - resueltos - ¿Cómo imprimo valores vectoriales del tipo glm:: vec3 que se han pasado por referencia?
vectores en c++ pdf (3)
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 vector / matriz (esto restringe la definición de la función a archivos de encabezado) .
#include <glm/gtx/string_cast.hpp>
template<typename genType>
std::ostream& operator<<(std::ostream& out, const genType& g)
{
return out << glm::to_string(g);
}
Tengo un cargador obj pequeño y toma dos parámetros y los devuelve 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 arriba es lo que genera información inútil. Si lo dejo así y ejecuto el programa, me arrojan un montón de errores ( demasiado sin formato y largos para pegar aquí ) y si agrego el operador de referencia obtengo un resultado como este:
0x711ea0
0x711eac
0x711eb8
0x711ec4 // etc
¿Alguna idea de lo que estoy haciendo mal?
glm tiene una extensión para esto. Agregar #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;
glm::vec3
no sobrecarga el 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 usa mucho, puede sobrecargar al operator<<
usted 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];