首页 > 解决方案 > 在 PyOpenGL 中切换 Y 轴和 Z 轴

问题描述

我想在 PyOpenGL 中切换 Y 轴和 Z 轴方向。我曾尝试使用矩阵变换,但我无法做到。

代码:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(self.zoom, -self.zoom, -self.zoom, self.zoom, -5000, 5000)
glMatrixMode(GL_MODELVIEW)
glClearColor(1, 1, 1, 0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadMatrixf(self.m)

在哪里:

self.zoom = 150
self.m = [[1, 0, 0, 0],
          [0, 0, 1, 0],
          [0, 1, 0, 0],
          [0, 0, 0, 1]]

错误的结果: 在此处输入图像描述

使用单位矩阵: 在此处输入图像描述

预期的: 在此处输入图像描述

编辑:这有效:

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(self.zoom, -self.zoom, -self.zoom, self.zoom, -5000, 5000)
        up = 1
        if self.theta == 360:
            up = -1
        gluLookAt(self.x, self.y, self.z, 0, 0, 0, 0, up, 0)
        glMatrixMode(GL_MODELVIEW)
        glClearColor(1, 1, 1, 0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadMatrixf(self.m)

标签: pythonopenglmatrixpyopenglopengl-compat

解决方案


通过交换组件和反转组件之一,可以将二维向量旋转 90°:

  • 向左旋转 (x, y) 是 (-y, x)
  • 向右旋转 (x, y) 是 (y, -x)

您实际上要做的是将右手矩阵转换为左手矩阵。它是旋转 90° 和镜像的串联。

改变矩阵:

任何一个

self.m = [[1, 0,  0, 0],
          [0, 0, -1, 0],
          [0, 1,  0, 0],
          [0, 0,  0, 1]]

或者

self.m = [[1,  0, 0, 0],
          [0,  0, 1, 0],
          [0, -1, 0, 0],
          [0,  0, 0, 1]]

请注意,同样可以通过绕 x 轴旋转来实现。例如:

glLoadIdentity()
glRotatef(90, 1, 0, 0)

如果你有一个视图矩阵和一个模型矩阵,那么你必须将模型矩阵乘以视图矩阵glMultMatrix

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(self.x, self.y, self.z, 0, 0, 0, 0, up, 0)
glMultMatrixf(self.m)

推荐阅读