質問編集履歴

4

分かっていない部分や怪しい部分を更新したのと太字にしました。

2019/11/02 04:31

投稿

littlestream
littlestream

スコア37

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- この共有する頂点という意味がよく分からないです。
13
+ **この共有する頂点という意味がよく分からないです。**
14
14
 
15
15
 
16
16
 
@@ -114,6 +114,14 @@
114
114
 
115
115
  (0.394055203,-0.472866243,0.788110406)
116
116
 
117
+ 光源ベクトルと頂点ベクトルの内積は、
118
+
119
+
120
+
121
+ 頂点ベクトルが(Nx,Ny,Nz),光源ベクトルが(Lx,Ly,Lz)だとすると、
122
+
123
+ double DotProductResult=Nx*Lx+Ny*Ly+Nz*Lz;
124
+
117
125
 
118
126
 
119
127
  ちなみに、内積をこの法線ベクトルと視線ベクトル(カメラ?)と行う事で
@@ -126,9 +134,9 @@
126
134
 
127
135
 
128
136
 
129
- 3.あと内積で求めた頂点カラーをどういうループにすれば
137
+ **3.あと内積で求めた頂点カラーをどういうループにすれば
130
-
138
+
131
- 頂点カラーを適用できるのか分からないです。
139
+ 頂点カラーを適用できるのか分からないです。**
132
140
 
133
141
 
134
142
 
@@ -146,6 +154,18 @@
146
154
 
147
155
 
148
156
 
