web-dev-qa-db-ja.com

参照渡しされたglm :: vec3型のベクトル値を印刷するにはどうすればよいですか?

小さなobjローダーがあり、2つのパラメーターを取り、それらを入力変数に渡します。ただし、これを行うのはこれが初めてであり、この値を印刷する方法がわかりません。ローダーが動作しているかどうかをテストするための主な機能は次のとおりです。頂点と通常のデータを保持するために、glm::vec3型の2つのベクトルがあります。

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

私が間違っていることを知っていますか?

40
iKlsR

glmにはこのための拡張機能があります。 #include "glm/ext.hpp"または"glm/gtx/string_cast.hpp"を追加します

次に、たとえばベクトルを印刷するには:

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

最もエレガントな解決策は、すでに投稿された2つの回答とテンプレートの追加であり、すべてのベクトル/行列タイプに対して演算子を再実装する必要がないと思います(ただし、関数定義はヘッダーファイルに制限されます) 。

#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はオーバーロードしません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];
12
chris