gpt4 book ai didi

python - 如何在pygame和pyopengl中独立旋转2个对象

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:57 25 4
gpt4 key购买 nike

我试图独立旋转 2 个对象,但是当我运行代码时,两个对象都以相同的方向旋转,请在此处输入代码

here i save the matrix and rotate a square under the cube

def rotate_square():
glColor3f(1,1,1)
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glRotatef(45,0,1,0)
glBegin(GL_LINES)
glVertex3fv(v1);
glVertex3fv(v2);
glVertex3fv(v1);
glVertex3fv(v3);
glVertex3fv(v3);
glVertex3fv(v4);
glVertex3fv(v2);
glVertex3fv(v4);
glEnd()
glPopMatrix()

main function

def main():
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, DOUBLEBUF|OPENGL)
resize(*SCREEN_SIZE)
print(glGetString(GL_VERSION))
gluLookAt(0, 0, -6, 0, 0, 0, 0, 1, 0)

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

Rotating the cube

        glRotatef(1,0,1,0)
glutWireCube(2)
rotate_square()
pygame.display.flip()
pygame.time.wait(10)

最佳答案

请注意,通过 glBegin/glEnd 序列绘制、固定功能流水线矩阵堆栈和每个顶点灯​​光模型的固定功能流水线已被弃用数十年。了解 Fixed Function Pipeline并查看 Vertex SpecificationShader最先进的渲染方式。

总之,一般情况下,一个物体由模型矩阵变换,然后场景由 View 矩阵和投影矩阵变换。
可悲的是,在已弃用的 OpenGL 固定功能管道中,模型矩阵和 View 矩阵是连接在一起的,不能那么容易地单独处理。

您必须通过每个对象自己的模型矩阵对其进行变换才能独立旋转它们。创建 4*4 矩阵并通过单位矩阵对其进行初始化:

model1 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
model2 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]

要操作模型矩阵,请通过 glLoadMatrix 将它们加载到矩阵堆栈中.然后操作它们,最后通过 glGetFloatv(GL_MODELVIEW_MATRIX) 读回结果:

glPushMatrix()
glLoadMatrixf(model1)
glRotatef(1,0,1,0)
model1 = glGetFloatv(GL_MODELVIEW_MATRIX)
glPopMatrix()

如果必须应用模型矩阵,可以将其与glMultMatrix相乘到矩阵栈中:

glPushMatrix()
glMultMatrixf(model1)
glutWireCube(2)
glPopMatrix()

最终代码可能是这样的:

model1 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
model2 = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
def rotate_square():
global model2

glPushMatrix()
glLoadMatrixf(model2)
glRotatef(5,0,1,0)
model2 = glGetFloatv(GL_MODELVIEW_MATRIX)
glPopMatrix()

glColor3f(1,1,1)

glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glMultMatrixf(model2)
glBegin(GL_LINES)
glVertex3fv(v1)
glVertex3fv(v2)
glVertex3fv(v1)
glVertex3fv(v3)
glVertex3fv(v3)
glVertex3fv(v4)
glVertex3fv(v2)
glVertex3fv(v4)
glEnd()
glPopMatrix()
def main():
global model1

# [...]

while True:

# [...]

glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadMatrixf(model1)
glRotatef(1,0,1,0)
model1 = glGetFloatv(GL_MODELVIEW_MATRIX)
glPopMatrix()

glPushMatrix()
glMultMatrixf(model1)
glutWireCube(2)
glPopMatrix()

rotate_square()

pygame.display.flip()
pygame.time.wait(10)

关于python - 如何在pygame和pyopengl中独立旋转2个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53157171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com