Обратите внимание, что рисование с помощью glBegin
/ glEnd
последовательностей и набора матриц фиксированных функций устарело с десятилетий.
Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер , чтобы узнать о современном способе рендеринга.
Я хочу вращать кончик космического корабля, не двигая весь космический корабль [...]
Сначала вы должны определить точку поворота, которая является «вершиной» космического корабля:
float pivot_x = sp.x;
float pivot_y = sp.y + 80.0f;
Чтобы вращаться вокруг оси, вы должны определить матрицу модели, которая смещается на инвертированную точку, затем поворачивается (glRotatef
) и окончательно преобразуется обратно в точку (* 1025). *):
glTranslatef(pivot_x, pivot_y, 0);
glRotatef(angle, 0, 0, 1);
glTranslatef(-pivot_x, -pivot_y, 0);
Окончательный код может выглядеть так:
float pivot_x = x;
float pivot_y = y + 80.0f;
glPushMatrix();
glTranslatef(pivot_x, pivot_y, 0 ); // 3. Translate to the object's position.
glRotatef(sp.getAngle(), 0.0, 0.0, 1.0); // 2. Rotate the object.
glTranslatef(-pivot_x, -pivot_y, 0.0); // 1. Translate to the origin.
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, spaceShipRightLine);
glDrawArrays(GL_LINES, 0, 2);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, spaceShipLeftLine);
glDrawArrays(GL_LINES, 0, 2);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, spaceShipMiddleLine);
glDrawArrays(GL_LINES, 0, 2);
glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();