Поворот четырехугольника вокруг центральной точки в OpenGL

Я делаю 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()

Любой способ заставить его работать? Спасибо.


person Matthew Mitchell    schedule 18.01.2010    source источник


Ответы (2)


попробуй реверс

glTranslatef(point[0],point[1],0)

и

glRotatef(rotation,0,0,1)

вы переводите на игрока, но затем вращаете вокруг источника (а не игрока)

Иллюстрация из красной книги: rotate

person cobbal    schedule 18.01.2010
comment
Кажется, это не позволяет мне переместить текстуру в правильное положение, как это было. Когда я пытаюсь переместить плеер, он зависает. Странный. Спасибо за ответ. Я мог бы использовать тригонометрию, чтобы сделать это. Я бы просто предпочел более простой метод. - person Matthew Mitchell; 19.01.2010
comment
один из способов отладки: начать все в исходной точке с 0 поворотами, затем постепенно повторно добавлять переводы и повороты и следить за тем, чтобы они были там, где вы ожидаете. - person cobbal; 19.01.2010

Если у вас нет веских причин поступать иначе, я бы оставил код рисования в покое и просто изменил угол камеры. Вероятно, самый простой способ сделать это — использовать gluLookAt. В вашем случае вы, очевидно, будете смотреть на позицию игрока и просто измените «направление вверх», которое задается в последних двух параметрах.

person Jerry Coffin    schedule 18.01.2010
comment
Как бы я это сделал? Я вообще не понимаю эту функцию. Я понимаю, что есть 3 набора координат, но я не знаю, для чего. Я рискну и думаю, что координаты глаз должны быть в координатах игроков, а также центральные. Координаты вверх должны быть координатой, которая находится под углом, который я хочу от игрока. Я думаю, что немного тригонометрии будет делать для этого. - person Matthew Mitchell; 19.01.2010
comment
Большой провал: gluLookAt(point[0],point[1],0,point[0],point[1],0,point[0] + maths.sin(rotation),point[1] - maths.cos (вращение),0) - person Matthew Mitchell; 19.01.2010
comment
gluLookAt, вероятно, не то, что вам нужно, так как вы позиционируете модель, а не камеру. Хотя это было бы возможно, в этом не было бы особого смысла. - person cobbal; 19.01.2010
comment
По крайней мере, если мне не изменяет память, три набора координат относятся к положению камеры, положению центральной точки, на которую она смотрит, а третий — к тому, в каком направлении должно быть вверх. Если вы не хотите использовать это, вы также можете glMatrixMode(GL_PROJECTION) и манипулировать матрицей проекции примерно так же, как вы обычно делаете это с матрицей модели. - person Jerry Coffin; 19.01.2010
comment
Что ж, я решил, что попробую свою собственную ротацию. Я сделал успешную функцию вращения координат, мне просто нужно использовать ее правильно, чтобы повернуть четырехугольник так, как я хочу. Чтобы усложнить ситуацию, ось Y обращена к тому, как создаются графики, поэтому мне нужно помнить об этом. Я собираюсь посмотреть, что я могу сделать, чтобы завтра. Спасибо всем за помощь. - person Matthew Mitchell; 19.01.2010