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
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.