如何打印已通过引用传递的glm :: vec3类型的向量值?

iKl*_*lsR 41 c++ glm-math

我有一个小的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;   
}
Run Code Online (Sandbox Code Playgroud)

上面评论的那条线是产生无用信息的原因.如果我这样离开并运行该程序,我会收到一堆错误(对于我来说太未格式化并且很长时间粘贴),如果我添加引用运算符,我会得到如下输出:

0x711ea0
0x711eac
0x711eb8
0x711ec4    // etc
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

小智 105

glm对此有一个扩展.添加#include "glm/ext.hpp"或"glm/gtx/string_cast.hpp"

然后打印一个矢量,例如:

glm::vec4 test;
std::cout<<glm::to_string(test)<<std::endl;
Run Code Online (Sandbox Code Playgroud)

  • NTS:您还需要添加`GLM_ENABLE_EXPERIMENTAL`才能使用`glm :: to_string`。(`glm 0.9.9.3`) (3认同)
  • 还要在包含之前键入它! (3认同)
  • 对 Self 和其他 c/cpp n00bs 的注意:上面的注释意味着类型“`#define GLM_ENABLE_EXPERIMENTAL`” (2认同)

JAB*_*JAB 15

我认为最优雅的解决方案可能是已经发布的两个答案的组合,添加了模板,因此您不必为所有矢量/矩阵类型重新实现运算符(这会将函数定义限制为头文件) .

#include <glm/gtx/string_cast.hpp>

template<typename genType>
std::ostream& operator<<(std::ostream& out, const genType& g)
{
    return out << glm::to_string(g);
}
Run Code Online (Sandbox Code Playgroud)

  • 这只会给我“模棱两可的过载”。 (2认同)
  • 仅当其中一个模板参数无法展开时,SFINAE才有效.要解决模糊的重载,包括`<type_traits>`和`<utility>`,然后使用`template <typename GLMType,typename = decltype(glm :: to_string(std :: declval <GLMType>()))>` (2认同)

Gru*_*bel 15

GLM 已operator<<()在<glm/gtx/io.hpp>

#include <iostream>
#include <glm/glm.hpp>
#include <glm/gtx/io.hpp>

int main()
{
   glm::vec3 v(1.0f, 2.0f, 3.0f);
   std::cout << v << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

[    1.000,    2.000,    3.000]
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 12

glm::vec3没有超载,operator<<所以你不能打印矢量本身.但是,你可以做的是打印向量的成员:

std::cout << "{" 
          << vertices[i].x << " " << vertices[i].y << " " << vertices[i].z 
          << "}";
Run Code Online (Sandbox Code Playgroud)

更好的是,如果你经常使用它,你可以超负荷operator<<:

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

    return out;
}
Run Code Online (Sandbox Code Playgroud)

然后打印,只需使用:

std::cout << vertices[i];
Run Code Online (Sandbox Code Playgroud)

  • 把它放在 glm 提供的方面可能更好:`operator &lt;&lt;(...) { return out &lt;&lt; glm::to_string(vec); }` (2认同)