質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.46%

  • C++

    4555questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenGL

    211questions

    OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

  • GLFW

    16questions

tinyobjloaderによって読み込んだ情報で描画する方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 434

ShiiTakumi

score 9

3DCGモデル(WavefrontOBJ/.obj)をOpenGLによって読み込んで描画をしたいのですが、そのモデルを描画するための実装に詰んでいるところです。

読み込みはhttps://github.com/syoyo/tinyobjloader/blob/master/tiny_obj_loader.h
のtinyobjloader.hと、
https://github.com/syoyo/tinyobjloader/blob/master/examples/callback_api/main.cc
のmain.ccを使っています。
(言語はC++です。)

読み込みが出来たのは良いのですが、ここから
1.windowを生成(GLFWを利用して実現)
2.投資投影手法で描画
と取り組みたいのですが、2を実現するためのコーディングに詰んでおります。

現状の私の手元のコードは上記のmain.ccそのままです。
読み取った頂点座標情報等をどう上手く利用して描画に持ち込めばいいのか…。

調べても作業が進まず、C++やOpenGLに関して勉強不足を大変痛感しております。
基礎から学んでいる途中でもあり、1週間経っても進まなかったので助言を賜りたく投稿いたしました。

超初心者ですがご教授のほど、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

obj ファイルに入っている情報は、各ポリゴンの各頂点ごとの「座標 (x, y, z)」「法線 (x, y, z)」「色 (r, g, b)」「テクスチャ座標 (x, y)」です。

基本的にこのポリゴンは三角形であり、複雑なオブジェクトも三角形が集まってできています。

なので、まずは以下のコードを作成してみて、それを objloader で取得できた三角形分繰り返すようにあとで変更すればいいかと思います。

  • 三角形のポリゴンを描画する OpenGL のコード
  • 三角形のポリゴンにテクスチャを適用して描画する OpenGL のコード
  • 透視投影変換やライトの設定

 tinyobjloader で各ポリゴンの情報を取得する例

1つの頂点は複数の面で共有されているため、各頂点の情報にはインデックス経由でアクセスします。
(同じ頂点でも面ごとに情報を持つようにすると、重複して無駄なため、obj ファイルフォーマットではそうなっている。)

tinyobj::attrib_t attrib;
std::vector<tinyobj::shape_t> shapes;
std::vector<tinyobj::material_t> materials;
std::string error;

bool ret = tinyobj::LoadObj(
    &attrib,
    &shapes,
    &materials,
    &error,
    R"(test.obj)");

if (!error.empty())
    std::cerr << error << std::endl;

if (!ret)
    exit(1);

for (const auto &shape : shapes) {
    // shape の名前
    std::cout << shape.name << std::endl;

    size_t index_offset = 0;  // インデントのオフセット
    for (size_t f = 0; f < shape.mesh.num_face_vertices.size(); f++) {
        // 面 f を構成sする頂点の数
        int num_vertices = shape.mesh.num_face_vertices[f];

        glBegin(GL_TRIANGLES);
        for (size_t v = 0; v < num_vertices; v++) {
            // access to vertex
            tinyobj::index_t idx = shape.mesh.indices[index_offset + v];

            // 頂点の座標
            float vx = attrib.vertices[3 * idx.vertex_index + 0];
            float vy = attrib.vertices[3 * idx.vertex_index + 1];
            float vz = attrib.vertices[3 * idx.vertex_index + 2];

            // 頂点の法線
            float nx = attrib.normals[3 * idx.normal_index + 0];
            float ny = attrib.normals[3 * idx.normal_index + 1];
            float nz = attrib.normals[3 * idx.normal_index + 2];

            // 頂点のテクスチャ座標
            tinyobj::real_t tx =
                attrib.texcoords[2 * idx.texcoord_index + 0];
            tinyobj::real_t ty =
                attrib.texcoords[2 * idx.texcoord_index + 1];

            // 頂点の色
            float red = attrib.colors[3 * idx.vertex_index + 0];
            float green = attrib.colors[3 * idx.vertex_index + 1];
            float blue = attrib.colors[3 * idx.vertex_index + 2];
        }
        index_offset += num_vertices;

        // per-face material
        shape.mesh.material_ids[f];
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C++

    4555questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenGL

    211questions

    OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

  • GLFW

    16questions