Конференция "Media" » Изменение цвета граней при вращении куба [D7]
 
  • Jacka (08.08.16 12:41) [0]
    Здравствуйте!
    У меня такое дело. Есть куб, его можно вращать вокруг оси, перемещать взад-вперёд. При вращении происходит изменение цвета согласно освещению.
    Но при этом не получается очистить буфер цвета.
    Подскажите, пожалуйста, в  нём ли дело? Или в изменение цвета надо добавить переменную, отвечающую за вращение? Или что-то ещё не так?
    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL;

    type
     TfrmGL = class(TForm)
       procedure FormCreate(Sender: TObject);
       procedure FormPaint(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
       procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
       procedure FormMouseClick(Sender: TObject);
       procedure FormResize(Sender: TObject);

     private
       hrc: HGLRC;
       h, mx, my : GLfloat;
       procedure Model;
       procedure Axes;
     end;

    var
     frmGL: TfrmGL;
     //mode : (POINT, LINE, FILL) = FILL;

    implementation

    {$R *.dfm}
    {=========================    модель======================================}
    procedure TfrmGL.Model;
    begin
    glColor3f (1.0, 0.0, 0.5);         // текущий цвет примитивов

    glBegin(GL_QUADS);          //1
      glNormal3f(0, 0, 1);
      glVertex3f(1.0, 1.0, 1.0);
      glVertex3f(-1.0, 1.0, 1.0);
      glVertex3f(-1.0, -1.0, 1.0);
      glVertex3f(1.0, -1.0, 1.0);
    glEnd;

    glBegin(GL_QUADS);              //2
      glVertex3f(1.0, 1.0, -1.0);
      glVertex3f(1.0, -1.0, -1.0);
      glVertex3f(-1.0, -1.0, -1.0);
      glVertex3f(-1.0, 1.0, -1.0);
    glEnd;

    glBegin(GL_QUADS);              //3
      glNormal3f(-1, 0, 0);
      glVertex3f(-1.0, 1.0, 1.0);
      glVertex3f(-1.0, 1.0, -1.0);
      glVertex3f(-1.0, -1.0, -1.0);
      glVertex3f(-1.0, -1.0, 1.0);
    glEnd;

    glBegin(GL_QUADS);              //4
      //glNormal3f(1, 0, 0);
      glVertex3f(1.0, 1.0, 1.0);
      glVertex3f(1.0, -1.0, 1.0);
      glVertex3f(1.0, -1.0, -1.0);
      glVertex3f(1.0, 1.0, -1.0);
    glEnd;

    glBegin(GL_QUADS);           //5
      glNormal3f(0, 1, 0);
      glVertex3f(-1.0, 1.0, -1.0);
      glVertex3f(-1.0, 1.0, 1.0);
      glVertex3f(1.0, 1.0, 1.0);
      glVertex3f(1.0, 1.0, -1.0);
    glEnd;

    glBegin(GL_QUADS);              //6
      glVertex3f(-1.0, -1.0, -1.0);
      glVertex3f(1.0, -1.0, -1.0);
      glVertex3f(1.0, -1.0, 1.0);
      glVertex3f(-1.0, -1.0, 1.0);
    glEnd;
    end;

    { оси координат }
    procedure TfrmGL.Axes;
    var
     Color : Array [1..4] of GLFloat;
    begin
     glGetFloatv (GL_CURRENT_COLOR, @Color);

     glScalef (0.8, 0.8, 0.8);

     glColor3f (0, 1, 0);

     glBegin (GL_LINES);
       glVertex3f (0, 0, 0);
       glVertex3f (-3, 0, 0);
       glVertex3f (0, 0, 0);
       glVertex3f (0, 3, 0);
       glVertex3f (0, 0, 0);
       glVertex3f (0, 0, 3);
     glEnd;

     // буква X
     {glBegin (GL_LINES);
       glVertex3f (-3.1, -0.2, 0.3);
       glVertex3f (-3.1, 0.2, -0.3);
       glVertex3f (-3.1, -0.2, 0.1);
       glVertex3f (-3.1, 0.2, 0.5);
     glEnd;}

     glBegin (GL_LINES);
       glVertex3f (-3.1, -0.2, 0.5);
       glVertex3f (-3.1, 0.2, 0.1);
       glVertex3f (-3.1, -0.2, 0.1);
       glVertex3f (-3.1, 0.2, 0.5);
     glEnd;

     // буква Y
     glBegin (GL_LINES);
       glVertex3f (0.0, 3.1, 0.0);
       glVertex3f (0.0, 3.5, 0.0);
       glVertex3f (0.0, 3.9, -0.3);
       glVertex3f (0.0, 3.5, 0.0);
       glVertex3f (0.0, 3.9, 0.3);
       glVertex3f (0.0, 3.5, 0.0);
     glEnd;

     // буква Z
     glBegin (GL_LINES);
       glVertex3f (0.3, -0.3, 3.1);
       glVertex3f (-0.3, -0.3, 3.1);
       glVertex3f (0.3, 0.3, 3.1);
       glVertex3f (-0.3, 0.3, 3.1);
       glVertex3f (-0.3, -0.3, 3.1);
       glVertex3f (0.3, 0.3, 3.1);
     glEnd;

     glColor3f (Color [1], Color [2], Color [3]); // восстанавливаем значение текущего цвета
    end;

    { перерисовка окна }
    procedure TfrmGL.FormPaint(Sender: TObject);
    begin
    glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);    // очистка буфера цвета

    glPushMatrix;
    glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glScalef (0.3, 0.3, 0.3);      // масштабирование

    glRotatef (my, 0.0, 1.0, 0.0);
    glTranslatef (mx, 0.0, 0.0);

    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

    Model;
    Axes;
    glPopMatrix;
    //wglMakeCurrent(0, 0);
    //SwapBuffers(Canvas.Handle);
    glFlush;
    glFinish;
    SwapBuffers(GetDC(Handle));
    glClear (GL_COLOR_BUFFER_BIT);
    end;

    {формат пикселя}
    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 TfrmGL.FormCreate(Sender: TObject);
    begin
     //DC := GetDC (Handle);
     //SetDCPixelFormat(Canvas.Handle);
     //SetDCPixelFormat(DC);

     SetDCPixelFormat(GetDC(Handle));
     hrc := wglCreateContext(GetDC(Handle));
     wglMakeCurrent(GetDC(Handle), hrc);
     glEnable (GL_COLOR_MATERIAL);
     glEnable (GL_DEPTH_TEST);

     glClearColor (0.5, 0.5, 0.75, 1.0);         //  цвет фона
     glLineWidth (1.5);
     glEnable (GL_LIGHTING);
     glEnable (GL_LIGHT0);
     glColor3f (1.0, 0.0, 0.0);

     //h := 0.0;
     my := 0.0;
     mx := 0.0;
    end;

    { завершение работы }
    procedure TfrmGL.FormDestroy(Sender: TObject);
    begin
    wglMakeCurrent(0, 0);
    wglDeleteContext(hrc);
    ReleaseDC (Handle, GetDC(Handle));
    DeleteDC (GetDC(Handle));
    end;

    {какие-то действия }
    procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
    If Key = VK_LEFT then begin
       my := my + 2.0;
       InvalidateRect(Handle, nil, False);
    end;
    If Key = VK_RIGHT then begin
       my := my - 2.0;
       InvalidateRect(Handle, nil, False);
    end;
    If Key = VK_UP then begin
       mx := mx - 0.1;
       InvalidateRect(Handle, nil, False);
    end;
    If Key = VK_DOWN then begin
       mx := mx + 0.1;
       InvalidateRect(Handle, nil, False);
    end;
    FormResize(nil);
    end;

    procedure TfrmGL.FormMouseWheel(Sender: TObject;Shift: TShiftState;
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    begin
    If ssCtrl in Shift then begin      // колёсико с контром
     If WheelDelta > 0 then
      h := h + 1
     else
      h := h - 1;
      Caption := Floattostr (h);   //  индикатор масштаба
      Refresh                      // очистка
     end;
    end;

    procedure TfrmGL.FormMouseClick(Sender: TObject);
    begin
    Application.Terminate();
    end;

    {операции с перспективой }
    procedure TfrmGL.FormResize(Sender: TObject);
    begin
     glViewPort(0, 0, ClientWidth, ClientHeight);
     glMatrixMode (GL_PROJECTION);
     glLoadIdentity;
     glFrustum (-1, 1, -1, 1, 3, 10);       // задание перспективы
     //glOrtho(-1, 1, -1, 1, -1, 1);
     glMatrixMode (GL_MODELVIEW);
     glLoadIdentity;

     glTranslatef(0.0, 0.0, -4.0);        
     glRotatef(30.0, 1.0, 0.0, 0.0);      
     glRotatef(70.0, 0.0, 1.0, 0.0);      

     InvalidateRect(Handle, nil, False);
    end;

    end.



    Если нужен exe-шник, пишите, вышлю.
  • Pavia © (08.08.16 15:36) [1]

    > При вращении происходит изменение цвета согласно освещению.
    >  
    > Но при этом не получается очистить буфер цвета.
    > Подскажите, пожалуйста, в  нём ли дело? Или в изменение
    > цвета надо добавить переменную, отвечающую за вращение?
    > Или что-то ещё не так?

    А от мастеров Вы чего хотите? Вернее так, что не делает ваша программа, а что должна?

    Раз вопросы про цвет. Даю наводящие вопросы. Какая модель освещения? Источник света у вас расположен где? Какой тип источника?
 
Конференция "Media" » Изменение цвета граней при вращении куба [D7]
Есть новые Нет новых   [134427   +37][b:0][p:0.006]