Opengl obrót sześcianem

0

Cześć mam pewien problem otóż rysuje sobie dwa sześciany i teraz chciałby jednym z nich móc obracać w około własnej osi .Ma ktoś jakiś pomysł jak to zrobić?

0

Kod dla C++/GLUT ale może zobrazuje trochę:

//przesuwamy sie w lewo
glTranslatef(-1, 0, 0);

//rysujemy 1-szy szescian

// przesuwamy sie w prawo
glTranslatef(2, 0, 0);

//zapamietujemy macierz wyswietlania
glPushMatrix();

//obracamy scene o 30 stopni
glRotatef(30, 0, 1, 0);

//rysujemy 2-gi szescian

//przywracamy macierz wyswietlania
glPopMatrix()
0
UNIT UNIT1;

INTERFACE

USES
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  OpenGl, Texture, ExtCtrls, StdCtrls;

TYPE
  TForm1 = CLASS(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    PROCEDURE FormCreate(Sender: TObject);
    PROCEDURE FormDestroy(Sender: TObject);
    PROCEDURE FormResize(Sender: TObject);
    PROCEDURE Timer1Timer(Sender: TObject);
  PRIVATE
    { Private declarations }
    rc : HGLRC;
    dc : HDC;
    PROCEDURE glInit;
    PROCEDURE glDraw;
  PUBLIC
    { Public declarations }
  END;

VAR
  Form1   : TForm1;
  CubeTex : gluInt;
  rot     : glFloat;

TYPE
 { wspolzedne punktu w 3D      }
 { x,y,z - wspolzedne punktu   }
 { u,v   - wspolzedne tekstury }
 TPoint = RECORD  x, y, z, u, v :glFloat;  END;

CONST
 { definicja kostki szesciennej }
 Cube  :ARRAY [0..5, 0..3] OF TPoint = (
  // przednia sciana
  ((x:-1.0; y:-1.0; z: 1.0; u: 0.0; v: 0.0),
   (x: 1.0; y:-1.0; z: 1.0; u: 1.0; v: 0.0),
   (x: 1.0; y: 1.0; z: 1.0; u: 1.0; v: 1.0),
   (x:-1.0; y: 1.0; z: 1.0; u: 0.0; v: 1.0)),
  // tylna sciana
  ((x:-1.0; y:-1.0; z:-1.0; u: 1.0; v: 0.0),
   (x:-1.0; y: 1.0; z:-1.0; u: 1.0; v: 1.0),
   (x: 1.0; y: 1.0; z:-1.0; u: 0.0; v: 1.0),
   (x: 1.0; y:-1.0; z:-1.0; u: 0.0; v: 0.0)),
  // gorna sciana
  ((x:-1.0; y: 1.0; z:-1.0; u: 0.0; v: 1.0),
   (x:-1.0; y: 1.0; z: 1.0; u: 0.0; v: 0.0),
   (x: 1.0; y: 1.0; z: 1.0; u: 1.0; v: 0.0),
   (x: 1.0; y: 1.0; z:-1.0; u: 1.0; v: 1.0)),
  // dolna sciana
  ((x:-1.0; y:-1.0; z:-1.0; u: 1.0; v: 1.0),
   (x: 1.0; y:-1.0; z:-1.0; u: 0.0; v: 1.0),
   (x: 1.0; y:-1.0; z: 1.0; u: 0.0; v: 0.0),
   (x:-1.0; y:-1.0; z: 1.0; u: 1.0; v: 0.0)),
  // prawa sciana
  ((x: 1.0; y:-1.0; z:-1.0; u: 1.0; v: 0.0),
   (x: 1.0; y: 1.0; z:-1.0; u: 1.0; v: 1.0),
   (x: 1.0; y: 1.0; z: 1.0; u: 0.0; v: 1.0),
   (x: 1.0; y:-1.0; z: 1.0; u: 0.0; v: 0.0)),
  // lewa sciana
  ((x:-1.0; y:-1.0; z:-1.0; u: 0.0; v: 0.0),
   (x:-1.0; y:-1.0; z: 1.0; u: 1.0; v: 0.0),
   (x:-1.0; y: 1.0; z: 1.0; u: 1.0; v: 1.0),
   (x:-1.0; y: 1.0; z:-1.0; u: 0.0; v: 1.0)));

IMPLEMENTATION

PROCEDURE TForm1.glInit;
var x, z :Byte;
BEGIN
  glClearColor(0.0, 0.0, 0.0, 0.0); 	   // Czarne tlo
  glShadeModel(GL_SMOOTH);                 // Gladkie cieniowanie
  glClearDepth(1.0);                       // Ustawienie bufora glebi
  glEnable(GL_DEPTH_TEST);                 // Wlacz bufor
  glDepthFunc(GL_LESS);		           // Typ glebi
  // korekcja perspektywy
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  glEnable(GL_TEXTURE_2D);                 // wlacz teksturowanie
  LoadTexture('olek.bmp', CubeTex);  // zaladuj teksture
END; { TForm1.Init }

PROCEDURE TForm1.glDraw;
VAR i, j :glByte;
BEGIN
 glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT); // czysc ekran i glebie
 glLoadIdentity();                                    // laduj scene
 glTranslatef(0.0, 0.0, -5.0);                        // przesun w glab
 glRotatef(rot, 1.0, 1.0, 1.0);                       // obrot
 glBindTexture(GL_TEXTURE_2D, CubeTex);               // domyslna tekstura
 glBegin(GL_QUADS);                                   // rysuj kwadrat
   FOR i := 0 TO 5 DO
    FOR j := 0 TO 3 DO
     WITH Cube[i, j] DO
      BEGIN
       glTexCoord2f(u, v); glVertex3f(x, y, z);
      END;
 glEnd();
 rot := rot+3;
