回答編集履歴

5

コメントの修正しました。

2019/11/04 22:34

投稿

littlestream
littlestream

スコア37

test CHANGED
@@ -354,7 +354,7 @@
354
354
 
355
355
  //以下の内容が通用しないのでテキストエディタ(最悪Windowsのメモ帳でも可)
356
356
 
357
- //で空白を,(カンマ)に換する必要がある、
357
+ //で空白を,(カンマ)に換する必要がある、
358
358
 
359
359
 
360
360
 

4

ソースの問題点を変更したのと画像を変えました。

2019/11/04 22:34

投稿

littlestream
littlestream

スコア37

test CHANGED
@@ -1,8 +1,6 @@
1
1
  ~~自己解決しました。一応、WndProc関数を貼っておきます。~~
2
2
 
3
-
4
-
5
- ![イメージ説明](6e7251752cca68668f9fa9b0d5af57da.png)
3
+ ![イメージ説明](6f4536cc4b8dc5e6c0a034227abc817a.png)
6
4
 
7
5
 
8
6
 
@@ -800,21 +798,13 @@
800
798
 
801
799
  {
802
800
 
803
- //全ての頂点毎に、全ての面の頂点座標と比較して、
804
-
805
- if(vvv[i].count>0)
806
-
807
- {
808
-
809
- Normalize(&vvv[i]);
801
+ Normalize(&vvv[i]);
810
-
802
+
811
- //vvv[i].x/=vvv[i].count ;
803
+ //vvv[i].x/=vvv[i].count ;
812
-
804
+
813
- //vvv[i].y/=vvv[i].count ;
805
+ //vvv[i].y/=vvv[i].count ;
814
-
806
+
815
- //vvv[i].z/=vvv[i].count ;
807
+ //vvv[i].z/=vvv[i].count ;
816
-
817
- }
818
808
 
819
809
  }
820
810
 

3

ソースを大幅に増やしました。

2019/11/04 20:27

投稿

littlestream
littlestream

スコア37

test CHANGED
@@ -8,7 +8,131 @@
8
8
 
9
9
  ```c/c++
10
10
 
11
-
11
+ int min_[HEIGHT];
12
+
13
+ int max_[HEIGHT];
14
+
15
+ typedef struct VTX{
16
+
17
+ double x,y,z;
18
+
19
+ int count;
20
+
21
+ int R,G,B;
22
+
23
+ }VTX;
24
+
25
+
26
+
27
+ typedef struct XYZ{
28
+
29
+ double x;
30
+
31
+ double y;
32
+
33
+ double z;
34
+
35
+ int count;
36
+
37
+ }XYZ;
38
+
39
+ typedef struct XY{
40
+
41
+ double x;
42
+
43
+ double y;
44
+
45
+ }XY;
46
+
47
+
48
+
49
+ #define RAD (3.14159265/180)
50
+
51
+ #define MAX_XYZ 1000
52
+
53
+
54
+
55
+ XYZ Pnt[MAX_XYZ];
56
+
57
+ XY Pnt2[MAX_XYZ];
58
+
59
+ int Poly[1000][4];
60
+
61
+ double vpx=1.0f,vpy=1.0f,vpz=-800.0f;
62
+
63
+ double D=624;
64
+
65
+
66
+
67
+ void Projection2DAxisFrom3DAxis(HWND hwnd)
68
+
69
+ {
70
+
71
+ HDC hdc = GetDC(hwnd);
72
+
73
+
74
+
75
+ for(int i=0;i<MAXVTX;i++)
76
+
77
+ {
78
+
79
+ Pnt2[i].x=(Pnt[i].x*D)/(Pnt[i].z-vpz)+160.0f;
80
+
81
+ Pnt2[i].y=-(Pnt[i].y*D)/(Pnt[i].z-vpz)+120.0f;
82
+
83
+ //PSET(Pnt2[i].x,Pnt2[i].y,0x00ff0000);
84
+
85
+ //char str[100];
86
+
87
+ //sprintf(str,"%d",i);
88
+
89
+ //TextOut(hdc,Pnt2[i].x,Pnt2[i].y,str,strlen(str));
90
+
91
+ }
92
+
93
+ }
94
+
95
+ void SetPoly(int num,int n1,int n2,int n3)
96
+
97
+ {
98
+
99
+ Poly[num][0]=n1;//頂点番号を指定
100
+
101
+ Poly[num][1]=n2;
102
+
103
+ Poly[num][2]=n3;
104
+
105
+ }
106
+
107
+ void SetXYZ(int num,double x,double y,double z)
108
+
109
+ {
110
+
111
+ if(num<0 || num>=MAX_XYZ) return;
112
+
113
+ Pnt[num].x=x;//頂点座標を指定
114
+
115
+ Pnt[num].y=y;
116
+
117
+ Pnt[num].z=z;
118
+
119
+ }
120
+
121
+ void PSET(int x,int y,int col)
122
+
123
+ {
124
+
125
+ //点を打つ
126
+
127
+ if(x<0 || x>=WIDTH-2) return;
128
+
129
+ if(y<0 || y>=HEIGHT-2) return;
130
+
131
+
132
+
133
+ lpPixel[x+(y*WIDTH)]=col;
134
+
135
+ }
12
136
 
13
137
  inline void LINE2COL(int x1,int y1,int x2,int y2,int COL,int COL2)
14
138
 

2

ソースを更新しましたがこれ以上入るのでしょうか?

2019/11/04 20:03

投稿

littlestream
littlestream

スコア37

test CHANGED
@@ -1,4 +1,4 @@
1
- 自己解決しました。一応、WndProc関数を貼っておきます。
1
+ ~~自己解決しました。一応、WndProc関数を貼っておきます。~~
2
2
 
3
3
 
4
4
 
@@ -8,6 +8,420 @@
8
8
 
9
9
  ```c/c++