157
+ **なので、よく分かっていないのですが、面ごとの法線ベクトルを
158
+
159
+ 頂点ベクトルという変数をでっちあげて面ごとの法線ベクトルをその面ごとの頂点ベクトルに
160
+
161
+ 足すのと足した回数を調べておいて平均化したものに、RGB値のR値、G値、B値
162
+
163
+ それぞれに掛けてしまう方法なのかどうかすら分かってません。**
164
+
165
+
166
+
167
+
168
+
149
169
  ```c/c++言語
150
170
 
151
171
 

3

ソースの最新版です。

2019/11/02 04:31

投稿

littlestream
littlestream

スコア37

test CHANGED
File without changes
test CHANGED
@@ -146,7 +146,7 @@
146
146
 
147
147
 
148
148
 
149
- ```C言語
149
+ ```c/c++言語
150
150
 
151
151
 
152
152
 
@@ -592,10 +592,48 @@
592
592
 
593
593
 
594
594
 
595
+ //PSET(320,240,0x00ff0000);//点を打つ
596
+
597
+ //LINE(320,240,640,380,0x00ff0000);
598
+
599
+
600
+
601
+ int xy[4][2]={
602
+
603
+ 320,5,
604
+
605
+ 220,300,
606
+
607
+ 500,430,
608
+
609
+ 630,280
610
+
611
+ };
612
+
613
+ int Col[4]=
614
+
615
+ {
616
+
617
+ 0x00ff0000,
618
+
619
+ 0x0000ff00,
620
+
621
+ 0x000000ff,
622
+
623
+ 0x00ffffff
624
+
625
+ };
626
+
627
+
628
+
629
+
630
+
595
631
  Projection2DAxisFrom3DAxis(hdc);//透視投影
596
632
 
597
633
 
598
634
 
635
+ //PSET(320,240,0x00FFFFFF);
636
+
599
637
  XYZ vvv[12];//全ての頂点の法線をクリアする
600
638
 
601
639
 
@@ -610,12 +648,16 @@
610
648
 
611
649
  vvv[i].z=0.0f;//Clear
612
650
 
613
- //これが無いとどんどん加算されてしまう
614
-
615
651
  }
616
652
 
617
653
 
618
654
 
655
+ XYZ a[13];
656
+
657
+ XYZ b[13];
658
+
659
+ XYZ n[13];
660
+
619
661
 
620
662
 
621
663
  for(int i=0;i<12;i++)
@@ -690,102 +732,134 @@
690
732
 
691
733
 
692
734
 
693
- //頂点ベクトルは求まった(はず...)から、頂点カラーを面にある全ての頂点で求める
735
+ //頂点ベクトルは求まった(はず...)から、頂点カラーを面にある全ての頂点で求める
694
736
 
695
737
  double ViewCos[12];
696
738
 
739
+ //XYZ vpx=200,vpy=-120,vpz=100;
740
+
741
+ for(int i=0;i<12;i++)
742
+
743
+ {
744
+
745
+ double a=sqrt(vvv[i].x*vvv[i].x+vvv[i].y*vvv[i].y+vvv[i].z*vvv[i].z)+0.01f;
746
+
747
+
748
+
749
+ int i1=Poly[i][0];
750
+
751
+ int i2=Poly[i][1];
752
+
753
+ int i3=Poly[i][2];
754
+
755
+
756
+
757
+ XYZ n=CalcNormal2(Pnt[i1],Pnt[i2],Pnt[i3]);
758
+
759
+
760
+
761
+ vvv[i].x/=a;
762
+
763
+ vvv[i].y/=a;
764
+
765
+ vvv[i].z/=a;
766
+
767
+
768
+
769
+ XYZ light={100,-120,200};
770
+
771
+ double lenlight=sqrt((double)light.x*light.x+light.y*light.y+light.z*light.z);
772
+
773
+
774
+
775
+ light.x/=lenlight;
776
+
777
+ light.y/=lenlight;
778
+
779
+ light.z/=lenlight;
780
+
781
+
782
+
783
+ double spe1=vvv[i1].x*light.x+vvv[i1].y*light.y+vvv[i1].z*light.z;
784
+
785
+ double spe2=vvv[i2].x*light.x+vvv[i2].y*light.y+vvv[i2].z*light.z;
786
+
787
+ double spe3=vvv[i3].x*light.x+vvv[i3].y*light.y+vvv[i3].z*light.z;
788
+
789
+
790
+
791
+ double vv=sqrt((vpx*vpx+vpy*vpy+vpz*vpz));//視線ベクトルの長さを求める
792
+
793
+
794
+
795
+ double v1=vpx/(vv+0.01f);//視線ベクトルの正規化
796
+
797
+ double v2=vpy/(vv+0.01f);//
798
+
799
+ double v3=vpz/(vv+0.01f);//
800
+
801
+
802
+
803
+ ViewCos[i]=(v1*n.x+v2*n.y+v3*n.z);
804
+
805
+ //視線ベクトルと面ごとの法線ベクトルの内積
806
+
807
+ if(ViewCos[i]<0)
808
+
809
+ TRIANGLE2(Pnt2[Poly[i][0]].x,Pnt2[Poly[i][0]].y,
810
+
811
+ Pnt2[Poly[i][1]].x,Pnt2[Poly[i][1]].y,
812
+
813
+ Pnt2[Poly[i][2]].x,Pnt2[Poly[i][2]].y,
814
+
815
+ RGB(spe1*255,spe1*255,spe1*255),
816
+
817
+ RGB(spe2*255,spe2*255,spe2*255),
818
+
819
+ RGB(spe3*255,spe3*255,spe3*255)
820
+
821
+ );
822
+
823
+
824
+
825
+ }
826
+
827
+
828
+
829
+
830
+
831
+ //反時計回りの座標軸
832
+
833
+ //三角形を表示する
834
+
835
+ //DrawTextureMapping(320,0,0,480,640,0);
836
+
697
837
 
698
838
 
839
+ //FillGraRect(0,0,320,20,255,0,0,0,255,0);
840
+
841
+ CalcFPS(hdc);
842
+
843
+ /* DIBSectionをDIBとして描画 */
844
+
699
- int vpx=200,vpy=-120,vpz=100;
845
+ StretchDIBits(hdc, 0, 0, WIDTH, HEIGHT,
846
+
847
+ 0, 0, WIDTH, HEIGHT, lpPixel, &biInfo,
848
+
849
+ DIB_RGB_COLORS,SRCCOPY);
850
+
851
+
700
852
 
701
853
 
702
854
 
703
- for(int i=0;i<12;i++)
855
+ EndPaint(hwnd, &ps);
704
-
705
- {
856
+
706
-
707
- double a=sqrt(vvv[i].x*vvv[i].x+vvv[i].y*vvv[i].y+vvv[i].z*vvv[i].z)+0.01f;
857
+
708
-
709
-
710
-
711
- vvv[i].x/=a;
858
+
712
-
713
- vvv[i].y/=a;
714
-
715
- vvv[i].z/=a;
716
-
717
-
718
-
719
- double vv=sqrt((vpx*vpx+vpy*vpy+vpz*vpz));//視線ベクトルの長さを求める
859
+ DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));
720
-
721
-
722
-
723
- double v1=vpx/(vv+0.01f);//視線ベクトルの正規化
724
-
725
- double v2=vpy/(vv+0.01f);//
726
-
727
- double v3=vpz/(vv+0.01f);//
728
-
729
-
730
-
731
- ViewCos[i]=(v1*vvv[i].x+v2*vvv[i].y+v3*vvv[i].z);
732
-
733
- //視線ベクトルと面ごとの法線ベクトルの内積
734
-
735
- if(ViewCos[i]<0)
736
-
737
- TRIANGLE2(Pnt2[Poly[i][0]].x,Pnt2[Poly[i][0]].y,
738
-
739
- Pnt2[Poly[i][1]].x,Pnt2[Poly[i][1]].y,
740
-
741
- Pnt2[Poly[i][2]].x,Pnt2[Poly[i][2]].y,
742
-
743
- RGB(255,255,255),
744
-
745
- RGB(255,255,255),
746
-
747
- RGB(255,255,255)
748
-
749
- );
750
-
751
- //とりあえず真っ白にしたが、頂点カラーを求めた後にどうすれば
752
-
753
- //3点の色を指定する処理になるか分からないです。
754
-
755
-
756
860
 
757
861
  }
758
862
 
759
-
760
-
761
-
762
-
763
-
764
-
765
- CalcFPS(hdc);
766
-
767
-
768
-
769
- /* DIBSectionをDIBとして描画 */
770
-
771
- StretchDIBits(hdc, 0, 0, WIDTH, HEIGHT,
772
-
773
- 0, 0, WIDTH, HEIGHT, lpPixel, &biInfo,
774
-
775
- DIB_RGB_COLORS,SRCCOPY);
776
-
777
-
778
-
779
-
780
-
781
- EndPaint(hwnd, &ps);
782
-
783
-
784
-
785
- DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));
786
-
787
- }
788
-
789
863
  return 0;
790
864
 
791
865
 
@@ -823,3 +897,5 @@
823
897
  }
824
898
 
825
899
  ```
