使用OpenGL无法正确旋转2D对象

时间:2019-01-03 17:05:15

标签: c++ opengl glfw

我正在使用opengl,glfw和glew。我想在用户分别按下向左和向右箭头时旋转飞船的尖端而不移动整个飞船。我试过使用gltransform glrotate,它可以旋转,但也可以移动我的飞船。空间运动的输出

abc {

1 个答案:

答案 0 :(得分:0)

请注意,数十年来不赞成使用glBegin/glEnd序列和固定函数矩阵堆栈进行绘制。 阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式。


  

我想旋转飞船的尖端而不移动整个飞船[...]

首先,您必须定义枢轴,这是飞船的“尖端”:

float pivot_x = sp.x;
float pivot_y = sp.y + 80.0f;

要绕枢轴旋转,您必须定义一个模型矩阵,该模型矩阵由倒置的枢轴替换,然后旋转(glRotatef)并最终转换回枢轴(glTranslate):

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();