🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenGL

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

C++

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

Q&A

解決済

1回答

3247閲覧

.objファイルの頂点情報を読み込む方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/12/30 12:01

編集2020/12/30 12:09

モデルをロードするために.objファイルを読み込むためのローダーを作ったのですが頂点情報をどう読み込むかわかりません。一様完成していますがどうやってもモデルを読み込むif分の部分でおかしいと思われます正規のやり方ではどうすればいいのでしょうか?
※ objファイルはモデルで頂点データとUVデータと法線の値が入っています。

イメージ説明

cpp

1 2//objファイルを読み込み 3bool Game::Load_obj(const char* file, std::vector<glm::vec3>& out_vertices, std::vector<glm::vec2>& out_uvs, std::vector<glm::vec3>& out_normals) 4{ 5 6 7 std::vector<unsigned int> vertexIndices; //頂点インデックス 8 std::vector<unsigned int> uvIndices; //UV座標インデックス 9 std::vector<unsigned int> normalIndices; //法線インデックス 10 std::vector<unsigned int> out_vertexIndices; 11 12 std::vector<glm::vec3> temp_vertices; 13 std::vector<glm::vec2> temp_uvs; 14 std::vector<glm::vec3> temp_normals; 15 16 FILE* fp = nullptr; 17 fopen_s(&fp, file, "r"); //読み込み専用でファイルを開く 18 19 //.objファイルを表示 20 char str[256] = { 0 }; 21 if (fp != nullptr) { 22 while (fgets(str, 256, fp) != NULL) 23 { 24 printf("%s", str); 25 } 26 } 27 28 if (fp != NULL) 29 { 30 while (true) 31 { 32 char lineHeader[5000] = { 0 }; 33 int res = fscanf_s(fp, "%s",lineHeader, (unsigned int )strlen(lineHeader)); 34 // printf("%s\n", lineHeader); 35 36 if (res == EOF) 37 { 38 break; 39 } 40 else 41 { 42 //ファイル抽出 43 44 //頂点を抽出 45 if (strcmp(lineHeader, "v") == 0) 46 { 47 glm::vec3 vertex; 48 fscanf_s(fp, "%f %f %f", &vertex.x, &vertex.y, &vertex.z); 49 //out_vertices.push_back(vertex); 50 temp_vertices.push_back(vertex); 51 printf("aaaa \n"); 52 53 } 54 //UV座標を抽出 55 else if (strcmp(lineHeader, "vt") == 0) 56 { 57 glm::vec2 uv = glm::vec2(0, 0); 58 fscanf_s(fp, "%f %fn", &uv.x, &uv.y); 59 temp_uvs.push_back(uv); 60 } 61 //法線を抽出 62 else if (strcmp(lineHeader, "vn") == 0) 63 { 64 glm::vec3 normalize = glm::vec3(0, 0, 0); 65 fscanf_s(fp, "%f %f %fn", &normalize.x, &normalize.y, &normalize.z); 66 temp_normals.push_back(normalize); 67 } 68 else if (strcmp(lineHeader, "f") == 0) 69 { 70 // std::string vertex1, vertex2, vertex3; 71 unsigned int vertexIndex[3], uvIndex[3], normalIndex[3]; 72 73 int matches = fscanf_s(fp, "%d/%d/%d %d/%d/%d %d/%d/%d", 74 &vertexIndex[0], &vertexIndex[1], &vertexIndex[2], 75 &uvIndex[0], &uvIndex[1], &uvIndex[2], 76 &normalIndex[0], &normalIndex[1], &normalIndex[2]); 77 78 if (matches != 9) 79 { 80 printf("エラー\n"); 81 return false; 82 } 83 84 vertexIndices.push_back(vertexIndex[0]); 85 vertexIndices.push_back(vertexIndex[1]); 86 vertexIndices.push_back(vertexIndex[2]); 87 88 uvIndices.push_back(uvIndex[0]); 89 uvIndices.push_back(uvIndex[1]); 90 uvIndices.push_back(uvIndex[2]); 91 92 normalIndices.push_back(normalIndex[0]); 93 normalIndices.push_back(normalIndex[1]); 94 normalIndices.push_back(normalIndex[2]); 95 } 96 } 97 } 98 99 100 //頂点を設定 101 for (unsigned int i = 0; i < vertexIndices.size(); i++) 102 { 103 unsigned int vertexIndex = vertexIndices[i]; 104 glm::vec3 vertex = temp_vertices[vertexIndex - 1]; 105 out_vertices.push_back(vertex); 106 } 107 printf("%d\n",out_vertices.size()); 108 //UVを設定 109 for (unsigned int i = 0; i < uvIndices.size(); i++) 110 { 111 unsigned int uvIndex = uvIndices[i]; 112 glm::vec2 uv = temp_uvs[uvIndex - 1]; 113 out_uvs.push_back(uv); 114 } 115 116 //法線を設定 117 for (unsigned int i = 0; i < normalIndices.size(); i++) 118 { 119 unsigned int normalIndex = normalIndices[i]; 120 glm::vec3 normalize = temp_normals[normalIndex - 1]; 121 out_normals.push_back(normalize); 122 } 123 124 125 126// printf(".objファイル読み込み完了!\n"); 127 return true; 128 } 129 else 130 { 131 printf("ファイルが読めませんでした。\n"); 132 return false; 133 } 134}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/12/30 12:03

あなたのいうobjファイルというのは、なにをして出力されるものでしょうか。 objファイルってだけでは意味不明です
退会済みユーザー

退会済みユーザー

2020/12/30 12:09

質問を修正しました。
thkana

2020/12/30 13:21

"一応"完成したというこのプログラムにどういう結果を期待して、実際にはどういう結果が得られているのでしょう。 ざっと見て、行頭が#だったりmtlibだったりoだったりした時、その後の動作にとても不安を感じますが。
退会済みユーザー

退会済みユーザー

2020/12/30 13:23

if (strcmp(lineHeader, "v") == 0) の際に0になりません。これも気がかりではるのですがそもそも どうやるのかなと思いまして
thkana

2020/12/30 13:32

> 0になりません 0になるはずなのですか? このプログラムでそれが成立する条件はどういうものだと考えていますか?
退会済みユーザー

退会済みユーザー

2020/12/31 00:34

episteme氏の回答により解決しましたが別の問題が出来てしまいました。
guest

回答1

0

ベストアンサー

C

1 //.objファイルを表示 2 char str[256] = { 0 }; 3 if (fp != nullptr) { 4 while (fgets(str, 256, fp) != NULL) 5 { 6 printf("%s", str); 7 } 8 }

ここ↑でファイルをぜーんぶ読み尽くしてるから、その後の読み込みは失敗するんじゃなくて?

投稿2020/12/30 14:15

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/31 00:33

一様治りましたが今度は無限ループしてしまうのですがどうすればいいのでしょうか?
episteme

2020/12/31 00:59 編集

# 一様? ...あぁ、「一応」ね。 質問ヘタクソ。 > 無限ループしてしまうのですが なぜ無限ループするのか、調べた? 考えた? ...で、解決してないのにベストアンサーつけるの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問