10
10
 
11
+
12
+
13
+ inline void LINE2COL(int x1,int y1,int x2,int y2,int COL,int COL2)
14
+
15
+ {
16
+
17
+ //線を描くのと左か右かを判断する関数
18
+
19
+ int NewX,NewY;
20
+
21
+
22
+
23
+ for(int j=0;j<1024;j++)
24
+
25
+ {
26
+
27
+ NewX=x1*(1024-j)+x2*j>>10;
28
+
29
+ NewY=y1*(1024-j)+y2*j>>10;
30
+
31
+
32
+
33
+ int R1,R2,G1,G2,B1,B2;
34
+
35
+
36
+
37
+ R1=(COL>>16) & 0xFF;
38
+
39
+ G1=(COL>>8) & 0xFF;
40
+
41
+ B1=(COL) & 0xFF;
42
+
43
+
44
+
45
+ R2=(COL2>>16) & 0xFF;
46
+
47
+ G2=(COL2>>8) & 0xFF;
48
+
49
+ B2=(COL2) & 0xFF;
50
+
51
+
52
+
53
+
54
+
55
+ int R=R1*(1024-j)+R2*j>>10;
56
+
57
+ int G=G1*(1024-j)+G2*j>>10;
58
+
59
+ int B=B1*(1024-j)+B2*j>>10;
60
+
61
+
62
+
63
+ PSET(NewX,NewY,RGB(R,G,B));
64
+
65
+
66
+
67
+ if(min_[(int)NewY]>NewX){
68
+
69
+ min_[(int)NewY]=NewX;
70
+
71
+ cmin[(int)NewY]=RGB(R,G,B);
72
+
73
+ }
74
+
75
+ if(max_[(int)NewY]<NewX){
76
+
77
+ max_[(int)NewY]=NewX;
78
+
79
+ cmax[(int)NewY]=RGB(R,G,B);
80
+
81
+ }
82
+
83
+
84
+
85
+ }
86
+
87
+ }
88
+
89
+
90
+
91
+ int min_Y(int y1,int y2,int y3)
92
+
93
+ {
94
+
95
+ if(y1<y2 && y1<y3) return y1;
96
+
97
+ if(y2<y1 && y2<y3) return y2;
98
+
99
+ if(y3<y1 && y3<y2) return y3;
100
+
101
+ }
102
+
103
+
104
+
105
+ int max_Y(int y1,int y2,int y3)
106
+
107
+ {
108
+
109
+ if(y1>y2 && y1>y3) return y1;
110
+
111
+ if(y2>y1 && y2>y3) return y2;
112
+
113
+ if(y3>y1 && y3>y2) return y3;
114
+
115
+ }
116
+
117
+
118
+
119
+ inline void GouraudShade(int x1,int y1,int x2,int y2,int x3,int y3,int C1,int C2,int C3)
120
+
121
+ {
122
+
123
+
124
+
125
+ //入れ忘れ(笑)
126
+
127
+ for(int i=0;i<SCREENHEIGHT;i++)
128
+
129
+ {
130
+
131
+ min_[i]=65816;
132
+
133
+ max_[i]=-65816;
134
+
135
+ cmin[i]=RGB(0,0,0);
136
+
137
+ cmax[i]=RGB(0,0,0);
138
+
139
+ }
140
+
141
+
142
+
143
+ LINE2COL(x1,y1,x2,y2,C1,C2);
144
+
145
+ LINE2COL(x2,y2,x3,y3,C2,C3);
146
+
147
+ LINE2COL(x1,y1,x3,y3,C1,C3);
148
+
149
+
150
+
151
+ for(int Y=min_Y(y1,y2,y3);Y<max_Y(y1,y2,y3);Y++)
152
+
153
+ {
154
+
155
+ int R1=(cmin[Y]>>16) & 0xFF;
156
+
157
+ int G1=(cmin[Y]>>8) & 0xFF;
158
+
159
+ int B1=(cmin[Y]) & 0xFF;
160
+
161
+
162
+
163
+ int R2=(cmax[Y]>>16) & 0xFF;
164
+
165
+ int G2=(cmax[Y]>>8) & 0xFF;
166
+
167
+ int B2=(cmax[Y]) & 0xFF;
168
+
169
+
170
+
171
+ LINE2COL(min_[Y],Y,max_[Y],Y,RGB(R1,G1,B1),RGB(R2,G2,B2));
172
+
173
+
174
+
175
+ }
176
+
177
+
178
+
179
+ }
180
+
181
+
182
+
183
+ void LoadOBJFile(char filename[10000],HWND hwnd)
184
+
185
+ {
186
+
187
+
188
+
189
+ static int flag=0;
190
+
191
+ FILE *fp;
192
+
193
+ fp=fopen(filename,"r");
194
+
195
+ if(fp==NULL)
196
+
197
+ {
198
+
199
+ MessageBox(NULL,"ファイルがありません。","OK?",MB_OK);
200
+
201
+ SelectObject(hdcBMP, hBMPOLD);
202
+
203
+
204
+
205
+ DeleteObject(hdcBMP);
206
+
207
+ DeleteObject(hBMP);
208
+
209
+
210
+
211
+ PostQuitMessage(0);
212
+
213
+
214
+
215
+ return;
216
+
217
+ }
218
+
219
+
220
+
221
+ int i=0;
222
+
223
+ int j=0;
224
+
225
+
226
+
227
+ while(fgets(FileStr[i],50,fp)!=NULL)
228
+
229
+ {
230
+
231
+ j=0;
232
+
233
+ //以下の内容が通用しないのでテキストエディタ(最悪Windowsのメモ帳でも可)
234
+
235
+ //で空白を,(カンマ)に変換する必要がある、
236
+
237
+
238
+
239
+ //while(FileStr[i][j])
240
+
241
+ {
242
+
243
+ // if(FileStr[i][j]==' ') FileStr[i][j]=',';
244
+
245
+ // ++j;
246
+
247
+ }
248
+
249
+ ++i;
250
+
251
+ }
252
+
253
+
254
+
255
+ LastLine=i;//最後の行数を保存する
256
+
257
+ char opecode[10000]={0};
258
+
259
+ double XF,YF,ZF;
260
+
261
+ int TriNum1,TriNum2,TriNum3;
262
+
263
+ int k=0;
264
+
265
+
266
+
267
+ for(int i=0;i<LastLine;i++)
268
+
269
+ {
270
+
271
+
272
+
273
+ opecode[0]=FileStr[i][0];
274
+
275
+ //CameraPos.D=535.0f;
276
+
277
+ //CameraPos.Z=-810.0f;
278
+
279
+
280
+
281
+ //PSET(400,300,GetColor(0,0,255));
282
+
283
+ if(opecode[0]=='v')
284
+
285
+ {
286
+
287
+ sscanf(FileStr[i],"%c,%lf,%lf,%lf",
288
+
289
+ opecode,&XF,&YF,&ZF);
290
+
291
+ SetXYZ(k,XF*SCALE,YF*SCALE,ZF*SCALE);
292
+
293
+ Projection2DAxisFrom3DAxis(hwnd);
294
+
295
+ //i=0;
296
+
297
+
298
+
299
+ ++k;
300
+
301
+ MAXVTX=k;
302
+
303
+ }
304
+
305
+
306
+
307
+
308
+
309
+ if(opecode[0]=='f')
310
+
311
+ {
312
+
313
+ sscanf(FileStr[i],"%c,%d,%d,%d",
314
+
315
+ opecode,&TriNum1,&TriNum2,&TriNum3);
316
+
317
+ if(flag==0)
318
+
319
+ {
320
+
321
+ j=0;
322
+
323
+ flag=1;
324
+
325
+ }
326
+
327
+
328
+
329
+ SetPoly(j,(int)TriNum1-1,(int)TriNum2-1,(int)TriNum3-1);
330
+
331
+
332
+
333
+ Projection2DAxisFrom3DAxis(hwnd);
334
+
335
+
336
+
337
+ ++j;
338
+
339
+ MAXPOL=j;
340
+
341
+
342
+
343
+ }
344
+
345
+
346
+
347
+
348
+
349
+ }
350
+
351
+
352
+
353
+ }
354
+
355
+
356
+
357
+ XYZ CalcCross(XYZ a,XYZ b,XYZ c)
358
+
359
+ {
360
+
361
+ XYZ d={0.0f};
362
+
363
+ XYZ a2,b2;
364
+
365
+
366
+
367
+ a2.x=a.x-b.x;
368
+
369
+ a2.y=a.y-b.y;
370
+
371
+ a2.z=a.z-b.z;
372
+
373
+
374
+
375
+ b2.x=a.x-c.x;
376
+
377
+ b2.y=a.y-c.y;
378
+
379
+ b2.z=a.z-c.z;
380
+
381
+
382
+
383
+ double len=sqrt(a2.x*a2.x+a2.y*a2.y+a2.z*a2.z);
384
+
385
+ a2.x/=len;
386
+
387
+ a2.y/=len;
388
+
389
+ a2.z/=len;
390
+
391
+
392
+
393
+ double len2=sqrt(b2.x*b2.x+b2.y*b2.y+b2.z*b2.z);
394
+
395
+ b2.x/=len2;
396
+
397
+ b2.y/=len2;
398
+
399
+ b2.z/=len2;
400
+
401
+
402
+
403
+
404
+
405
+ //23-32 31-13 12-21
406
+
407
+ //aY*bZ-aZ*bY aZ*bX-aX*bZ aX*bY-aY*bX
408
+
409
+ d.x=a2.y*b2.z-a2.z*b2.y;
410
+
411
+ d.y=a2.z*b2.x-a2.x*b2.z;
412
+
413
+ d.z=a2.x*b2.y-a2.y*b2.x;
414
+
415
+
416
+
417
+ return d;
418
+
419
+ }
420
+
421
+
422
+
423
+
424
+
11
425
  LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
