Кубик Рубик OpenGl C++
Недавно начал осваивать OpenGL, попытался сделать кубик рубика, но столкнулся с проблемой вращения его, до этого делал вращение только одного, а сейчас даже не знаю как сделать так чтобы вращались сразу 4. Если кто может, подскажите как сделать поворот например верхней и боковой стороны.
Мой код :
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
#pragma hdrstop
int alpha=0, beta=0, gamma=0;
int x,y,z;
float diffuse[]={0.5, 0.5, 0.5, 1.0};
float lpos[]={-4.0, 4.0, -4.0, 1.0};
float black[]={0.0, 0.0, 0.0, 0.5};
#include "MainForms.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
HDC dc = Canvas->Handle;
PIXELFORMATDESCRIPTOR pfd;
memset( &pfd, 0, sizeof pfd );
pfd.nSize = sizeof pfd;
pfd.cColorBits = 8;
pfd.cDepthBits = 8;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED;
int index = ChoosePixelFormat( dc, &pfd );
SetPixelFormat( dc, index, NULL );
HGLRC context = wglCreateContext( dc );
wglMakeCurrent( dc, context );
glClearColor( 0, 0.2, 0.4, 1.0 );
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glDepthFunc(GL_LEQUAL);
glShadeModel(GL_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
ClientWidth = 500;
ClientHeight = 500;
}
//---------------------------------------------------------------------------
TForm1::~TForm1()
{
HGLRC context = wglGetCurrentContext();
wglMakeCurrent( NULL, NULL );
wglDeleteContext( context );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DisplayTimerTimer(TObject *Sender)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
glTranslatef(x, y, z);
glRotatef(alpha, 1, 0, 0);
glRotatef(beta, 0, 1, 0);
glRotatef(gamma, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glBegin(GL_QUADS);
// Координаты куба
glEnd();
// + 7 кубов
glFinish();
glPopMatrix();
SwapBuffers( Canvas->Handle );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
glViewport( 0, 0, ClientWidth, ClientHeight );
}
//---------------------------------------------------------------------------