モデルをロードするために.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}
あなたのいうobjファイルというのは、なにをして出力されるものでしょうか。
objファイルってだけでは意味不明です
質問を修正しました。
"一応"完成したというこのプログラムにどういう結果を期待して、実際にはどういう結果が得られているのでしょう。
ざっと見て、行頭が#だったりmtlibだったりoだったりした時、その後の動作にとても不安を感じますが。
if (strcmp(lineHeader, "v") == 0) の際に0になりません。これも気がかりではるのですがそもそも
どうやるのかなと思いまして
> 0になりません
0になるはずなのですか? このプログラムでそれが成立する条件はどういうものだと考えていますか?
episteme氏の回答により解決しましたが別の問題が出来てしまいました。
回答1件
あなたの回答
tips
プレビュー