Ja już wymiękam nie wiem co jest nie tak. Jak zwykle zacznę od kodu.
Mam taką klasę:
type
TGameObject2D = class
private
fAngle, // Kąt obrotu
fx1, // Współrzędna x lewego górnego rogu
fy1, // Współrzędna y lewego górnego rogu
fx2, // Współrzędna x prawego dolnego rogu
fy2, // Współrzędna y prawego dolnego rogu
fWidth, // Długość
fHeight, // Szerokość
fCenterX, // Współrzędna x środka
fCenterY : Real; // Współrzędna y środka
Texture : gluInt; // Tekstura
procedure SetCenterX(CenterX : Real);
procedure SetCenterY(CenterY : Real);
public
constructor Create(x, y : Real; PathToTexture : String);
destructor Destroy; override;
property X : Real read fCenterX write SetCenterX;
property Y : Real read fCenterY write SetCenterY;
property Angle : Real read fAngle write fAngle;
procedure Draw;
end;
{==============================================================================}
implementation
{==============================================================================}
// Konstruktor klasy. Ustawia x, y, szerokość, wysokość, oraz x i y środka.
//-------------------------------------------------------------------------
constructor TGameObject2D.Create(x, y : Real; PathToTexture : String);
begin
inherited Create;
fAngle := 0;
fCenterX := x;
fCenterY := y;
fWidth := 0.1;
fHeight := 0.1;
fx1 := fCenterX - (fWidth / 2);
fx2 := fx1 + fWidth;
fy1 := fCenterY - (fHeight / 2);
fy2 := fy1 + fHeight;
Texture := LoadTexture(PathToTexture);
end;
{------------------------------------------------------------------------------}
// Destruktor klasy. Czyści pamięć pól klasy.
//-------------------------------------------
destructor TGameObject2D.Destroy;
begin
inherited Destroy;
end;
{------------------------------------------------------------------------------}
// Ustawia x środka i na podstawie tego wylicza fx1 i fx2.
//--------------------------------------------------------
procedure TGameObject2D.SetCenterX(CenterX : Real);
begin
fCenterX := CenterX;
fx1 := fCenterX - (fWidth / 2);
fx2 := fx1 + fWidth;
end;
{------------------------------------------------------------------------------}
// Ustawia y środka i na podstawie tego wylicza fy1 i fy2.
//--------------------------------------------------------
procedure TGameObject2D.SetCenterY(CenterY : Real);
begin
fCenterY := CenterY;
fy1 := fCenterY - (fHeight / 2);
fy2 := fy1 + fHeight;
end;
{------------------------------------------------------------------------------}
// Rysuje obiekt na ekranie.
//--------------------------
procedure TGameObject2D.Draw;
begin
glPushMatrix();
glTranslatef(fCenterX, fCenterY, 0);
glRotatef(fAngle, 0, 0, 1);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_POLYGON);
glTexCoord2f(0, 0); glVertex3f(fx1, fy1, 0);
glTexCoord2f(1, 0); glVertex3f(fx2, fy1, 0);
glTexCoord2f(1, 1); glVertex3f(fx2, fy2, 0);
glTexCoord2f(0, 1); glVertex3f(fx1, fy2, 0);
glEnd();
glPopMatrix;
end;
Obiekt tej klasy tworzę w ten sposób:
GameObject := TGameObject2D.Create(0, 0, 'texture1.bmp');
Więc znajduje się on na środku ekranu.
I jak chce go obrócić o dany kąt fAngle wokół własnej osi to dopóki obiekt ten znajduje się na środku ekranu to obraca się wokół własnej osi. Jednak gdy przesunę obiekt w inne miejsce ekranu to obiekt obraza się wokół środka ekranu...
Przeczytałem na googlach i w książce, że najpierw trzeba ustawić środek układu współrzędnych na środku obiektu i dopiero potem go obracać i właśnie to robię:
glPushMatrix();
glTranslatef(fCenterX, fCenterY, 0);
glRotatef(fAngle, 0, 0, 1);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_POLYGON);
glTexCoord2f(0, 0); glVertex3f(fx1, fy1, 0);
glTexCoord2f(1, 0); glVertex3f(fx2, fy1, 0);
glTexCoord2f(1, 1); glVertex3f(fx2, fy2, 0);
glTexCoord2f(0, 1); glVertex3f(fx1, fy2, 0);
glEnd();
glPopMatrix;
A i tak nie działa. Gdzie leży błąd?