END; { TForm1.Draw }

{$R *.DFM}

PROCEDURE TForm1.FormCreate(Sender: TObject);
VAR pfd : TPIXELFORMATDESCRIPTOR;
    pf  : Integer;
BEGIN
  // gdzie chcemy rysowac
  dc:=GetDC(Panel1.Handle);
  // PixelFormat
  pfd.nSize:=sizeof(pfd);
  pfd.nVersion:=1;
  pfd.dwFlags:=PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR 0;
  pfd.iPixelType:=PFD_TYPE_RGBA;      // PFD_TYPE_RGBA OR PFD_TYPEINDEX
  pfd.cColorBits:=16;

  pf :=ChoosePixelFormat(dc, @pfd);   // Returns format that most closely matches above pixel format
  SetPixelFormat(dc, pf, @pfd);

  rc :=wglCreateContext(dc);    // Rendering Context = window-glCreateContext
  wglMakeCurrent(dc,rc);        // Make the DC (Form1) the rendering Context

  // Initialist GL environment variables
  glInit();
END; {TForm1.FormCreate }

PROCEDURE TForm1.FormDestroy(Sender: TObject);
BEGIN
  wglMakeCurrent(Panel1.Handle,0);
  wglDeleteContext(rc);
END;

PROCEDURE TForm1.FormResize(Sender: TObject);
BEGIN
  glViewport(0, 0, Panel1.Width, Panel1.Height);    // SET the viewport FOR the OpenGL window
  glMatrixMode(GL_PROJECTION);        // Change Matrix Mode TO Projection
  glLoadIdentity();                   // Reset View
  gluPerspective(45.0, Panel1.Width/Panel1.Height, 1.0, 500.0);  // DO the perspective calculations. Last value = max clipping depth
  glMatrixMode(GL_MODELVIEW);         // Return TO the modelview matrix
END;

PROCEDURE TForm1.Timer1Timer(Sender: TObject);
BEGIN
 glDraw();
 SwapBuffers(DC);
END;

END.

1 użytkowników online, w tym zalogowanych: 0, gości: 1