12
426
 
13
427
 
@@ -216,7 +630,17 @@
216
630
 
217
631
 
218
632
 
219
- XYZ n=CalcNormal2(Pnt[i1],Pnt[i2],Pnt[i3]);
633
+ XYZ n=CalcCross(Pnt[i1],Pnt[i2],Pnt[i3]);
634
+
635
+ //外積を行った
636
+
637
+
638
+
639
+ Normalize(&n);
640
+
641
+ //正規化を行った
642
+
643
+
220
644
 
221
645
  vvv[i1].x+=n.x;
222
646
 
@@ -242,7 +666,17 @@
242
666
 
243
667
 
244
668
 
669
+
670
+
671
+ }
672
+
673
+
674
+
675
+ for(int i=0;i<MAXVTX;i++)
676
+
677
+ {
678
+
245
- //全ての頂点毎に、全ての面の頂点座標と比較して、
679
+ //全ての頂点毎に、全ての面の頂点座標と比較して、
246
680
 
247
681
  if(vvv[i].count>0)
248
682
 
@@ -260,8 +694,6 @@
260
694
 
261
695
  }
262
696
 
263
-
264
-
265
697
  //頂点ベクトルは求まった(はず...)から、頂点カラーを面にある全ての頂点で求める
266
698
 
267
699
 
@@ -286,7 +718,7 @@
286
718
 
287
719
 
288
720
 
289
- XYZ n=CalcNormal2(Pnt[i1],Pnt[i2],Pnt[i3]);
721
+ XYZ n=CalcCross(Pnt[i1],Pnt[i2],Pnt[i3]);
290
722
 
291
723
 
292
724
 
@@ -326,10 +758,14 @@
326
758
 
327
759
 
328
760
 
761
+
762
+
329
763
  ViewCos=(v1*n.x+v2*n.y+v3*n.z);
330
764
 
331
765
  //視線ベクトルと面ごとの法線ベクトルの内積
332
766
 
767
+
768
+
333
769
  if(ViewCos<0)
334
770
 
335
771
  GouraudShade(Pnt2[Poly[i][0]].x,Pnt2[Poly[i][0]].y,
@@ -424,4 +860,6 @@
424
860
 
425
861
  }
426
862
 
863
+
864
+
427
865
  ```

1

画像を貼りました。

2019/11/04 19:45

投稿

littlestream
littlestream

スコア37

test CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
 
4
4
 
5
+ ![イメージ説明](6e7251752cca68668f9fa9b0d5af57da.png)
6
+
7
+
8
+
5
9
  ```c/c++
6
10
 
7
11
  LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {