Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
1

Кубик-Рубика

12.05.2013, 20:33. Просмотров 3486. Ответов 49
Метки нет (Все метки)

добрый вечер, форумчане) мне необходимо написать программу кубика-рубика. руководитель посоветовала использовать opengl, так вот у меня, как наверное у многих новичков, мало что выходит, разобрался я с примитивами, а дальше не знаю куда/что, буду признателен, если подскажете в какую сторону копать)
в частности интересует, как сделать так, чтоб можно было двигать хотя бы 2 объекта независимо друг от друга?
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2013, 20:33
Ответы с готовыми решениями:

Игра 'Кубик Рубика'
Ребят мне очень нужна ваша помощь. Помогите создать игру кубик рубик. Но без 3D модели. Никак не...

Кубик Рубика
Задача такая,из любой позиции собрать кубик Рубика за минимальное число ходов(вывести алгоритм...

Дорисовать кубик рубик
Господа требуется через canvas на форме нарисовать кубик рубик Лицевую часть сделал, а вот боковую...

кубик рубика
Нужна помощь. Никак не могу найти алгоритма. Мне нужно заштрихованный кубик передвинуть на 3 ряд...

Кубик Рубика
Здравствуйте подскажите пожалуйста , хочу попробовать сделать кубика Рубика , пока стоит задача ->...

49
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
12.05.2013, 23:24 2

Не по теме:


Вам шашечки или ехать?


Вам нужно найти исходный код или заниматься ликбезом на форуме?
0
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
12.05.2013, 23:43  [ТС] 3
мне нужно, чтоб Вы дали нужный мне источник, где будет по минимуму ненужной мне инфы) хотя бы в сторону какой темы идти
с готовыми кодами не могу разобраться
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
13.05.2013, 00:27 4
Такой устроит?
Кликните здесь для просмотра всего текста

rubic_d.dpr
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
program rubic_d;
 
uses
  Windows, Messages, OpenGL;
 
{$I *.inc}
 
//-----------------------------------------------------------
 
function ROL(const aVal : LongWord; aShift : Byte) : LongWord; assembler;
// Arg1 = EAX, Arg2 = DL
asm
  mov  cl, dl
  rol  eax, cl
end;
 
function ROR(const aVal : LongWord; aShift : Byte) : LongWord; assembler;
// Arg1 = EAX, Arg2 = DL
asm
  mov  cl, dl
  ror  eax, cl
end;
 
//-----------------------------------------------------------
 
procedure RenderVerge(Verge : Pointer);
type
  BufArray = array[0..0] of Byte;
var
  I, J   : Integer;
  Offset : Integer;
  Buf    : ^BufArray absolute Verge;
begin
  Offset := 0;
  for I := 0 to 8 do
  begin
    glTranslatef(CooTrans[Offset], CooTrans[Offset + 1], CooTrans[Offset + 2]);
    J := Byte(Buf[I]);
    if J < $80 then
    begin
      glTexCoordPointer(2, GL_FLOAT, 0, @TexGr0[J shl 3]);
      glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, @verquad);
    end;
    inc(Offset, 3); // переместить на 12 байт
  end;
  glTranslatef(CooTrans[Offset], CooTrans[Offset + 1], CooTrans[Offset + 2]);
end; // RenderVerge
 
//-----------------------------------------------------------
 
procedure RenderVerges;
type
  CubArrayDWORD = array[0..0] of DWORD;
var
  I, J        : DWORD;
  P           : Pointer;
  RotateData1,
  RotateData2 : array[0..3] of GLfloat;
  CubVrDWord  : CubArrayDWord absolute CubVerge;
begin
  if (ugolp and $7F <> 0) and (Rotate <> 0) then
  begin
    FillChar(RotateData1, SizeOf(RotateData1), 0);
    FillChar(RotateData2, SizeOf(RotateData2), 0);
 
    if (ugolp >= $80) then  // Negative
    begin
      RotateData1[0] := ugolp and $7F;
      RotateData2[0] := -(ugolp and $7F);
    end
    else
    begin
      RotateData2[0] := ugolp;
      RotateData1[0] := -ugolp;
    end;
 
    P := NIL;
    case Rotate of
      1 :
      begin
    P := @CubeMask0;
    RotateData1[1] := 1.0;
    RotateData2[1] := 1.0;
    Verq := @Verq0;
      end;  
 
      2 :
      begin
    P := @CubeMask1;
    RotateData1[1] := 1.0;
    RotateData2[1] := 1.0;
    Verq := @Verq1;
      end;  
 
      3 :
      begin
    P := @CubeMask2;
    RotateData1[2] := 1.0;
    RotateData2[2] := 1.0;
    Verq := @Verq2;
      end;  
 
      4 :
      begin
    P := @CubeMask3;
    RotateData1[2] := 1.0;
    RotateData2[2] := 1.0;
    Verq := @Verq3;
      end;  
 
      5 :
      begin
    P := @CubeMask4;
    RotateData1[3] := 1.0;
    RotateData2[3] := 1.0;
    Verq := @Verq4;
      end;  
 
      6 :
      begin
    P := @CubeMask5;
    RotateData1[3] := 1.0;
    RotateData2[3] := 1.0;
    Verq := @Verq5;
      end;  
    end;
    
    for I := 0 to 13 do
      CubVrDWord[I] := CubVrDWord[I] or (DWORD(Pointer(DWORD(P) + I * 4)^) shl 7);
  
    glRotatef(RotateData1[0], RotateData1[1], RotateData1[2], RotateData1[3]);
    glTexCoordPointer(2, GL_FLOAT, 0, @TexGr0[40]);
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, Verq);
 
    for I := 0 to 3 do
    begin
      J := DWORD(@(CubVrDWord)) + I * 9;
      RenderVerge(Pointer(J));
      glRotatef(Angle, 0.0, 1.0, 0.0);
    end;
 
    glRotatef(NegAngle, 1.0, 0.0, 0.0);
    RenderVerge(Pointer(J + 9));
    glRotatef(DblAngle, 1.0, 0.0, 0.0);
    RenderVerge(Pointer(J + 18));
    glRotatef(NegAngle, 1.0, 0.0, 0.0);
    glRotatef(RotateData2[0], RotateData2[1], RotateData2[2], RotateData2[3]);
    glTexCoordPointer(2, GL_FLOAT, 0, @TexGr0[40]);
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, Pointer(DWORD(Verq) + 4));
 
    for I := 0 to 13 do
      CubVrDWord[I] := CubVrDWord[I] xor $80808080;
  end;
 
  for I := 0 to 3 do
  begin
    J := DWORD(@(CubVrDWord)) + I * 9;
    RenderVerge(Pointer(J));
    glRotatef(Angle, 0.0, 1.0, 0.0);
  end;
 
  glRotatef(NegAngle, 1.0, 0.0, 0.0);
  RenderVerge(Pointer(J + 9));
  glRotatef(DblAngle, 1.0, 0.0, 0.0);
  RenderVerge(Pointer(J + 18));
  glRotatef(NegAngle, 1.0, 0.0, 0.0);
 
  for I := 0 to 13 do
    CubVrDWord[I] := CubVrDWord[I] and $F0F0F0F;
end; // RenderVerges
 
//-----------------------------------------------------------
 
procedure ShiftVerge;
type
  CubArrayByte = array[0..0] of Byte;
var
  I, J, 
  Offset     : Integer;
  B          : Byte;
  Rot        : DWORD;
  CubVrByte  : CubArrayByte absolute CubVerge;
begin
  Rot := pred(Rotate);
  if Rot >= $80 then    // Negative
    Exit;
  J := (ugolp and $80);
  I := (ugolp and $7F) + 2;
 
  if I < 90 then
  begin
    ugolp := I or J;
    Exit;
  end;
    
  if Rot >= 6 then
    Rot := 5;
 
  Rot    := Rot * 20;
  Offset := Rot;
  
  for I := 0 to 4 do
  begin
    for J := 0 to 3 do
    begin
      Rot := Rot shl 8;
      B := CubVrByte[RuleShift[Offset]];
      Rot := (Rot and $FFFFFF00) or B;
      inc(Offset);
    end;
 
    if (ugolp and $80) <> 0 then
      Rot := ROL(Rot, 8)
    else
      Rot := ROR(Rot, 8);
      
    for J := 0 to 3 do
    begin
      dec(Offset);
      CubVrByte[RuleShift[Offset]] := Lo(Rot);
      Rot := Rot shr 8;
    end;
 
    inc(Offset, 4)
  end;
  ugolp  := 0;
  Rotate := 0;
end; // ShiftVerge
 
//-----------------------------------------------------------
 
procedure RenderScene;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glPushMatrix;
  glRotatef(RotateX / float20, 1.0, 0.0, 0.0);
  glRotatef(RotateY / float20, 0.0, 1.0, 0.0);
  glRotatef(RotateZ / float20, 0.0, 0.0, 1.0);
  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  glVertexPointer(3, GL_FLOAT, 0, @CooQuad);
  RenderVerges;
  glPopMatrix;
  SwapBuffers(DC);
end;
 
//-----------------------------------------------------------
 
procedure FillSticker(Color : TColorRef; CornerA, CornerB : Integer);
var
  Pen      : HPEN;
  Br       : HBRUSH;
  Logbrush : TLogBrush;
begin
  // Sticker
  Pen := SelectObject(DCBitmap, CreatePen(PS_SOLID, 1, Color));
  Br  := SelectObject(DCBitmap, CreateSolidBrush(Color));
  try
    RoundRect(DCBitmap, CornerA + 4, CornerB + 4, CornerA + 60, CornerB + 60, 10, 10);
  finally
    DeleteObject(SelectObject(DCBitmap, Br));
    DeleteObject(SelectObject(DCBitmap, Pen));
  end;
  // Border
  Pen := SelectObject(DCBitmap, CreatePen(PS_SOLID, 1, $202020));
  FillChar(LogBrush, SizeOf(LogBrush), 0);
  LogBrush.lbStyle := BS_HOLLOW;
  Br := SelectObject(DCBitmap, CreateBrushIndirect(LogBrush));
  try
    RoundRect(DCBitmap, CornerA, CornerB, CornerA + 64, CornerB + 64, 3, 3);
  finally
    DeleteObject(SelectObject(DCBitmap, Br));
    DeleteObject(SelectObject(DCBitmap, Pen));
  end;
end;
 
//-----------------------------------------------------------
 
procedure CreateTexture;
var
  aRect  : TRect;
  OldBMP : HBITMAP;
  Brush  : HBRUSH;
  BmSize : DWORD;
  P      : Pointer;
{$IFDEF SAVETEXTURE}
  FileHandle : THandle;
  bfh        : TBitmapFileHeader;
  Res        : DWORD;
{$ENDIF}
 
  function BytesPerScanline(PixelsPerScanline, BitsPerPixel, Alignment: Longint): Longint;
  begin
    dec(Alignment);
    Result := ((PixelsPerScanline * BitsPerPixel + Alignment) and not Alignment) shr 3;
  end;
 
begin
  BmSize := BytesPerScanline(BMPWIDTH, 24, 32) * Abs(BMPHEIGHT);
  BufBitmap := Pointer(GlobalAlloc(GPTR, BmSize + SizeOf(TBITMAPINFOHEADER) + 256));
  
  P := Pointer(DWORD(BufBitmap) + BmSize);
  FillChar(PBITMAPINFOHEADER(P)^, SizeOf(TBITMAPINFOHEADER), 0);
  with PBITMAPINFOHEADER(P)^ do
  begin
    biSize          := SizeOf(TBITMAPINFOHEADER);
    biWidth         := BMPWIDTH;
    biHeight        := BMPHEIGHT;
    biPlanes        := 1;
    biBitCount      := 24;
    biCompression   := BI_RGB;
    biSizeImage     := BmSize;
    biXPelsPerMeter := BMPWIDTH;
    biYPelsPerMeter := BMPHEIGHT;
  end;
  Byte(Pointer(DWORD(P) + SizeOf(TBITMAPINFOHEADER))^) := 0;
 
  DCBitmap := CreateCompatibleDC(DC);
  DIBitmap := CreateDIBitmap(DC, PBitmapInfo(P)^.bmiHeader, CBM_INIT, BufBitmap, PBitmapInfo(P)^, DIB_RGB_COLORS);
  try
    GetDIBits(DC, DIBitmap, 0, BMPHEIGHT, NIL, PBitmapInfo(P)^, DIB_RGB_COLORS);
    OldBMP   := SelectObject(DCBitmap, DIBitmap);
    Brush    := CreateSolidBrush(BrushColor);
    try
      SetRect(aRect, 0, 0, BMPWIDTH, BMPHEIGHT);
      FillRect(DCBitmap, aRect, Brush);
 
      FillSticker(clBlue,      0,  0);
      FillSticker(clGreen,    64,  0);
      FillSticker(clRed,     128,  0);
      FillSticker(clCyan,      0, 64);
      FillSticker(clYellow,   64, 64);
      FillSticker(clMagenta, 128, 64);
 
      GetDIBits(DC, DIBitmap, 0, BMPHEIGHT, BufBitmap, PBitmapInfo(P)^, DIB_RGB_COLORS);
      SelectObject(DCBitmap, OldBMP);
{$IFDEF SAVETEXTURE}
      // Save texture
      bfh.bfType    := $4D42;
      bfh.bfSize    := BmSize + SizeOf(bfh) + SizeOf(TBitmapInfoHeader);
      bfh.bfOffBits := SizeOf(bfh) + SizeOf(TBitmapInfoHeader);
      FileHandle := CreateFile('texture.bmp', GENERIC_WRITE, FILE_SHARE_WRITE, NIL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
      WriteFile(FileHandle, bfh, SizeOf(bfh), Res, NIL);
      WriteFile(FileHandle, PBitmapInfo(P)^, SizeOf(TBitmapInfoHeader), Res, NIL);
      WriteFile(FileHandle, BufBitmap^, BmSize, Res, NIL);
      CloseHandle(FileHandle);
{$ENDIF}
    finally
      DeleteObject(Brush);
    end;
  finally
    DeleteObject(DIBitmap);
    DeleteDC(DCBitmap);
  end;
end;
 
//-----------------------------------------------------------
 
procedure MouseMove(Wnd : HWND; lParam : Longint);
var
  Pt : TPoint;
begin
  Pt.y := HIWORD(lParam);
  if Pt.y <> CursorY then;
  begin
    if Pt.y < CursorY then
    begin
      inc(RotateX, MouseDelta);
      if RotateX >= AllTurn then
    dec(RotateX, AllTurn)
    end
    else
    begin
      dec(RotateX, MouseDelta);
      if RotateX < 0 then
    inc(RotateX, AllTurn);
    end;
    CursorY := Pt.y;
  end;
 
  Pt.x := LOWORD(lParam);
  if Pt.x <> CursorX then
  begin
    if Pt.x < CursorX then
    begin
      inc(RotateY, MouseDelta);
      if RotateY >= AllTurn then
    dec(RotateY, AllTurn);
    end
    else
    begin
      dec(RotateY, MouseDelta);
      if RotateY < 0 then
    inc(RotateY, AllTurn);
    end;    
    CursorX := Pt.x;
  end;
 
  InvalidateRect(Wnd, NIL, False);
end;
 
//-----------------------------------------------------------
 
procedure TimerProc(Wnd : HWND; Msg, TimerID : Longint; SysTime : DWORD); stdcall;
var
  Rnd    : Integer;
  I, J   : Integer;
  Buf    : PByte absolute RotateX;
begin
  if tpovorot = 0 then
  begin
    repeat
      Rnd := Random(1000);
    until (Rnd >= 200) and (Rnd < 500);
 
    tpovorot := Rnd;
    I := rubpovorot and 7;
 
    repeat
      Rnd := Random(1000);
      J   := Lo(Rnd) and 3;
    until (Lo(J) < 3) and (I <> Lo(J));
 
    rubpovorot := Lo((Hi(Rnd) and 16) or Lo(J));
  end;
 
  I := (rubpovorot and 3);
 
  // Если порядок переменных RotateX..RotateAbs в Rubic_d.inc не изменялся
  if rubpovorot and 16 <> 0 then
  begin
    dec(RotateAbs[I], TimerDelta);
    if RotateAbs[I] < 0 then
      inc(RotateAbs[I], AllTurn);
  end
  else
  begin
    inc(RotateAbs[I], TimerDelta);
    if RotateAbs[I] >= AllTurn then
      dec(RotateAbs[I], AllTurn);
  end;
 
  // Если всё же порядок переменных RotateX..RotateAbs в Rubic_d.inc был изменён,
  // то следует использовать код указанный ниже. Код приведённый выше - заблокировать.
{  if rubpovorot and 16 <> 0 then
  case I of
    0 :
    begin
      dec(RotateX, TimerDelta);
      if RotateX < 0 then
    inc(RotateX, AllTurn);
    end;
    4 :
    begin
      dec(RotateY, TimerDelta);
      if RotateY < 0 then
    inc(RotateY, AllTurn);
    end;
    8 :
    begin
      dec(RotateZ, TimerDelta);
      if RotateZ < 0 then
    inc(RotateZ, AllTurn);
    end;
  end
  else
  case I of
    0 :
    begin
      inc(RotateX, TimerDelta);
      if RotateX >= AllTurn then
    dec(RotateX, AllTurn);
    end;
    4 :
    begin
      inc(RotateY, TimerDelta);
      if RotateY >= AllTurn then
    dec(RotateY, AllTurn);
    end;
    8 :
    begin
      inc(RotateZ, TimerDelta);
      if RotateZ >= AllTurn then
    dec(RotateZ, AllTurn);
    end;
  end;}
 
  dec(tpovorot);
  ShiftVerge;
  if (Rotate = 0) then
  begin
    repeat
      Rnd := Random(1000);
      J := Lo(Rnd) and 7;
    until (Lo(J) < 7) and (Rotate <> Lo(J));
    
    Rotate := Lo(J);
    ugolp  := Hi((Rnd and $80FF) or $100);
  end;
 
  InvalidateRect(Wnd, NIL, False);
end; // TimerProc
 
//-----------------------------------------------------------
 
procedure InitApp(Wnd : HWND);
var
  PFD : TPIXELFORMATDESCRIPTOR;
begin  
  DC := GetDC(Wnd);
  CreateTexture;
  
  FillChar(PFD, SizeOf(PFD), 0);
  PFD.nSize       := SizeOf(PFD);
  PFD.nVersion    := 1;
  PFD.dwFlags     := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  PFD.iPixelType  := PFD_TYPE_RGBA;
  PFD.cColorBits  := 24;
  PFD.cDepthBits  := 16;
  PFD.iLayerType  := PFD_MAIN_PLANE;
 
  SetPixelFormat(DC, ChoosePixelFormat(DC, @PFD), @PFD);
  GLRC := wglCreateContext(DC);
  wglMakeCurrent(DC, GLRC);
  glClearColor(0.0, 0.0, 0.0, 0.0);
 
//  GetClientRect(Wnd, WndRect);
 
  glViewport(0, 0, SPECWIDTH, SPECHEIGHT);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(InitCoo[0], InitCoo[1], InitCoo[2], InitCoo[3], InitCoo[4], InitCoo[5]);
  glMatrixMode(GL_MODELVIEW);
 
  glLoadIdentity;
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_POLYGON_SMOOTH);
  glClearColor(0.0, 0.0, 0.0, 1.0);
 
  glEnable(GL_LIGHTING);
  glLightfv(GL_LIGHT0, GL_AMBIENT,  @Ambient);
  glLightfv(GL_LIGHT0, GL_DIFFUSE,  @Diffuse);
  glLightfv(GL_LIGHT0, GL_SPECULAR, @SpecRef);
  glLightfv(GL_LIGHT0, GL_POSITION, @PosLight);
  glEnable(GL_LIGHT0);
  
  glEnable(GL_COLOR_MATERIAL);
  glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  glMateriali(GL_FRONT, GL_SHININESS, 128);
  
  glEnable(GL_TEXTURE_2D);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, BMPWIDTH, BMPHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, BufBitmap);
 
  Randomize;
  
  Timer := SetTimer(Wnd, 0, 10, @TimerProc);