900
+
901
+ ![イメージ説明](6af0066a11228dbaa3ab7964da8a4eb2.jpeg)

2

インデントが上手く行かなかったので<code>を使います。

2019/11/01 12:42

投稿

littlestream
littlestream

スコア37

test CHANGED
File without changes
test CHANGED
@@ -146,6 +146,8 @@
146
146
 
147
147
 
148
148
 
149
+ ```C言語
150
+
149
151
 
150
152
 
151
153
  void PSET(int x,int y,int col)
@@ -819,3 +821,5 @@
819
821
 
820
822
 
821
823
  }
824
+
825
+ ```

1

ソースを公開します。

2019/11/01 12:16

投稿

littlestream
littlestream

スコア37

test CHANGED
File without changes
test CHANGED
@@ -139,3 +139,683 @@
139
139
  5.うまく行かないので、困っています。どうすれば求まるのか
140
140
 
141
141
  誰か教えてください。
142
+
143
+
144
+
145
+ 一部のソースコードを公開します。
146
+
147
+
148
+
149
+
150
+
151
+ void PSET(int x,int y,int col)
152
+
153
+ {
154
+
155
+ //点を打つ
156
+
157
+ if(x<0 || x>WIDTH) return;
158
+
159
+ if(y<0 || y>HEIGHT) return;
160
+
161
+
162
+
163
+ lpPixel[x+(y*WIDTH)]=col;
164
+
165
+ }
166
+
167
+
168
+
169
+ inline void ScanEdge(int x1,int y1,int x2,int y2,int c1,int c2)
170
+
171
+ {
172
+
173
+
174
+
175
+ int b1=(c1>>16) & 0xFF;
176
+
177
+ int g1=(c1>>8) & 0xFF;
178
+
179
+ int r1=c1 & 0xFF;
180
+
181
+
182
+
183
+ int b2=(c2>>16) & 0xFF;
184
+
185
+ int g2=(c2>>8) & 0xFF;
186
+
187
+ int r2=c2 & 0xFF;
188
+
189
+
190
+
191
+ for(double i=0.0f;i<=1.00f;i+=0.0001f)//0.0~1.0を、0~1024に直す
192
+
193
+ {
194
+
195
+ int ax=x1*(1.0-i)+x2*i;//線形補間の固定小数点処理化(X成分
196
+
197
+ int ay=y1*(1.0-i)+y2*i;//(固定小数点(Y成分
198
+
199
+ double k=(ay-y1)/(double)(y2-y1);//0.0~1.0を0~256に直す
200
+
201
+
202
+
203
+ if(ay<0 || ay>=HEIGHT) continue;
204
+
205
+ if(minX2[ay]>ax)//minなX(左側の線分)
206
+
207
+ {
208
+
209
+ minX2[ay]=ax;
210
+
211
+ int b=(1.0-k)*b1+k*b2;
212
+
213
+ int g=(1.0-k)*g1+k*g2;
214
+
215
+ int r=(1.0-k)*r1+k*r2;
216
+
217
+
218
+
219
+ if(r<0) r=0; if(r>255) r=255;
220
+
221
+ if(g<0) g=0; if(g>255) g=255;
222
+
223
+ if(b<0) b=0; if(b>255) b=255;
224
+
225
+
226
+
227
+ cmin[ay]=RGB(b,g,r);
228
+
229
+ PSET(ax,ay,cmin[ay]);
230
+
231
+ }
232
+
233
+ if(maxX2[ay]<ax)//maxなX(右側の線分)
234
+
235
+ {
236
+
237
+ maxX2[ay]=ax;
238
+
239
+
240
+
241
+ int b=(1.0-k)*b1+k*b2;
242
+
243
+ int g=(1.0-k)*g1+k*g2;
244
+
245
+ int r=(1.0-k)*r1+k*r2;
246
+
247
+
248
+
249
+ if(r<0) r=0; if(r>255) r=255;
250
+
251
+ if(g<0) g=0; if(g>255) g=255;
252
+
253
+ if(b<0) b=0; if(b>255) b=255;
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ cmax[ay]=RGB(b,g,r);
262
+
263
+
264
+
265
+ PSET(ax,ay,cmax[ay]);
266
+
267
+ }
268
+
269
+
270
+
271
+ }
272
+
273
+ }
274
+
275
+
276
+
277
+ inline void TRIANGLE2(int x1,int y1,int x2,int y2,int x3,int y3,int c1,int c2,int c3)
278
+
279
+ {
280
+
281
+
282
+
283
+ for(int i=0;i<HEIGHT;i++)
284
+
285
+ {
286
+
287
+ minX2[i]=65536;
288
+
289
+ maxX2[i]=-65536;
290
+
291
+ cmin[i]=RGB(0,0,0);
292
+
293
+ cmax[i]=RGB(0,0,0);
294
+
295
+ }
296
+
297
+
298
+
299
+
300
+
301
+ ScanEdge(x1,y1,x2,y2,c1,c2);
302
+
303
+ ScanEdge(x2,y2,x3,y3,c2,c3);
304
+
305
+ ScanEdge(x3,y3,x1,y1,c3,c1);
306
+
307
+
308
+
309
+ for(int y=0;y<HEIGHT;y++)
310
+
311
+ {
312
+
313
+ if(minX2[y]==65536 || maxX2[y]==-65536) continue;
314
+
315
+
316
+
317
+ for(int x=minX2[y];x<=maxX2[y];x++)
318
+
319
+ {
320
+
321
+ int r1=cmin[y] & 0xFF;
322
+
323
+ int g1=cmin[y]>>8 & 0xFF;
324
+
325
+ int b1=cmin[y]>>16 & 0xFF;
326
+
327
+
328
+
329
+ int r2=cmax[y] & 0xFF;
330
+
331
+ int g2=cmax[y]>>8 & 0xFF;
332
+
333
+ int b2=cmax[y]>>16 & 0xFF;
334
+
335
+
336
+
337
+ int j=((x-minX2[y])<<8)/(maxX2[y]-minX2[y]+1);
338
+
339
+
340
+
341
+ int r=r1*((1<<8)-j)+(r2)*j>>8;
342
+
343
+ int g=g1*((1<<8)-j)+(g2)*j>>8;
344
+
345
+ int b=b1*((1<<8)-j)+(b2)*j>>8;
346
+
347
+
348
+
349
+ int NewR=r;
350
+
351
+ int NewG=g;
352
+
353
+ int NewB=b;
354
+
355
+
356
+
357
+ if(NewR<0) NewR=0; if(NewR>255) NewR=255;
358
+
359
+ if(NewG<0) NewG=0; if(NewG>255) NewG=255;
360
+
361
+ if(NewB<0) NewB=0; if(NewB>255) NewB=255;
362
+
363
+
364
+
365
+
366
+
367
+ PSET(x,y,RGB(NewB,NewG,NewR));
368
+
369
+ }
370
+
371
+ }
372
+
373
+ }
374
+
375
+
376
+
377
+ XYZ CalcNormal2(XYZ a,XYZ b,XYZ c)
378
+
379
+ {
380
+
381
+ XYZ d={0.0f};
382
+
383
+ XYZ a2,b2;
384
+
385
+
386
+
387
+ a2.x=a.x-b.x;
388
+
389
+ a2.y=a.y-b.y;
390
+
391
+ a2.z=a.z-b.z;
392
+
393
+
394
+
395
+ b2.x=a.x-c.x;
396
+
397
+ b2.y=a.y-c.y;
398
+
399
+ b2.z=a.z-c.z;
400
+
401
+
402
+
403
+ double len=sqrt(a2.x*a2.x+a2.y*a2.y+a2.z*a2.z);
404
+
405
+ a2.x/=len;
406
+
407
+ a2.y/=len;
408
+
409
+ a2.z/=len;
410
+
411
+
412
+
413
+ double len2=sqrt(b2.x*b2.x+b2.y*b2.y+b2.z*b2.z);
414
+
415
+ b2.x/=len2;
416
+
417
+ b2.y/=len2;
418
+
419
+ b2.z/=len2;
420
+
421
+
422
+
423
+
424
+
425
+ //23-32 31-13 12-21
426
+
427
+ //aY*bZ-aZ*bY aZ*bX-aX*bZ aX*bY-aY*bX
428
+
429
+ d.x=a2.y*b2.z-a2.z*b2.y;
430
+
431
+ d.y=a2.z*b2.x-a2.x*b2.z;
432
+
433
+ d.z=a2.x*b2.y-a2.y*b2.x;
434
+
435
+
436
+
437
+ return d;
438
+
439
+ }
440
+
441
+
442
+
443
+
444
+
445
+ LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
446
+
447
+
448
+
449
+
450
+
451
+
452
+
453
+ HDC hdc;
454
+
455
+ PAINTSTRUCT ps;
456
+
457
+
458
+
459
+ switch (iMsg) {
460
+
461
+
462
+
463
+ case WM_TIMER:
464
+
465
+ {
466
+
467
+ if(GetAsyncKeyState(VK_ESCAPE)<0)
468
+
469
+ SendMessage(hwnd,WM_DESTROY,NULL,NULL);
470
+
471
+ double X=0.0f;
472
+
473
+ double Y=0.0f;
474
+
475
+ double Z=0.0f;
476
+
477
+
478
+
479
+ //Z+=0.1f;
480
+
481
+ //Y+=0.1f;
482
+
483
+ if(GetAsyncKeyState(VK_RIGHT)<0) Y=-2.5f;
484
+
485
+ else if(GetAsyncKeyState(VK_LEFT)<0) Y=2.5f;
486
+
487
+ else Y=0.0f;
488
+
489
+
490
+
491
+ if(GetAsyncKeyState(VK_DOWN)<0) X=-2.5f;
492
+
493
+ else if(GetAsyncKeyState(VK_UP)<0) X=2.5f;
494
+
495
+ else X=0.0f;
496
+
497
+
498
+
499
+ Rotate(X,Y,0);
500
+
501
+ static int X1=0,X2=0;
502
+
503
+ int n=8;
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+ InvalidateRect(hwnd,NULL,NULL);
512
+
513
+ }
514
+
515
+ return 0;
516
+
517
+ case WM_CREATE:
518
+
519
+ MyOutputDebugString("起動しました。");
520
+
521
+ Init();//3次元座標を代入
522
+
523
+
524
+
525
+ SetTimer(hwnd,100,5,NULL);
526
+
527
+ /* BITMAPINFOをゼロクリア */
528
+
529
+ ZeroMemory(&biInfo, sizeof(BITMAPINFO));
530
+
531
+
532
+
533
+ /* BITMAPINFO設定 */
534
+
535
+ biInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
536
+
537
+ biInfo.bmiHeader.biWidth = WIDTH;
538
+
539
+ biInfo.bmiHeader.biHeight = -HEIGHT;
540
+
541
+ biInfo.bmiHeader.biPlanes = 1;
542
+
543
+ biInfo.bmiHeader.biBitCount = 32;
544
+
545
+ biInfo.bmiHeader.biCompression = BI_RGB;
546
+
547
+
548
+
549
+ /* ウインドウのDCを取得 */
550
+
551
+ hdc = GetDC(hwnd);
552
+
553
+
554
+
555
+ /* biInfoの形式でDIBSectionを作成 */
556
+
557
+ hBMP =CreateDIBSection(hdc, &biInfo, DIB_RGB_COLORS, (LPVOID*)(&lpPixel), NULL, 0);
558
+
559
+
560
+
561
+ /* DIBSection用のメモリDCを作成 */
562
+
563
+ hdcBMP = CreateCompatibleDC(hdc);
564
+
565
+
566
+
567
+ /* メモリDCにDIBSectionを選択 */
568
+
569
+ hBMPOLD = (HBITMAP)SelectObject(hdcBMP, hBMP);
570
+
571
+
572
+
573
+ /* 不要になったウインドウのDCを解放 */
574
+
575
+ ReleaseDC(hwnd, hdc);
576
+
577
+
578
+
579
+ return 0;
580
+
581
+ case WM_PAINT:
582
+
583
+ {
584
+
585
+ hdc = BeginPaint(hwnd, &ps);
586
+
587
+
588
+
589
+ ClearScreen();//画面を消す
590
+
591
+
592
+
593
+ Projection2DAxisFrom3DAxis(hdc);//透視投影
594
+
595
+
596
+
597
+ XYZ vvv[12];//全ての頂点の法線をクリアする
598
+
599
+
600
+
601
+ for(int i=0;i<12;i++)
602
+
603
+ {
604
+
605
+ vvv[i].x=0.0f;//Clear
606
+
607
+ vvv[i].y=0.0f;//Clear
608
+
609
+ vvv[i].z=0.0f;//Clear
610
+
611
+ //これが無いとどんどん加算されてしまう
612
+
613
+ }
614
+
615
+
616
+
617
+
618
+
619
+ for(int i=0;i<12;i++)
620
+
621
+ {
622
+
623
+ int i1=Poly[i][0];
624
+
625
+ int i2=Poly[i][1];
626
+
627
+ int i3=Poly[i][2];
628
+
629
+
630
+
631
+ XYZ n=CalcNormal2(Pnt[i1],Pnt[i2],Pnt[i3]);
632
+
633
+ vvv[i1].x+=n.x;
634
+
635
+ vvv[i1].y+=n.y;
636
+
637
+ vvv[i1].z+=n.z;
638
+
639
+
640
+
641
+ vvv[i2].x+=n.x;
642
+
643
+ vvv[i2].y+=n.y;
644
+
645
+ vvv[i2].z+=n.z;
646
+
647
+
648
+
649
+ vvv[i3].x+=n.x;
650
+
651
+ vvv[i3].y+=n.y;
652
+
653
+ vvv[i3].z+=n.z;
654
+
655
+
656
+
657
+ vvv[i1].count++;
658
+
659
+ vvv[i2].count++;
660
+
661
+ vvv[i3].count++;
662
+
663
+ //全ての頂点毎に、全ての面の頂点座標と比較して、
664
+
665
+
666
+
667
+ }
668
+
669
+
670
+
671
+ for(int i=0;i<8;i++)
672
+
673
+ {
674
+
675
+ if(vvv[i].count>0)
676
+
677
+ {
678
+
679
+ vvv[i].x/=vvv[i].count ;
680
+
681
+ vvv[i].y/=vvv[i].count ;
682
+
683
+ vvv[i].z/=vvv[i].count ;
684
+
685
+ }
686
+
687
+ }
688
+
689
+
690
+
691
+ //頂点ベクトルは求まった(はず...)から、頂点カラーを面にある全ての頂点で求める
692
+
693
+ double ViewCos[12];
694
+
695
+
696
+
697
+ int vpx=200,vpy=-120,vpz=100;
698
+
699
+
700
+
701
+ for(int i=0;i<12;i++)
702
+
703
+ {
704
+
705
+ double a=sqrt(vvv[i].x*vvv[i].x+vvv[i].y*vvv[i].y+vvv[i].z*vvv[i].z)+0.01f;
706
+
707
+
708
+
709
+ vvv[i].x/=a;
710
+
711
+ vvv[i].y/=a;
712
+
713
+ vvv[i].z/=a;
714
+
715
+
716
+
717
+ double vv=sqrt((vpx*vpx+vpy*vpy+vpz*vpz));//視線ベクトルの長さを求める
718
+
719
+
720
+
721
+ double v1=vpx/(vv+0.01f);//視線ベクトルの正規化
722
+
723
+ double v2=vpy/(vv+0.01f);//
724
+
725
+ double v3=vpz/(vv+0.01f);//
726
+
727
+
728
+
729
+ ViewCos[i]=(v1*vvv[i].x+v2*vvv[i].y+v3*vvv[i].z);
730
+
731
+ //視線ベクトルと面ごとの法線ベクトルの内積
732
+
733
+ if(ViewCos[i]<0)
734
+
735
+ TRIANGLE2(Pnt2[Poly[i][0]].x,Pnt2[Poly[i][0]].y,
736
+
737
+ Pnt2[Poly[i][1]].x,Pnt2[Poly[i][1]].y,
738
+
739
+ Pnt2[Poly[i][2]].x,Pnt2[Poly[i][2]].y,
740
+
741
+ RGB(255,255,255),
742
+
743
+ RGB(255,255,255),
744
+
745
+ RGB(255,255,255)
746
+
747
+ );
748
+
749
+ //とりあえず真っ白にしたが、頂点カラーを求めた後にどうすれば
750
+
751
+ //3点の色を指定する処理になるか分からないです。
752
+
753
+
754
+
755
+ }
756
+
757
+
758
+
759
+
760
+
761
+
762
+
763
+ CalcFPS(hdc);
764
+
765
+
766
+
767
+ /* DIBSectionをDIBとして描画 */
768
+
769
+ StretchDIBits(hdc, 0, 0, WIDTH, HEIGHT,
770
+
771
+ 0, 0, WIDTH, HEIGHT, lpPixel, &biInfo,
772
+
773
+ DIB_RGB_COLORS,SRCCOPY);
774
+
775
+
776
+
777
+
778
+
779
+ EndPaint(hwnd, &ps);
780
+
781
+
782
+
783
+ DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));
784
+
785
+ }
786
+
787
+ return 0;
788
+
789
+
790
+
791
+ case WM_DESTROY: /* ウインドウ破棄時 */
792
+
793
+
794
+
795
+ SelectObject(hdcBMP, hBMPOLD);
796
+
797
+
798
+
799
+ DeleteObject(hdcBMP);
800
+
801
+ DeleteObject(hBMP);
802
+
803
+
804
+
805
+ PostQuitMessage(0);
806
+
807
+
808
+
809
+ return 0;
810
+
811
+
812
+
813
+ }
814
+
815
+
816
+
817
+ return DefWindowProc(hwnd, iMsg, wParam, lParam);
818
+
819
+
820
+
821
+ }