提示コードですがコメント部のfscanf_s(); 関数部ですがなぜ最初の数字だけ設定された他の2番目、3番目の場合は数字が設定されないのでしょうか? 理由がわかりません。printf();でデバッグしていますがなぜかpos[1] pos[2]の場合だけ数字が設定されません。これはどうすればしょうか・上のコードのように普通にコードを組めばいいと思うのですがなぜでしょうか?
参考サイト: http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-7-model-loading/
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 std::vector<unsigned int> vertexIndices; //頂点インデックス 7 std::vector<unsigned int> uvIndices; //UV座標インデックス 8 std::vector<unsigned int> normalIndices; //法線インデックス 9 10 11 12 std::vector<glm::vec3> temp_vertices; 13 std::vector<glm::vec2> temp_uvs; 14 std::vector<glm::vec3> temp_normals; 15 16 17 std::vector<int> index_pos; 18 std::vector<int> index_uv; 19 std::vector<int> index_norm; 20 21 FILE* fp = nullptr; 22 fopen_s(&fp, file, "r"); //読み込み専用でファイルを開く 23 24 /* 25 //.objファイルを表示 26 char str[256] = { 0 }; 27 if (fp != nullptr) { 28 while (fgets(str, 256, fp) != NULL) 29 { 30 printf("%s", str); 31 } 32 } 33 */ 34 35 int a = 0; 36 if (fp != NULL) 37 { 38 while (true) 39 { 40 char lineHeader[256] = { 0 }; 41 int res = fscanf_s(fp, "%s", lineHeader, (unsigned int)sizeof(lineHeader)); 42 43 if (res == EOF) 44 { 45 break; 46 } 47 else 48 { 49 /* ################ ファイル抽出 ################ */ 50 51 if (strcmp(lineHeader, "v") == 0) //頂点を抽出 52 { 53 glm::vec3 vertex; 54 fscanf_s(fp, "%f %f %f", &vertex.x, &vertex.y, &vertex.z); 55 temp_vertices.push_back(vertex); 56 } 57 else if (strcmp(lineHeader, "vt") == 0) //UV座標を抽出 58 { 59 glm::vec2 uv = glm::vec2(0, 0); 60 fscanf_s(fp, "%f %fn", &uv.x, &uv.y); 61 temp_uvs.push_back(uv); 62 } 63 else if (strcmp(lineHeader, "vn") == 0) //法線を抽出 64 { 65 glm::vec3 normalize = glm::vec3(0, 0, 0); 66 fscanf_s(fp, "%f %f %fn", &normalize.x, &normalize.y, &normalize.z); 67 temp_normals.push_back(normalize); 68 } 69 else if (strcmp(lineHeader, "f") == 0) 70 {////////////////////////////////////////////////////////// 71 int pos[3]; //座標 72 int uv[3]; //UV座標 73 int norm[3];//法線 74 fscanf_s(fp,"%d%d%d %d%d%d %d%d%d", 75 &pos[0], &uv[0], &norm[0], 76 &pos[1], &uv[1], &norm[1], 77 &pos[2], &uv[2], &norm[2] 78 ); 79///////////////////////////////////////////////////////////////////////// 80 printf("%d\n",pos[1]); 81 82 83 index_pos.push_back(pos[0]); 84 index_pos.push_back(pos[1]); 85 index_pos.push_back(pos[2]); 86 87 88 89 index_uv.push_back(uv[0]); 90 index_uv.push_back(uv[1]); 91 index_uv.push_back(uv[2]); 92 93 index_norm.push_back(norm[0]); 94 index_norm.push_back(norm[1]); 95 index_norm.push_back(norm[2]); 96 } 97 } 98 } 99 100 try { 101 102 for (int i = 0; i < index_pos.size(); i++) 103 { 104 printf("wwwwwwwwwww %d\n",(int)index_pos.at(i)); 105 } 106 107 108 109// for (int i = 0; i < index_pos.size(); i++) { 110 for (int i = 0; i < temp_vertices.size(); i++) { 111 112 glm::vec3 v = temp_vertices.at(index_pos.at(i)); 113 114 printf("%d\n",temp_vertices.size()); 115 out_vertices.push_back( v ); 116 } 117 118 119 } 120 catch (std::exception e) 121 { 122 printf("頂点 %s\n",e.what()); 123 } 124/* 125 try { 126 // UV座標 127 for (int i = 0; i < temp_uvs.size(); i++) 128 { 129 printf("%.2f , %.2f \n", temp_uvs.at(i).x, temp_uvs.at(i).y); 130 out_uvs.push_back(temp_uvs.at(i)); 131 } 132 } 133 catch (std::exception e) 134 { 135 printf("UV座標 %s\n", e.what()); 136 } 137 138 try { 139 // 法線座標 140 for (int i = 0; i < temp_normals.size(); i++) 141 { 142 printf("%.2f , %.2f , %.2f \n", temp_normals.at(i).x, temp_normals.at(i).y, temp_normals.at(i).z); 143 out_normals.push_back(temp_normals.at(i)); 144 } 145 } 146 catch (std::exception e) 147 { 148 printf("法線 %s\n", e.what()); 149 } 150 151 */ 152 153 154 return true; 155 } 156 else 157 { 158 printf("ファイルが読めませんでした。\n"); 159 return false; 160 } 161}
読めない理由はepistemeさんの回答通りです(参考サイトのコードも書式はあってます)が、
fscanf_s(fp, "%f %fn", &uv.x, &uv.y);
fscanf_s(fp, "%f %f %fn", &normalize.x, &normalize.y, &normalize.z);
書式文字列末尾の「n」は「\n」でしょう。
参考サイトも英語表示にするとそうなります。
回答2件
あなたの回答
tips
プレビュー