Ответ 1
glm имеет расширение для этого. Добавьте #include "glm/ext.hpp"
или "glm/gtx/string_cast.hpp"
Затем, чтобы напечатать вектор, например:
glm::vec4 test;
std::cout<<glm::to_string(test)<<std::endl;
У меня есть небольшой загрузчик obj, и он принимает два параметра и передает их обратно входным переменным. Однако это мой первый раз, и я не уверен, как печатать указанные значения сейчас. Вот моя основная функция, чтобы проверить, работает ли загрузчик. У меня есть два вектора типа glm::vec3
для хранения вершин и нормальных данных.
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;
}
Вышеупомянутая строка - это то, что генерирует бесполезную информацию. Если я оставлю это так и запустил программу, я получаю кучу ошибок, извергающихся на меня (слишком неформатированных и долгое время вставлять сюда), и если я добавлю ссылочный оператор, я получаю вывод следующим образом:
0x711ea0
0x711eac
0x711eb8
0x711ec4 // etc
Любая идея, что я делаю неправильно?
glm имеет расширение для этого. Добавьте #include "glm/ext.hpp"
или "glm/gtx/string_cast.hpp"
Затем, чтобы напечатать вектор, например:
glm::vec4 test;
std::cout<<glm::to_string(test)<<std::endl;
glm::vec3
не перегружает operator<<
, поэтому вы не можете распечатать сам вектор. Однако вы можете напечатать элементы вектора:
std::cout << "{"
<< vertices[i].x << " " << vertices[i].y << " " << vertices[i].z
<< "}";
Еще лучше, если вы используете это много, вы можете перегрузить operator<<
самостоятельно:
std::ostream &operator<< (std::ostream &out, const glm::vec3 &vec) {
out << "{"
<< vec.x << " " << vec.y << " "<< vec.z
<< "}";
return out;
}
Затем для печати просто используйте:
std::cout << vertices[i];
Я думаю, что наиболее элегантным решением может быть сочетание двух уже опубликованных ответов с добавлением шаблонов, поэтому вам не нужно переопределять оператор для всех векторных/матричных типов (это ограничивает определение функции заголовочными файлами, хотя).
#include <glm/gtx/string_cast.hpp>
template<typename genType>
std::ostream& operator<<(std::ostream& out, const genType& g)
{
return out << glm::to_string(g);
}