在OpenGL中如何围绕一个中心点旋转四边形

3

我正在制作一款2D游戏。我希望能够在围绕中心点旋转一定角度后将纹理渲染到屏幕上。基本上这是为了让关卡围绕玩家进行旋转。玩家位置为旋转点,玩家方向为角度。以下代码无法实现:

def draw_texture(texture,offset,size,a,rounded,rotation,point):
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity() #Loads model matrix
    glColor4f(1,1,1,float(a)/255.0)
    glTranslatef(point[0],point[1],0)
    glRotatef(rotation,0,0,1)
    glBindTexture(GL_TEXTURE_2D, texture)
    if rounded == 0:
        glBegin(GL_QUADS)
        glTexCoord2f(0.0, 0.0)
        glVertex2i(*offset) #Top Left
        glTexCoord2f(0.0, 1.0)
        glVertex2i(offset[0],offset[1] + size[1]) #Bottom Left
        glTexCoord2f(1.0, 1.0)
        glVertex2i(offset[0] + size[0],offset[1] + size[1]) #Bottom, Right
        glTexCoord2f(1.0, 0.0)
        glVertex2i(offset[0] + size[0],offset[1]) #Top, Right
        glEnd()
    else:
        #Nothing important here
    glEnd()

有没有任何方法可以让它正常工作?谢谢。
2个回答

2
尝试反转。
glTranslatef(point[0],point[1],0)

并且

glRotatef(rotation,0,0,1)

你正在为玩家翻译,但是旋转的中心是原点(而不是玩家)。
来自红色书籍的插图:rotate

它似乎不允许我将纹理移动到正确的位置,就像以前一样。当我尝试移动玩家时,它会卡住。很奇怪。谢谢您的回复。我可能会使用三角学来解决这个问题。但我更喜欢一个更简单的方法。 - Matthew Mitchell
一种调试的方法是:将所有东西从原点开始,旋转为0,然后逐渐重新添加翻译和旋转,并确保它们在您预期的位置。 - cobbal

0

除非你有充分的理由这样做,否则我建议不要改变绘图代码,只需改变相机角度即可。最简单的方法可能是使用gluLookAt函数。在你的情况下,显然你将会观察到玩家的位置,并且只需要改变最后两个参数中的“向上方向”。


我该怎么做?我完全不理解那个函数。我知道有3组坐标,但我不知道它们是用来干什么的。我猜眼睛坐标应该在玩家坐标处,中心坐标也应该如此。然后,上方坐标应该是一个坐标,位于我想要的角度从玩家处。我想这需要一点三角学的知识。 - Matthew Mitchell
一个巨大的失败:gluLookAt(point [0],point [1],0,point [0],point [1],0,point [0] +数学.sin(rotation),point [1] - 数学.cos(rotation),0) - Matthew Mitchell
gluLookAt可能不是您想要的,因为您正在定位一个模型而不是相机。虽然这是可能的,但这没有太多意义。 - cobbal
至少根据记忆,这三组坐标是相机位置、它所看的“中心点”的位置和应该是“上方”的方向。如果您不想使用它,您也可以使用glMatrixMode(GL_PROJECTION),并像通常操作模型矩阵一样操作投影矩阵。 - Jerry Coffin
好的,我决定试着写一个自己的旋转函数。我已经成功地创建了一个坐标旋转函数,现在只需要正确地使用它来按照自己的意愿旋转四边形。复杂的是,y轴与图表通常绘制的方向相反,所以我需要记住这一点。我打算看看明天能做成什么。感谢大家的帮助。 - Matthew Mitchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接