teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

文章を修正

2021/12/29 03:10

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,30 +1,211 @@
1
- 提示コードですが下記の.objファイルのv要素の読み込みでパターン1、パターン2、ともにアクセスエラーが発生してしまいます。またコメント部のコードは普通に実行できます。なぜ二つはアクセスエラーになるのでしょうか?
1
+ 提示コードですが下記の.objファイルのv要素の読み込みで`///`コメント部内部のパターン1、パターン2、ともにアクセスエラーが発生してしまいます。またコメント部のコードは普通に実行できます。なぜ二つはアクセスエラーになるのでしょうか?
2
2
 
3
3
  参考サイト: [https://programming.pc-note.net/c/file4.html](https://programming.pc-note.net/c/file4.html)
4
4
  ```
5
+
6
+
7
+ // ##################################### .objファイル読み込み #####################################
5
- else if (strcmp(line, "v") == 0)
8
+ std::shared_ptr<std::vector<FrameWork::Vertex>> FrameWork::GetVertex(const char* path)
6
9
  {
10
+ #define LINE_BUFFER ((int)(500))
7
11
 
8
- //パターン1
12
+ //FrameWork::Object_File object;
9
- char vert[3][LINE_BUFFER] = { { '\0' } ,{ '\0' } ,{ '\0' } };
10
- fscanf_s(file, "%s %s %s ", vert[0],vert[1],vert[2]);
13
+ std::vector<FrameWork::Vertex> polygon;
11
-
12
14
 
15
+ std::vector<int> vertexIndex;
13
- //パターン2
16
+ std::vector<int> uvIndex;
17
+ std::vector<int> normalIndex;
18
+
19
+ std::vector<glm::vec3> vertex;
14
- glm::vec3 vert = glm::vec3(0,0,0);
20
+ std::vector<glm::vec2> uv;
21
+ std::vector<glm::vec3> normal;
22
+
23
+ FILE* file;
24
+ fopen_s(&file, path, "r");
25
+
26
+ bool b = false;
27
+ if (file == NULL)
28
+ {
29
+ std::cerr << ".objファイルが開けません: " << path << std::endl;
30
+ assert(0);
31
+ }
32
+ else
33
+ {
34
+ FrameWork::vertex temp;
35
+ bool b = false;
36
+ while (true)
37
+ {
38
+
39
+ char line[500] = {'\0'};
40
+
41
+ int res = fscanf_s(file, "%s", line,LINE_BUFFER);
42
+ if (res == EOF)
43
+ {
44
+ break;
45
+ }
46
+
47
+ if (strcmp(line, "o") == 0)
48
+ {
49
+ char str[LINE_BUFFER] = {'\0'};
15
- fscanf_s(file, "%f %f %f", vert.x,vert.y,vert.z);
50
+ fscanf_s(file, "%s", str,LINE_BUFFER);
51
+ printf("%s\n",str);
52
+
53
+
54
+
55
+
56
+ if (b == true)
57
+ {
58
+ polygon.push_back(temp);
59
+ temp.attribute.resize(0);
60
+ }
61
+
62
+ if (b == false)
63
+ {
64
+ b = true;
65
+ }
66
+ }
67
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
68
+ else if (strcmp(line, "v") == 0)
69
+ {
16
70
 
17
- /*
71
+ //パターン1
18
- char vert[LINE_BUFFER] ={'\0'};
72
+ char vert[3][LINE_BUFFER] = { { '\0' } ,{ '\0' } ,{ '\0' } };
19
- float v = 0;
20
- fscanf_s(file, "%s", &v, LINE_BUFFER);
73
+ fscanf_s(file, "%s %s %s ", vert[0], vert[1], vert[2]);
21
- printf("v %s\n", v);
74
+
22
- */
23
75
 
76
+ //パターン2
77
+ glm::vec3 v = glm::vec3(0, 0, 0);
78
+ fscanf_s(file, "%f %f %f", v.x, v.y, v..z);
24
79
 
25
- //vertex.push_back(vert);
26
80
 
81
+
82
+
83
+
84
+ /*
85
+ glm::vec3 v;
86
+ char vert[LINE_BUFFER] ={'\0'};
87
+
88
+ fscanf_s(file, "%s", &vert, LINE_BUFFER);
89
+ v.x = (float)atof(vert);
90
+
91
+ fscanf_s(file, "%s", &vert, LINE_BUFFER);
92
+ v.y = (float)atof(vert);
93
+
94
+ fscanf_s(file, "%s", &vert, LINE_BUFFER);
95
+ v.z = (float)atof(vert);
96
+
97
+ vertex.push_back(v);
98
+
99
+ printf("v %f %f %f \n", v.x, v.y, v.z);
100
+ */
101
+
102
+ }
103
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
104
+ else if (strcmp(line, "vt") == 0)
105
+ {
106
+
107
+ glm::vec2 u;
108
+ char vert[LINE_BUFFER] = { '\0' };
109
+
110
+ fscanf_s(file, "%s", &vert, LINE_BUFFER);
111
+ u.x = (float)atof(vert);
112
+
113
+ fscanf_s(file, "%s", &vert, LINE_BUFFER);
114
+ u.y = (float)atof(vert);
115
+
116
+
117
+ printf("vt %f %f \n", u.x, u.y);
118
+
119
+ uv.push_back(u);
120
+ }
121
+ else if (strcmp(line, "vn") == 0)
122
+ {
123
+ glm::vec3 norm;
124
+ fscanf_s(file, "%f %f %fn", &norm.x, &norm.y, &norm.z);
125
+ normal.push_back(norm);
126
+ }
127
+ else if (strcmp(line, "f") == 0)
128
+ {
129
+ unsigned int v[3], u[3], n[3];
130
+ int matches = fscanf_s(file, "%d/%d/%d %d/%d/%d %d/%d/%dn", &v[0], &u[0], &n[0], &v[1], &u[1], &n[1], &v[2], &u[2], &n[2]);
131
+
132
+ vertexIndex.push_back(v[0]);
133
+ vertexIndex.push_back(v[1]);
134
+ vertexIndex.push_back(v[2]);
135
+
136
+ uvIndex.push_back(u[0]);
137
+ uvIndex.push_back(u[1]);
138
+ uvIndex.push_back(u[2]);
139
+
140
+ normalIndex.push_back(n[0]);
141
+ normalIndex.push_back(n[1]);
142
+ normalIndex.push_back(n[2]);
143
+ }
144
+ else if (strcmp(line, "usemtl") == 0)
145
+ {
146
+ char str[LINE_BUFFER];
147
+ char number[LINE_BUFFER];
148
+ fscanf_s(file, "%s", str, LINE_BUFFER);
149
+
150
+
151
+ strncpy_s(number, str + strlen("Material."), LINE_BUFFER);
152
+
153
+ int num = atoi(number);
154
+
155
+ printf("newmtl Material.%d\n",num);
156
+
157
+ temp.materialNumber = num;
158
+ }
159
+ else if (strcmp(line, "s") == 0)
160
+ {
161
+ char str[LINE_BUFFER];
162
+ char number[LINE_BUFFER];
163
+ fscanf_s(file, "%s", str, LINE_BUFFER);
164
+
165
+
166
+ strncpy_s(number, str, LINE_BUFFER);
167
+
168
+ int num = atoi(number);
169
+
170
+ printf("s %d\n", num);
171
+ temp.shading = num;
172
+
173
+ //temp.materialNumber = num;
174
+ }
175
+ }
176
+
177
+ for (unsigned int i = 0; i < vertexIndex.size(); i++)
178
+ {
179
+ unsigned int vi = vertexIndex[i];
180
+ unsigned int ui = uvIndex[i];
181
+ unsigned int ni = normalIndex[i];
182
+
183
+ glm::vec3 v = vertex[vi - 1];
184
+ glm::vec2 u = uv[ui - 1];
185
+ glm::vec3 n = normal[ni - 1];
186
+
187
+ FrameWork::VertexAttribute attrib;
188
+
189
+ attrib.position[0] = v.x;
190
+ attrib.position[1] = v.y;
191
+ attrib.position[2] = v.z;
192
+
193
+ attrib.uv[0] = u.x;
194
+ attrib.uv[1] = u.y;
195
+
196
+ attrib.normal[0] = n.x;
197
+ attrib.normal[1] = n.y;
198
+ attrib.normal[2] = n.z;
199
+
200
+ temp.attribute.push_back(attrib);
201
+ }
202
+ }
203
+
204
+
205
+
206
+ return std::make_shared<std::vector<FrameWork::Vertex>>(polygon);
27
207
  }
208
+
28
209
  ```
29
210
 
30
211
  ##### .objファイル