end; // InitApp
 
//-----------------------------------------------------------
 
function MainProc(Wnd : HWND; Msg : Integer; wParam, lParam : Longint): Integer; stdcall;
begin
  Result := 0;
 
  case Msg of
    WM_CREATE : InitApp(Wnd);
 
    WM_PAINT :
    begin
      RenderScene;
      ValidateRect(Wnd, NIL);
      Exit;
    end;
 
    WM_MOUSEMOVE :
      if wParam = MK_LBUTTON then
        MouseMove(Wnd, lParam);
 
    WM_KEYDOWN :
      if wParam = VK_ESCAPE then
    SendMessage(Wnd, WM_CLOSE, 0, 0);
 
    WM_CLOSE :
    begin
      DestroyWindow(Wnd);
    end;
 
    WM_DESTROY :
    begin
      if Timer <> 0 then
        KillTimer(Wnd, Timer);
      if GLRC <> 0 then
      begin
        wglMakeCurrent(DC, 0);
        wglDeleteContext(GLRC);
      end;
      GlobalFree(DWORD(BufBitmap));         // Free allocated memory
      ReleaseDC(Wnd, DC);
      PostQuitMessage(0);
      Exit;
    end;
  end;
  Result := DefWindowProc(Wnd, Msg, wParam, lParam);
end;
 
//-----------------------------------------------------------
 
procedure Main;
var
  Window     : HWND;
  WndClass   : TWndClassEx;
  Msg        : TMsg;
  PosX, PosY,
  aWidth,
  aHeight    : Integer;
begin
  //==================================================
  // Fill WNDCLASSEX structure with required variables
  //=================================================
 
  FillChar(WndClass, SizeOf(TWndClassEx), 0);
  WndClass.cbSize        := SizeOf(TWndClassEx);
  WndClass.style         := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
  WndClass.lpfnWndProc   := @MainProc;
  WndClass.hInstance     := hInstance;
  WndClass.hCursor       := LoadCursor(0, IDC_ARROW);
  WndClass.lpszClassName := szAppName;
 
  if RegisterClassEx(WndClass) = 0 then
    Halt(255);
 
  //================================
  // Centre window at following size
  //================================
 
  aWidth  := SPECWIDTH  + GetSystemMetrics(SM_CXSIZEFRAME) * 2;
  aHeight := SPECHEIGHT + GetSystemMetrics(SM_CYSIZEFRAME) * 2 +
              GetSystemMetrics(SM_CYCAPTION);
 
  PosX := (GetSystemMetrics(SM_CXSCREEN) - aWidth) div 2;
  PosY := (GetSystemMetrics(SM_CYSCREEN) - aHeight) div 2;
 
  Window := CreateWindowEx(0, szAppName, szDisplayName,
               WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN, 
               PosX, PosY, aWidth, aHeight,
               0, 0, hInstance, NIL);
 
  ShowWindow(Window, SW_SHOW);
  UpdateWindow(Window);
 
  //===================================
  // Loop until PostQuitMessage is sent
  //===================================
 
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
 
  Halt(Msg.wParam);
end;
 
//-----------------------------------------------------------
 
begin
  Main;
end.
rubic_d.inc
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
{.$DEFINE SAVETEXTURE}
 
const
  GL_VERTEX_ARRAY       = $8074;
  GL_TEXTURE_COORD_ARRAY    = $8078;
 
  PFD_MAIN_PLANE        = 0;
  PFD_TYPE_COLORINDEX   = 1;
  PFD_TYPE_RGBA     = 0;
  PFD_DOUBLEBUFFER  = 1;
  PFD_DRAW_TO_WINDOW    = 4;
  PFD_SUPPORT_OPENGL    = $20;
 
  // Size window and bitmap
  SPECWIDTH             = 700;
  SPECHEIGHT            = 700;
  BMPWIDTH              = 256;
  BMPHEIGHT             = 128;
  BrushColor            = $505050;
 
  // Color stickers
  clRed                 = $ff0000;
  clGreen               = $00ff00;
  clBlue                = $0000ff;
  clCyan                = $11ccff;
  clMagenta             = $ff00ff;
  clYellow              = $ffff00;
 
  MouseDelta        = 20;
  TimerDelta        = 5;
  AllTurn       = 360 * MouseDelta;
 
  szAppName             = 'OPENGL32';
  szDisplayName         = 'Кубик рубик : Esc - Выход';
 
