提示コードですが///コメント部のコードでmap_kd
文字列の次にる画像ファイルを名を読み込みたのですがprintf("str %s\n",str)
で何も表示されませんこれは何が原因なのでしょうか?
下記のサンプルコードを参考に実装しました。
sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );
// ##################################### .mtlファイル読み込み ##################################### std::shared_ptr<std::vector<FrameWork::Material_File>> GetMaterial(const char* path) { std::vector<FrameWork::Material_File> material; material.resize(0); FILE *file; fopen_s(&file,path, "r"); bool b = false; if (file == NULL) { std::cerr << ".mtlファイルが開けません: " << path << std::endl; assert(0); } else { while (true) { char line[LINE_BUFFER] = { '\0' }; FrameWork::Material_File mtl; int res = fscanf_s(file, "%s", line, LINE_BUFFER); if (res == EOF) { break; } //newmtl Material.xxx if (strcmp(line, "newmtl") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s",str, LINE_BUFFER); strncpy_s(number , str + strlen("Material."),LINE_BUFFER); int num = atoi(number); // printf("newmtl Material.%d\n",num); mtl.materialNumber = num; if (b == true) { material.push_back(mtl); } if (b == false) { b = true; } } else if (strcmp(line, "Ns") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str + strlen("Ns"), LINE_BUFFER); float num = (float)atof(str); mtl.Ns = num; // printf("Ns %f\n", num); } else if (strcmp(line, "Ka") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str,LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Ka %f %f %f \n",n.x,n.y,n.z); mtl.Ka = n; } else if (strcmp(line, "Kd") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Kd %f %f %f \n", n.x, n.y, n.z); mtl.Kd = n; } else if (strcmp(line, "Ks") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Ks %f %f %f \n", n.x, n.y, n.z); mtl.Ks = n; } else if (strcmp(line, "Ke") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Ke %f %f %f \n", n.x, n.y, n.z); mtl.Ke = n; } else if (strcmp(line, "Ni") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str + strlen("Ni"), LINE_BUFFER); float num = (float)atof(str); mtl.Ns = num; // printf("Ni %f\n", num); } else if (strcmp(line, "d") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str, LINE_BUFFER); float num = (float)atof(number); mtl.d = num; // printf("d %f\n", num); } else if (strcmp(line, "illum") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str, LINE_BUFFER); int num = atoi(number); mtl.illum = num; // printf("illum %d\n", num); } /////////////////////////////////////////////////////////////////////////////////////////////////// else if (strncmp(line, "map_Kd ",strlen("map_Kd ") - 1 ) == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; // fscanf_s(file, "%s", str, LINE_BUFFER); sscanf_s(line,"map_Kd %s",str, _countof(str)); printf("str %s\n",str); char string[500] = { '\0' }; GetFolderPath(path,string,500); printf("aaaaaa %s\n",string); strcat_s(string,500,str); printf("bbbbbb %s\n",string); //mtl.map_Kd = number; mtl.map_Kd = FrameWork::LoadTexture(string); //printf("map_Kd %s\n", mtl.map_Kd); } ///////////////////////////////////////////////////////////////////////////////////////////////// } } return std::make_shared<std::vector<FrameWork::Material_File>>(material); }
.mtlファイル
newmtl Material.019 Ns 225.000000 Ka 1.000000 1.000000 1.000000 Kd 0.800000 0.800000 0.800000 Ks 0.000000 0.000000 0.000000 Ke 0.000000 0.000000 0.000000 Ni 1.450000 d 1.000000 illum 1 map_Kd belts.png
このコード、CじゃないC++だ。tagが違う。
それにC++なら fstreamとstring使った方が楽。
たぶん、自分が前の回答で余計なことを書いた為に混乱させてしまったようですね。すみません。。
line という変数を見て、1行読み込んでいるのだと勘違いして回答してしまいました。
https://teratail.com/questions/375943#reply-508247
おそらく、ファイルの解析処理は
■ opengl-tutorials の objloader.cpp
https://github.com/opengl-tutorials/ogl/blob/master/common/objloader.cpp
を参考にして書かれているものと思います。
この処理だと 1行をヘッダ部とデータ部で分離して読み込むようにしているようです。
したがって、
> else if (strncmp(line, "map_Kd ",strlen("map_Kd ") - 1 ) == 0)
ここも、他と同様に strcmp() で大丈夫そうです。
cx20 さんわかりました。大丈夫です。
で、僕の回答にはコメントのひとつもないのか? ベストアンサーは社交辞令か?
回答1件
あなたの回答
tips
プレビュー