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

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

新規登録して質問してみよう
ただいま回答率
85.35%
OpenGL

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

C++

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

Q&A

0回答

1171閲覧

OpenGLを使用し、OBJファイルでテクスチャマッピングやり方

hikarhikar

総合スコア18

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/03/28 18:03

編集2020/03/30 12:54

お世話になっています。<(_ _)>
blenderでPMXファイルを読み込みOBJファイルで出力、出力したOBJファイルでOpenGLを使いテクスチュマッピングしたいのですが、ネットで調べてみたら、多くの記事でmtlファイル内のmap_kd[テクスチャ名]を使用すると書かれていたのですが...
自分のやり方が間違っているのかもしれませんが、そのようなキーワードがファイルのどこにも書かれていませんでした。

モデルMTLtxtファイル
モデルOBJtxtファイル

こちらはモデルのテクスチャです↓
イメージ説明
ちなみに、kaziiさんのモデルをダウンロードさせていただきました。<(_ _)>

blenderモデル読み込み
もしよかったら、ドライブに2分程のblenderでモデルを読み込む動画をアップしたので、もしやり方が違っていたら、教えていただければ幸いです<(_ _)>

下のソースコードでは、[glTexCoord2f(); glVertex3f();]関数に直接値を書き込んで、下のドライブ描画結果先の動画のような結果になったのですが、オブジェクトを回すと後ろの面が前の面を透けて見えるのはなぜでしょうか?
描画結果

多くの情報を持つモデルの読み込みになると、一つ一つ読み込んでいたら、すごい効率が悪く、ほぼ100%間違えてしまうので、
objファイルこちらのオブジェファイルを読み込んで、[glEnableClientState(GL_VERTEX_ARRAY);]こちらの関数を使い頂点を格納し、UV描画をしたいのですが、objファイルを見ていただいたらわかると思うのですが、(もしかしたら自分が間違えてるかもですが...)頂点に対するUV座標が示されていないと思うのですが...
[f 〇/〇/〇 〇/〇/〇 〇/〇/〇]こちらを使えばいいのかな?と思ったのですが、三角面化にしてあるので、同じ頂点とUV座標を何度も使用しているので、ここから、読み込むのは難しいのかな?と思いました。
どのようにすれば、[GL_POLYGON]にUV座標をファイルから読み込み、指定できるのでしょうか?

お手数をおかけしますが、objファイルからどのようにすれば、テクスチュマッピングできるか教えてください<(_ _)>。

OpenGL

1#define _CRT_SECURE_NO_WARNINGS 2 3#include <windows.h> 4#include <stdio.h> 5 6#include "glut.h" 7#include "glm/glm.hpp" 8 9#include "3dText.h" 10 11float vertex[VERTEX_BUF * 3] = { 0 }; 12float uv[UV_BUF * 2] = { 0 }; 13float normal[NORMAL_BUF * 3] = { 0 }; 14int lines[LINES_BUF * 3] = { 0 }; 15int texture[LINES_BUF * 3] = { 0 }; 16 17int textureDataSize = 0; 18int vertexDataSize = 0; 19int lineDataSize = 0; 20int normalDataSize = 0; 21int uvDataSize = 0; 22 23void objBegin(glm::ivec2 _windowsize) { 24 glPushMatrix(); 25 glMatrixMode(GL_PROJECTION); // 射影行列を操作する 26 glLoadIdentity(); // 行列を初期化 27 28 29 //視界の決定 30 gluPerspective(30.0, (double)_windowsize.x / _windowsize.y, 1.0, 100.0); 31 32 glMatrixMode(GL_MODELVIEW); 33 glLoadIdentity(); 34 35 //カメラの位置決定 36 //https://atelier-yoka.com/dev_android/p_main.php?file=apigluglulookat 37 gluLookAt(0.0, 5.0, -15.0, 0.0, 2.0, 0.0, 0.0, 1.0, 0.0); 38} 39 40void objEnd() { 41 glPopMatrix(); 42} 43 44void loadOBJ() 45{ 46 FILE* pFileObj; 47 fopen_s(&pFileObj, "OBJファイル//colorblockobj.txt", "r"); 48 49 if (pFileObj == nullptr) { 50 printf("file erro\n"); 51 return; 52 } 53 printf("opennd file\n"); 54 55 char chr[BUFLEN]; 56 int i1, i2, i3, i4, i5, i6, i7, i8, i9; 57 char buf[BUFLEN]; 58 bool count = false; 59 60 printf("%d vertexDataSize=%d lineDataSize=%d\n", __LINE__, vertexDataSize, lineDataSize); 61 62 while (fgets(buf, BUFLEN, pFileObj) != NULL) { 63 char* buf2 = buf; 64 if (strstr(buf, "Rigidbody") != NULL) { 65 break; 66 count = true; 67 } 68 if (*buf2 == 'v') { 69 if (*(++buf2) == 't') { 70 sscanf(buf, "%s %f %f", 71 chr, 72 &uv[uvDataSize * 2], 73 &uv[uvDataSize * 2 + 1]); 74 75 //printf("%d : %d %s %f %f\n", __LINE__, uvDataSize, chr, uv[uvDataSize * 2], uv[uvDataSize * 2 + 1]); 76 uvDataSize++; 77 } 78 else if (*buf2 == 'n') { 79 sscanf(buf, "%s %f %f %f", 80 chr, 81 &normal[normalDataSize * 3], 82 &normal[normalDataSize * 3 + 1], 83 &normal[normalDataSize * 3 + 2]); 84 85 //printf("%d : %d %s %f %f %f\n", __LINE__, normalDataSize, chr, normal[normalDataSize * 3], normal[normalDataSize * 3 + 1], normal[normalDataSize * 3 + 2]); 86 normalDataSize++; 87 } 88 else{ 89 sscanf(buf, "%s %f %f %f", 90 chr, 91 &vertex[vertexDataSize * 3], 92 &vertex[vertexDataSize * 3 + 1], 93 &vertex[vertexDataSize * 3 + 2]); 94 95 //printf("%d : %d %s %f %f %f\n",__LINE__,vertexDataSize,chr,vertex[vertexDataSize*3],vertex[vertexDataSize * 3+1],vertex[vertexDataSize * 3+2]); 96 vertexDataSize++; 97 } 98 } 99 else if (*buf2 == 'f') { 100 if (count != true) { 101 //continue; 102 sscanf(buf, "%s %d/%d/%d %d/%d/%d %d/%d/%d", 103 chr, 104 &i1, 105 &i2, 106 &i3, 107 108 &i4, 109 &i5, 110 &i6, 111 112 &i7, 113 &i8, 114 &i9); 115 lines[lineDataSize * 3] = i1 - 1; 116 lines[lineDataSize * 3 + 1] = i4 - 1; 117 lines[lineDataSize * 3 + 2] = i7 - 1; 118 119 //printf("%s %d %d %d %d %d %d %d %d %d\n", chr,i1,i2,i3,i4,i5,i6,i7,i8,i9); 120 //printf("%d : %d %s %d %d %d\n", __LINE__, lineDataSize, chr, lines[lineDataSize * 3], lines[lineDataSize * 3 + 1], lines[lineDataSize * 3 + 2]); 121 } 122 else { 123 sscanf(buf, "%s %d//%d %d//%d %d//%d", 124 chr, 125 &i1, 126 &i3, 127 128 &i4, 129 &i6, 130 131 &i7, 132 &i9); 133 lines[lineDataSize * 3] = i1 - 1; 134 lines[lineDataSize * 3 + 1] = i4 - 1; 135 lines[lineDataSize * 3 + 2] = i7 - 1; 136 137 texture[textureDataSize * 3] = i1 - 1; 138 texture[textureDataSize * 3 + 1] = i4 - 1; 139 texture[textureDataSize * 3 + 2] = i7 - 1; 140 141 //printf("%s %d %d %d %d %d %d\n", chr,i1,i3,i4,i6,i7,i9); 142 //printf("%d : %d %s %d %d %d\n", __LINE__, lineDataSize, chr, lines[lineDataSize * 3], lines[lineDataSize * 3 + 1], lines[lineDataSize * 3 + 2]); 143 } 144 145 textureDataSize++; 146 lineDataSize++; 147 } 148 } 149 printf("%d vertexDataSize=%d lineDataSize=%d\n", __LINE__, vertexDataSize, lineDataSize); 150 151 fclose(pFileObj); 152} 153 154void loadTexture() { 155 FILE* pFileMtl; 156 fopen_s(&pFileMtl, "OBJファイル//無題.bmp", "rb"); 157 if (pFileMtl == nullptr) { 158 printf("file erro\n"); 159 return; 160 } 161 printf("opennd file\n"); 162 163 164 //テクスチャマッピング 165 BITMAPFILEHEADER bf; 166 fread(&bf, sizeof BITMAPFILEHEADER, 1, pFileMtl); 167 printf("bfSize:%d\n", bf.bfSize); 168 169 BITMAPINFOHEADER bi; 170 fread(&bi, sizeof BITMAPINFOHEADER, 1, pFileMtl); 171 printf("biWidth:%d biHeight:%d\n", bi.biWidth, bi.biHeight); 172 printf("biBitCount:%d\n", bi.biBitCount); 173 174 175 typedef struct { 176 unsigned char r, g, b; 177 }RGB; 178 RGB* bits = (RGB*)malloc(sizeof RGB * bi.biWidth * bi.biHeight); 179 fread(bits, sizeof RGB, bi.biWidth * bi.biHeight, pFileMtl); 180 181 for (int y = 0; y < bi.biHeight; y++) 182 for (int x = 0; x < bi.biWidth; x++) { 183 RGB* pbits = &bits[y * bi.biWidth + x]; 184 unsigned char temp = pbits->r; 185 pbits->r = pbits->b; 186 pbits->b = temp; 187 188 } 189 190 for (int y = 0; y < bi.biHeight / 2; y++) 191 for (int x = 0; x < bi.biWidth; x++) { 192 RGB* pbits0 = &bits[y * bi.biWidth + x]; 193 RGB* pbits1 = &bits[(bi.biHeight - 1 - y) * bi.biWidth + x]; 194 RGB temp = *pbits0; 195 *pbits0 = *pbits1; 196 *pbits1 = temp; 197 } 198 199 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 200 201 //GLuint texName; 202 //glGenTextures(1, &texName); 203 //glBindTexture(GL_TEXTURE_2D, texName); 204 205 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bi.biWidth, bi.biHeight, 0, 206 GL_RGB, GL_UNSIGNED_BYTE, bits); 207 208 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 209 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 210 211 //glEnable(GL_DEPTH_TEST); 212 glEnable(GL_TEXTURE_2D); 213 //glDisable(GL_CULL_FACE); 214 215 fclose(pFileMtl); 216} 217 218void drawObj() { 219 220 glEnableClientState(GL_VERTEX_ARRAY); 221 glVertexPointer(3, GL_FLOAT, 0, vertex); 222 /* 223 // 頂点の描画 224 225 glPointSize(1); 226 glBegin(GL_POINT); 227 { 228 for (int i = 0; i < vertexDataSize; i++) { 229 glArrayElement(i); 230 //glTexCoord2f(uv[texture[i * 2]], uv[texture[i * 2]+1]); 231 //glArrayElement(lines[i]); 232 } 233 } 234 glEnd(); 235 236 glColor3f(0.6, 0.35, 0); 237 glBegin(GL_TRIANGLES); 238 { 239 for (int i = 0; i < lineDataSize; i++) { 240 glArrayElement(lines[i * 3]); 241 glArrayElement(lines[i * 3 + 1]); 242 glArrayElement(lines[i * 3 + 2]); 243 } 244 } 245 glEnd(); 246 glNormal3d(0.0, 0.0, 1.0); 247 248 glColor3f(1.0,1.0, 1.0); 249 glBegin(GL_LINES); 250 { 251 for (int i = 0; i < lineDataSize; i++) { 252 glArrayElement(lines[i * 3]); 253 glArrayElement(lines[i * 3 + 1]); 254 255 glArrayElement(lines[i * 3 + 1]); 256 glArrayElement(lines[i * 3 + 2]); 257 258 glArrayElement(lines[i * 3 + 2]); 259 glArrayElement(lines[i * 3]); 260 } 261 } 262 glEnd(); 263 */ 264 265 glNormal3d(0.0, 0.0, 1.0); 266 glBegin(GL_QUADS); 267 glTexCoord2f(0.0, 0.0);glVertex3f(-1.0, -1.0, 1.0);//1 268 glTexCoord2f(0.25, 0.25);glVertex3f(1.0, -1.0, 1.0);//2 269 glTexCoord2f(0.25, 0.0); glVertex3f(1.0, 1.0, 1.0);//3 270 glTexCoord2f(0.0, 0.0);glVertex3f(-1.0, 1.0, 1.0);//4 271 272 glTexCoord2f(0.25, 0.25); glVertex3f(1.0, -1.0, 1.0);//2 273 glTexCoord2f(0.25, 0.0); glVertex3f(1.0, 1.0, 1.0);//3 274 glTexCoord2f(0.5, 0.0); glVertex3f(1.0, 1.0, -1.0);//5 275 glTexCoord2f(0.5, 0.25);glVertex3f(1.0, -1.0, -1.0);//6 276 277 glTexCoord2f(0.5, 0.0); glVertex3f(1.0, 1.0, -1.0);//5 278 glTexCoord2f(0.5, 0.25); glVertex3f(1.0, -1.0, -1.0);//6 279 glTexCoord2f(0.75, 0.25); glVertex3f(-1.0, -1.0, -1.0);//7 280 glTexCoord2f(0.75, 0.0); glVertex3f(-1.0, 1.0, -1.0);//8 281 282 glTexCoord2f(0.75, 0.25); glVertex3f(-1.0, -1.0, -1.0);//7 283 glTexCoord2f(0.75, 0.0); glVertex3f(-1.0, 1.0, -1.0);//8 284 glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, 1.0, 1.0);//9 285 glTexCoord2f(1.0, 0.25); glVertex3f(-1.0, -1.0, 1.0);//10 286 287 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, -1.0);// 288 glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, -1.0);// 289 glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 1.0);//3 290 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0);//4 291 292 glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);//1 293 glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 1.0);//2 294 glTexCoord2f(1.0, 1.0); glVertex3f(1.0, -1.0, -1.0);//1 295 glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);//2 296 297 glEnd(); 298 //glDisable(GL_TEXTURE_2D); 299 300}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問