var
//  WndRect    : TRect;
  DC         : HDC;
  GLRC       : HGLRC;
  BufBitmap  : Pointer;
  DCBitmap   : HDC;
  DIBitmap   : HBITMAP;
  CursorX    : Integer;
  CursorY    : Integer;
  Timer      : DWORD = 0;
 
  InitCoo    : array[0..5] of Double = (-120.0,120.0,-120.0,120.0,120.0,-120.0);
  verquad    : array[0..3] of Byte = (0, 1, 2, 3);
  verq0      : array[0..7] of Byte = ( 7, 6, 5, 4, 4, 5, 6, 7);
  verq1      : array[0..7] of Byte = ( 8, 9,10,11,11,10, 9, 8);
  verq2      : array[0..7] of Byte = (15,14,13,12,12,13,14,15);
  verq3      : array[0..7] of Byte = (16,17,18,19,19,18,17,16);
  verq4      : array[0..7] of Byte = (23,22,21,20,20,21,22,23);
  verq5      : array[0..7] of Byte = (24,25,26,27,27,26,25,24);
 
  CooQuad    : array[0..83] of Single = (
     -20.0, 20.0,  0.0, 20.0, 20.0,  0.0, 20.0,-20.0,  0.0,-20.0,-20.0,  0.0,
      20.0, 60.0, 60.0, 20.0, 60.0,-60.0, 20.0,-60.0,-60.0, 20.0,-60.0, 60.0,
     -20.0, 60.0, 60.0,-20.0, 60.0,-60.0,-20.0,-60.0,-60.0,-20.0,-60.0, 60.0,
     -60.0, 20.0, 60.0,-60.0, 20.0,-60.0, 60.0, 20.0,-60.0, 60.0, 20.0, 60.0,
     -60.0,-20.0, 60.0,-60.0,-20.0,-60.0, 60.0,-20.0,-60.0, 60.0,-20.0, 60.0,
     -60.0, 60.0, 20.0, 60.0, 60.0, 20.0, 60.0,-60.0, 20.0,-60.0,-60.0, 20.0,
     -60.0, 60.0,-20.0, 60.0, 60.0,-20.0, 60.0,-60.0,-20.0,-60.0,-60.0,-20.0);
 
  TexGr0     : array[0..47] of Single = (
     0.0,  0.0, 0.25, 0.0, 0.25, 0.5, 0.0,  0.5,
     0.25, 0.0, 0.5,  0.0, 0.5,  0.5, 0.25, 0.5,
     0.5,  0.0, 0.75, 0.0, 0.75, 0.5, 0.5,  0.5,
     0.0,  0.5, 0.25, 0.5, 0.25, 1.0, 0.0,  1.0,
     0.25, 0.5, 0.5,  0.5, 0.5,  1.0, 0.25, 1.0,
     0.5,  0.5, 0.75, 0.5, 0.75, 1.0, 0.5,  1.0);
 
  TexGr      : array[0..47] of Single = (
     0.75, 0.0, 1.0, 0.0, 1.0, 0.5, 0.75, 0.5,
     0.75, 0.0, 1.0, 0.0, 1.0, 0.5, 0.75, 0.5,
     0.75, 0.0, 1.0, 0.0, 1.0, 0.5, 0.75, 0.5,
     0.75, 0.0, 1.0, 0.0, 1.0, 0.5, 0.75, 0.5,
     0.75, 0.0, 1.0, 0.0, 1.0, 0.5, 0.75, 0.5,
     0.75, 0.0, 1.0, 0.0, 1.0, 0.5, 0.75, 0.5);
 
  CooTrans   : array[0..29] of Single = (
     -40.0, 40.0, 60.0, 40.0,  0.0,  0.0,
      40.0,  0.0,  0.0,-80.0,-40.0,  0.0,
      40.0,  0.0,  0.0, 40.0,  0.0,  0.0,
     -80.0,-40.0,  0.0, 40.0,  0.0,  0.0,
      40.0,  0.0,  0.0,-40.0, 40.0,-60.0);
 
  verq       : Pointer = NIL;
 
  Angle      : Single = 90.0;
  DblAngle   : Single = 180.0;
  NegAngle   : Single = -90.0;
  Rotate     : Byte = 1;    // Ну не может в Delphi тип ShortInt (знаковый BYTE),
  ugolp      : Byte = 128;  // принимать значение $80, только -$80..$7F          
  float20    : Single = 20.0;
 
  CubVerge   : array[0..55] of Byte = (
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2,
    3, 3, 3, 3, 3, 3, 3, 3, 3,
    4, 4, 4, 4, 4, 4, 4, 4, 4,
    5, 5, 5, 5, 5, 5, 5, 5, 5,
    0, 0);
 
  CubeMask0  : array[0..55] of Byte = (
    1, 1, 0, 1, 1, 0, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 0, 1, 1, 0, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 0, 1, 1, 0, 1, 1, 0,
    1, 1, 0, 1, 1, 0, 1, 1, 0,
    0, 0);
 
  CubeMask1  : array[0..55] of Byte = (
    0, 1, 1, 0, 1, 1, 0, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 0, 1, 1, 0, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 0, 1, 1, 0, 1, 1,
    0, 1, 1, 0, 1, 1, 0, 1, 1,
    0, 0);
 
  CubeMask2  : array[0..55] of Byte = (
    0, 0, 0, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 0);
 
  CubeMask3  : array[0..55] of Byte = (
    1, 1, 1, 1, 1, 1, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0);
 
  CubeMask4  : array[0..55] of Byte = (
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 0, 1, 1, 0, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 0, 1, 1, 0, 1, 1, 0,
    1, 1, 1, 1, 1, 1, 0, 0, 0,
    0, 0, 0, 1, 1, 1, 1, 1, 1,
    0, 0);
 
  CubeMask5  : array[0..55] of Byte = (
    1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 0, 1, 1, 0, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 0, 1, 1, 0, 1, 1,
    0, 0, 0, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 0, 0, 0,
    0, 0);
 
  RuleShift  : array[0..119] of Byte = (
    12, 10, 14, 16,  9, 11, 17, 15,  5, 41,
    21, 50,  2, 38, 24, 47,  8, 44, 18, 53,
    34, 32, 28, 30, 33, 35, 29, 27, 36, 26,
    45,  0, 39, 23, 48,  3, 42, 20, 51,  6,
    42, 36, 38, 44, 43, 39, 37, 41,  0, 27,
    18,  9,  1, 28, 19, 10,  2, 29, 20, 11,
    46, 48, 52, 50, 45, 51, 53, 47, 33, 24,
    15,  6, 34, 25, 16,  7, 35, 26, 17,  8,
     0,  2,  8,  6,  1,  5,  7,  3, 42,  9,
    47, 35, 43, 12, 46, 32, 44, 15, 45, 29,
    19, 21, 25, 23, 20, 18, 24, 26, 36, 11,
    53, 33, 37, 14, 52, 30, 38, 17, 51, 27);
 
  WhLight    : array[0..3] of GLfloat = (0.1,   0.1,    0.1, 1.0);
  SpecRef    : array[0..3] of GLfloat = (1.0,   1.0,    1.0, 1.0);
  Ambient    : array[0..3] of GLfloat = (0.3,   0.3,    0.3, 1.0);
  Diffuse    : array[0..3] of GLfloat = (0.9,   0.9,    0.9, 1.0);
  PosLight   : array[0..3] of GLfloat = (0.0, 110.0, -110.0, 0.0);
 
  fovy       : GLdouble = 45.0;
  aspect     : GLdouble = 1.0;
  zNear      : GLdouble = 1.0;
  zFar       : GLdouble = 20.0;
 
  // Не изменять порядок следования следующих 4 переменных!!!
  // Для создания более компактного кода эти переменные должны располагаться
  // в указанной последовательности, см. процедуру TimerProc.
  RotateX,
  RotateY,
  RotateZ    : Integer;
  RotateAbs  : array[0..0] of Integer absolute RotateX;
  // ==============================================
 
  tpovorot   : Word;
  rubpovorot : Byte;
 
procedure glEnableClientState(aarray : GLenum); stdcall; external OpenGL32;
procedure glVertexPointer(size : GLint; atype : GLenum;
                          stride: GLsizei; data: pointer); stdcall; external OpenGL32;
procedure glTexCoordPointer(size: GLint; atype: GLEnum; stride: GLsizei; data: pointer); stdcall; external OpenGL32;
procedure glDrawElements(mode: GLEnum; count: GLsizei; atype: GLEnum; indices: Pointer); stdcall; external OpenGL32;
1
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
13.05.2013, 01:03  [ТС] 5
я хочу сам написать) мне бы только пинок в нужное русло...в нужный источник инфы) рус. желательно)
ЗЫ премного благодарен за код) но не получается скомпилировать =\
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
13.05.2013, 01:10 6
Цитата Сообщение от luciys Посмотреть сообщение
я хочу сам написать
Ну так и пиши, разберись с кодом и сделай по-своему. Пример нормально компилируется на младших версиях Дельфи, на старших не проверял.

Добавлено через 3 минуты
Проверил на Дельфи 2009 - работает.
1
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
13.05.2013, 01:24  [ТС] 7
Цитата Сообщение от angstrom Посмотреть сообщение
Ну так и пиши, разберись с кодом и сделай по-своему. Пример нормально компилируется на младших версиях Дельфи, на старших не проверял.

Добавлено через 3 минуты
Проверил на Дельфи 2009 - работает.
ні на 7, ні на хе3 не вышло, еслі не сложно, то сбросьте, пожалуйста, проект)
с рукамі відно у меня не лады =)
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
13.05.2013, 01:29 8
Держи.
1
Вложения
Тип файла: rar rubic.rar (18.2 Кб, 70 просмотров)
opitanet
12 / 12 / 0
Регистрация: 06.06.2009
Сообщений: 34
13.05.2013, 13:50 9
Кубик-Рубика на OpenGL http://opita.net/node/896
Написан на C как раз разберетесь, когда будете переводить на Pascal
1
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
13.05.2013, 13:56 10
Вышеуказанный архив с использованием OpenGL и уже на Дельфи. Зачем ещё переводить с другого языка?
0
opitanet
12 / 12 / 0
Регистрация: 06.06.2009
Сообщений: 34
13.05.2013, 13:58 11
Для повышения самообразования. Вообще если человек, по исходному коду не может собрать проект, но при этом сдает курсовую работу ни строчки не понимая, что там написано, то такая помощь только во вред.
1
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
13.05.2013, 14:14  [ТС] 12
поэтому я и прошу ткнуть меня носом в нужный источник информации =) чтоб сам разобрался, я опенгл 0, как в принципе и в программирование, даже в готовых кодах не разобраться)
хотя бы как организовать движение объектов независимо друг от друга =)
да, кстати, angstrom, рассматривая Ваш код я сразу столкнулся с проблемой, если не ошибаюсь, то там есть вставки из асемблера)
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
13.05.2013, 14:22 13
Есть 2, очень маленькие.
1
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
16.05.2013, 16:18  [ТС] 14
продолжим тему)

вот нарисовал я кубик, уже начал обрабатывать вращения
нынешняя проблема в том, что когда я вращаю сторону, то всё нормально, но если затем пытаюсь вращать другую сторону, то кубик возвращается в первоначальную конфигурацию, после если снова начну вращать 1, то она продолжает вращаться, но 2 вращение, опять же, "теряется"

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, Vcl.ExtCtrls, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  array_color= record
    red,green,blue:single;
  end;
  information= record
    x,y,z:single;
    color_cube:array [1..6] of array_color;
  end;
 
procedure paint_cub(i:byte);
procedure rotation_edges;
 
var
  Form1: TForm1;
  HRC : HGLRC ;
  angle:array [1..18] of single=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  limit_angle:array [1..18] of integer=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  confines_array:array [1..9,1..6] of integer=((1,9,10,18,19,27),
                                                (1,9,19,27,10,18),
                                                (10,18,19,27,1,9),
                                                (0,0,0,0,0,0),
                                                (0,0,0,0,0,0),
                                                (0,0,0,0,0,0),
                                                (0,0,0,0,0,0),
                                                (0,0,0,0,0,0),
                                                (0,0,0,0,0,0));
  index:single=0.1;
  coordinates_cubes:array [1..27] of information=(
                                                  //центральная поверхность
                                    {1}             (x:0;  y:0;  z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {2}             (x:1;  y:0;  z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {центральный красный}              (red:0.98;  green:0;     blue:0;));),
                                    {3}             (x:-1; y:0;  z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {центральный жёлтый}               (red:1;     green:0.67;  blue:0.1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {4}             (x:0;  y:0;  z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {центральный зеленый}              (red:0; green:0.7; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {5}             (x:1;  y:0;  z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {боковой зеленый}                  (red:0; green:0.7; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой красный}                  (red:0.98;     green:0;     blue:0;));),
                                    {6}             (x:-1; y:0;  z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {боковой зеленый}                  (red:0; green:0.7; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой оранжевый}                (red:1; green:0.67; blue:0.1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {7}             (x:0;  y:0;  z:-1; color_cube:
                 {центральный синий}               ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {8}             (x:1;  y:0;  z:-1; color_cube:
                 {боковой синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой красный}                  (red:0.98;     green:0;     blue:0;));),
                                    {9}             (x:-1; y:0;  z:-1; color_cube:
                 {боковой синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой оранжевый}                (red:1; green:0.67; blue:0.1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                                  //передняя поверхность
                                    {10}            (x:0;  y:1;  z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {центральный жёлтый}               (red:0.95;  green:0.95;  blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {11}            (x:1;  y:1;  z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой  желтый}                  (red:0.95;  green:0.95;  blue:0;),
                 {боковой  красный}                 (red:0.98;  green:0;     blue:0;));),
                                    {12}            (x:-1; y:1;  z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой  оранжевый}               (red:1; green:0.67; blue:0.1;),
                 {боковой  желтый}                  (red:0.95; green:0.95; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {13}            (x:0;  y:1;  z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {боковой  зеленый}                 (red:0; green:0.7; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой  желтый}                  (red:0.95; green:0.95; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {14}            (x:1;  y:1;  z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {уголок  зеленый}                  (red:0; green:0.7; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  жёлтый}                   (red:0.95; green:0.95; blue:0;),
                 {уголок  красный}                  (red:0.98; green:0; blue:0;));),
                                    {15}            (x:-1; y:1;  z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {уголок  зеленый}                  (red:0; green:0.7; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  оранжевый}                (red:1; green:0.67; blue:0.1;),
                 {уголок  жёлтый}                   (red:0.95; green:0.95; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {16}            (x:0;  y:1;  z:-1; color_cube:
                 {боковой синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой жёлтый}                   (red:0.95; green:0.95; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {17}            (x:1;  y:1;  z:-1; color_cube:
                 {уголок  синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  жёлтый}                   (red:0.95; green:0.95; blue:0;),
                 {уголок  красный}                  (red:0.98; green:0; blue:0;));),
                                    {18}            (x:-1; y:1;  z:-1; color_cube:
                 {уголок  синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  оранжевый}                (red:1; green:0.67; blue:0.1;),
                 {уголок  жёлтый}                   (red:0.96; green:0.96; blue:0;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                                  //задняя поверхность
                                    {19}            (x:0;  y:-1; z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {центральный  белый}               (red:1; green:1; blue:1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {20}            (x:1;  y:-1; z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой белый}                    (red:1; green:1; blue:1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой красный}                  (red:0.98; green:0; blue:0;));),
                                    {21}            (x:-1; y:-1; z:0;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой белый}                    (red:1; green:1; blue:1;),
                 {боковой оранжевый}                (red:1; green:0.67; blue:0.1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {22}            (x:0;  y:-1; z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {боковой синий}                    (red:0; green:0.7; blue:0;),
                 {боковой белый}                    (red:1; green:1; blue:1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {23}            (x:1;  y:-1; z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {уголок  зеленый}                  (red:0; green:0.7; blue:0;),
                 {уголок  белый}                    (red:1; green:1; blue:1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  красный}                  (red:0.98; green:0; blue:0;));),
                                    {24}            (x:-1; y:-1; z:1;  color_cube:
                                                   ((red:0.745; green:0.745; blue:0.745;),
                 {уголок  зеленый}                  (red:0; green:0.7; blue:0;),
                 {уголок  белый}                    (red:1; green:1; blue:1;),
                 {уголок  оранжевый}                (red:1; green:0.67; blue:0.1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {25}            (x:0;  y:-1; z:-1; color_cube:
                 {боковой синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {боковой белый}                    (red:1; green:1; blue:1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));),
                                    {26}            (x:1;  y:-1; z:-1; color_cube:
                 {уголок  синий}                   ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  белый}                    (red:1; green:1; blue:1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  красный}                  (red:0.98; green:0; blue:0;));),
                                    {27}            (x:-1; y:-1; z:-1; color_cube:
                 {уголок  синий}                 ((red:0; green:0; blue:0.85;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                 {уголок  белый}                    (red:1; green:1; blue:1;),
                 {уголок  оранжевый}                (red:1; green:0.67; blue:0.1;),
                                                    (red:0.745; green:0.745; blue:0.745;),
                                                    (red:0.745; green:0.745; blue:0.745;));));
  flag:integer=0;
  fl:boolean=false;
  fl_10_18:boolean=false;
implementation
 
{$R *.dfm}
 
procedure SetDCPixelFormat ( hdc : HDC );
 var
  pfd : TPixelFormatDescriptor;
  nPixelFormat : Integer;
 begin
  FillChar (pfd, SizeOf (pfd), 0);
  pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  nPixelFormat := ChoosePixelFormat (hdc, @pfd);
  SetPixelFormat (hdc, nPixelFormat, @pfd);
 end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetDCPixelFormat(Canvas.Handle);
  hrc := wglCreateContext(Canvas.Handle);
  wglMakeCurrent(Canvas.Handle, hrc);
  glEnable(GL_DEPTH_TEST); // включаем проверку разрешения фигур (впереди стоящая закрывает фигуру за ней)
  glDepthFunc(GL_LEQUAL);  //тип проверки
  fl:=true;
end;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if ((key>=#49)and(key<=#57)) then
    begin
     inc(limit_angle[ord(key)-48],90);
     flag:=Ord(key)-48;
    end;
 
  if key=#113 then
    flag:=10;
  if key=#119 then
    flag:=11;
  fl:=true;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
var
  i,q,w,e,g: Integer;
begin
 
 
  if flag>9 then
    begin
      dec(flag,9);
      fl_10_18:=true;
    end;
 FormResize(Sender); //процедура обновления
 
 glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
 glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
 
 
  rotation_edges;
  if angle[flag]<limit_angle[flag] then
    angle[flag]:=angle[flag]+index;
  if angle[flag]>limit_angle[flag] then
    angle[flag]:=angle[flag]-index;
 
for i := confines_array[flag,1] to confines_array[flag,2] do
  paint_cub(i);
for i := confines_array[flag,3] to confines_array[flag,4] do
  paint_cub(i);
glTranslatef(0.475,0,0.475); //Сместили
glRotatef(angle[flag],0,1,0);
glTranslatef(-0.475,0,-0.475);
for i := confines_array[flag,5] to confines_array[flag,6] do
  paint_cub(i);
 
 
SwapBuffers(Canvas.Handle);
end;
 
procedure TForm1.FormResize(Sender: TObject);
begin
  glViewport(0, 0, ClientWidth, ClientHeight); //выделяем область куда будет выводиться наш буфер
  glMatrixMode ( GL_PROJECTION ); //переходим в матрицу проекции
  glLoadIdentity;  //Сбрасываем текущую матрицу
  glFrustum ( -1 , 1 , -1 , 1 , 1.25 , 100.0 ); //Область видимости
  glMatrixMode ( GL_MODELVIEW ); //переходим в модельную матрицу
  glLoadIdentity;//Сбрасываем текущую матрицу
  gluLookAt(-4,-4,4,0,0,0,0,0,1);  //позиция наблюдателя
  InvalidateRect ( Handle,nil,False );  //перерисовка формы
end;
 
 
procedure paint_cub(i:byte);
begin
 
  glBegin(GL_QUADS);
 
    //низ куба
    glColor3f(coordinates_cubes[i].color_cube[1].red,coordinates_cubes[i].color_cube[1].green,coordinates_cubes[i].color_cube[1].blue);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z);
 
    //верх куба
    glColor3f(coordinates_cubes[i].color_cube[2].red,coordinates_cubes[i].color_cube[2].green,coordinates_cubes[i].color_cube[2].blue);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z+0.95);
 
    //1 сторона куба
    glcolor3f(coordinates_cubes[i].color_cube[3].red,coordinates_cubes[i].color_cube[3].green,coordinates_cubes[i].color_cube[3].blue);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y,coordinates_cubes[i].z);
 
    //2 сторона куба
    glcolor3f(coordinates_cubes[i].color_cube[4].red,coordinates_cubes[i].color_cube[4].green,coordinates_cubes[i].color_cube[4].blue);;
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z);
 
    //3 сторона куба
    glcolor3f(coordinates_cubes[i].color_cube[5].red,coordinates_cubes[i].color_cube[5].green,coordinates_cubes[i].color_cube[5].blue);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z);
 
    //4 сторона куба
    glcolor3f(coordinates_cubes[i].color_cube[6].red,coordinates_cubes[i].color_cube[6].green,coordinates_cubes[i].color_cube[6].blue);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y+0.95,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y,coordinates_cubes[i].z+0.95);
    glVertex3f(coordinates_cubes[i].x+0.95,coordinates_cubes[i].y,coordinates_cubes[i].z);
 
  glend;
 
end;
 
procedure rotation_edges;
var
  i,j:integer;
begin
 
    if (fl_10_18=false)and(fl) then
      begin
        fl:=false;
        if angle[flag]>=350 then
          begin
            angle[flag]:=0;
            limit_angle[flag]:=90;
          end;
      end;
 
    if (fl_10_18)and(fl) then
      begin
        inc(limit_angle[flag],-90);
        fl_10_18:=false;
        fl:=false;
          if ((angle[flag]>340)and(angle[flag]<370))or(limit_angle[flag]<0) then
          begin
            angle[flag]:=360;
            limit_angle[flag]:=270;
          end;
      end;
 
end;
 
end.
просьба не указывать на уже выложенные вами программы, си мне рано, а в чужом коде не разобраться
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
19.05.2013, 17:56 15
Цитата Сообщение от luciys Посмотреть сообщение
просьба не указывать на уже выложенные вами программы, си мне рано, а в чужом коде не разобраться
Взаимно, нет желания разбираться а чужом коде.
0
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 00:02  [ТС] 16
Цитата Сообщение от angstrom Посмотреть сообщение
Взаимно, нет желания разбираться а чужом коде.
нет желания - зачем отвечать?) я хочу разобраться с Вашим алгоритмом, но моих способностей хватает пока что на какие-нибудь простенькие алгоритмы, а не на полноценные программы)
я всего-лишь прошу подсказать, что делать, чтоб сохранялась конфигурация кубика

хотя бы пример, где 2 и более объектов двигаются, так сказать, в разное время и сохраняют своё положение
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
20.05.2013, 01:01 17
Цитата Сообщение от luciys Посмотреть сообщение
зачем отвечать?) я хочу разобраться с Вашим алгоритмом
Так не отвечать или хочешь разобраться? Если разобраться, то что конкретно непонятно?
1
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 01:22  [ТС] 18
Цитата Сообщение от angstrom Посмотреть сообщение
Так не отвечать или хочешь разобраться? Если разобраться, то что конкретно непонятно?
отвечать отвечать =)
нуууу, хотя бы, что каждая процедура делает? за что отвечают основные переменные?)
не каждая, но хотя бы самые главные процедуры что делают
0
angstrom
2472 / 1848 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
20.05.2013, 02:20 19
Так мне придётся весь код снабдить комментариями и снова выложить.

Добавлено через 6 минут
Описание процедур
// рисуем грань
procedure RenderVerge(Verge : Pointer);
// рисуем грани
procedure RenderVerges;
// сдвигаем грани
procedure ShiftVerge;
// рисуем всю сцену
procedure RenderScene;
// заливка этикеток (наклейки на кубиках)
procedure FillSticker(Color : TColorRef; CornerA, CornerB : Integer);
// создание текстуры
procedure CreateTexture;
// обработка движения мышки
procedure MouseMove(Wnd : HWND; lParam : Longint);
// таймер
procedure TimerProc(Wnd : HWND; Msg, TimerID : Longint; SysTime : DWORD); stdcall;
1
luciys
5 / 5 / 1
Регистрация: 27.11.2012
Сообщений: 160
20.05.2013, 02:20  [ТС] 20
angstrom, я не прошу весь) где вращение сторон хоть бы) буду благодарен)
во, премного благодарен =)
0
20.05.2013, 02:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2013, 02:20

Кубик Рубика
Здравствуйте)помогите пожалуйста если не трудно)) Изобразить на экране ЭВМ следующий рисунок

Кубик Рубика на С++ и OpenGL
Здравствуйте, я начал изучать С++ и мне дали задание сделать кубик рубика на С++ и OpenGL, до этого...

Кубик рубика в Паскале
Изобразить в графическом модуле паскаля Кубик рубика, с разноцветными квадратиками


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru