如何绑定按钮操作以影响单独面板中的pyopengl对象?

在我按下旋转按钮以激活Button_EVT功能之前,程序将启动并正常工作。它开始滞后,当滞后减小时,球体仍然没有改变位置。

选择 | 换行 | 行号
  1. from OpenGL.GLUT import *
  2. from OpenGL.GLU import *
  3. from OpenGL.GL import *
  4. from wx.glcanvas import GLCanvas
  5. import wx
  6.  
  7.  
  8. class myGLCanvas(GLCanvas):
  9.     def __init__(self, *args, **kwargs):
  10.         GLCanvas.__init__(self, *args, **kwargs)
  11.         self.Bind(wx.EVT_PAINT, self.OnPaint)
  12.         self.Bind(wx.EVT_SIZE, self.OnResize)
  13.         self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
  14.         self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
  15.         self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
  16.         self.Bind(wx.EVT_MOTION, self.OnMouse)
  17.  
  18.         self.init = False
  19.         self.width, self.height = self.GetSize()
  20.  
  21.         self.alpha = 0
  22.         self.beta = 0
  23.         self.distance = 5.0
  24.  
  25.         self.oldX = 0
  26.         self.oldY = 0
  27.         self.leftDown = False
  28.         self.rightDown = False
  29.         self.axes = False
  30.  
  31.  
  32.     def Axes(self, allow):
  33.         self.axes = allow
  34.  
  35.  
  36.     def OnDraw(self):
  37.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  38.  
  39.         glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, (0.5, 0.5, 1.0, 1.0))
  40.         glutSolidSphere(0.5, 20, 20)
  41.  
  42.         if self.axes:
  43.             self.ShowAxes()
  44.  
  45.         self.SwapBuffers()
  46.  
  47.  
  48.     def ChangeView(self):
  49.         glMatrixMode(GL_MODELVIEW)
  50.         glLoadIdentity()
  51.         glTranslate(0.0, 0.0, -self.distance)
  52.         glRotate(-90, 0.0, 1.0, 0.0)
  53.         glRotate(-90, 1.0, 0.0, 0.0)
  54.  
  55.         glRotate(self.alpha, 0.0, 0.0, 1.0)
  56.         glRotate(self.beta, 0.0, 1.0, 0.0)
  57.  
  58.         self.OnDraw()
  59.  
  60.  
  61.     def Resize(self):
  62.         ratio = float(self.width) / self.height;
  63.  
  64.         glMatrixMode(GL_PROJECTION)
  65.         glLoadIdentity()
  66.         glViewport(0, 0, self.width, self.height)
  67.         gluPerspective(45, ratio, 1, 1000)
  68.  
  69.         self.ChangeView()
  70.  
  71.  
  72.     def OnPaint(self, event):
  73.         wx.PaintDC(self)
  74.         self.SetCurrent()
  75.         if not self.init:
  76.             self.InitGL()
  77.             self.init = True
  78.         self.OnDraw()
  79.  
  80.  
  81.  
  82.  
  83.     def OnLeftDown(self, event):
  84.         self.oldX, self.oldY = event.GetPosition()
  85.         self.leftDown = True
  86.  
  87.     def OnRightDown(self, event):
  88.         self.oldX, self.oldY = event.GetPosition()
  89.         self.rightDown = True
  90.  
  91.     def OnLeftUp(self, event):
  92.         self.leftDown = False
  93.  
  94.     def OnRightUp(self, event):
  95.         self.rightDown = False
  96.  
  97.     def OnMouse(self, event):
  98.         if self.leftDown or self.rightDown:
  99.             for i in range(5000):
  100.                 X, Y = event.GetPosition()
  101.                 if self.rightDown:
  102.                     self.distance += (Y - self.oldY) * 0.05
  103.  
  104.                 if self.leftDown:
  105.                     self.alpha += (X - self.oldX) * 0.5
  106.                     self.beta += (Y - self.oldY) * 0.5
  107.  
  108.                 self.ChangeView()
  109.                 self.oldX, self.oldY = X, Y
  110.  
  111.  
  112.  
  113.     def OnResize(self, e):
  114.         self.width, self.height = e.GetSize()
  115.         self.Resize()
  116.  
  117.  
  118.     def ShowAxes(self):
  119.         glDisable(GL_LIGHTING)
  120.  
  121.         glColor3f(1.0, 1.0, 0.0)
  122.         glRasterPos3f(1.2, 0.0, 0.0)
  123.         glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('x'))
  124.         glRasterPos3f(0.0, 1.2, 0.0)
  125.         glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('y'))
  126.         glRasterPos3f(0.0, 0.0, 1.2)
  127.         glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('z'))
  128.  
  129.         glColor3f(1.0, 0.0, 0.0)
  130.         glBegin(GL_QUADS)
  131.         glVertex3f(0, 0, 0)
  132.         glVertex3f(1, 0, 0)
  133.         glVertex3f(1, 1, 0)
  134.         glVertex3f(0, 1, 0)
  135.         glEnd()
  136.         glColor3f(0.0, 1.0, 0.0)
  137.         glBegin(GL_QUADS)
  138.         glVertex3f(0, 0, 0)
  139.         glVertex3f(0, 0, 1)
  140.         glVertex3f(0, 1, 1)
  141.         glVertex3f(0, 1, 0)
  142.         glEnd()
  143.         glColor3f(0.0, 0.0, 1.0)
  144.         glBegin(GL_QUADS)
  145.         glVertex3f(0, 0, 0)
  146.         glVertex3f(1, 0, 0)
  147.         glVertex3f(1, 0, 1)
  148.         glVertex3f(0, 0, 1)
  149.         glEnd()
  150.  
  151.         glEnable(GL_LIGHTING)
  152.  
  153.  
  154.     def InitGL(self):
  155.         glLightfv(GL_LIGHT0, GL_DIFFUSE,  (0.8, 0.8, 0.8, 1.0))
  156.         glLightfv(GL_LIGHT0, GL_AMBIENT,  (0.2, 0.2, 0.2, 1.0))
  157.         glLightfv(GL_LIGHT0, GL_POSITION, (1.0, 1.0, 1.0, 0.0))
  158.         glEnable(GL_LIGHT0)
  159.  
  160.         glShadeModel(GL_SMOOTH)
  161.         glEnable(GL_LIGHTING)
  162.         glEnable(GL_DEPTH_TEST)
  163.         glClearColor(0.0, 0.0, 0.0, 1.0)
  164.         glClearDepth(1.0)
  165.  
  166.         self.Resize()
  167.  
  168.  
  169. class ToolPanel(wx.Panel):
  170.     def __init__(self, parent, canvas, *args, **kwargs):
  171.         wx.Panel.__init__(self, parent, *args, **kwargs)
  172.         self.canvas = canvas
  173.  
  174.         self.button1 = wx.Button(self, label="TEXT 1")
  175.         self.button2 = wx.Button(self, label="Rotate")
  176.         self.check1 = wx.CheckBox(self, label="Show Axes")
  177.         self.Bind(wx.EVT_CHECKBOX, self.Check1)
  178.         self.Bind(wx.EVT_BUTTON, self.Button_Evt, self.button2)
  179.  
  180.         self.sizer = wx.BoxSizer(wx.VERTICAL)
  181.         self.sizer.Add(self.button1, flag=wx.BOTTOM, border=5)
  182.         self.sizer.Add(self.button2, flag=wx.BOTTOM, border=5)
  183.         self.sizer.Add(self.check1)
  184.  
  185.         self.border = wx.BoxSizer()
  186.         self.border.Add(self.sizer, flag=wx.ALL | wx.EXPAND, border=5)
  187.  
  188.         self.SetSizerAndFit(self.border)
  189.  
  190.     def Button_Evt(self, event):
  191.         for i in range(5000):
  192.             X, Y = self.canvas.GetPosition()
  193.             self.canvas.alpha += (X - self.canvas.oldX) * 0.5
  194.             self.canvas.beta += (Y - self.canvas.oldY) * 0.5
  195.  
  196.             self.canvas.ChangeView()
  197.  
  198.             self.canvas.OnDraw()
  199.  
  200.  
  201.     def Check1(self, e):
  202.         self.canvas.Axes(e.Checked())
  203.         self.canvas.OnDraw()
  204.  
  205. class MainWin(wx.Frame):
  206.     def __init__(self, *args, **kwargs):
  207.         wx.Frame.__init__(self, title='OpenGL', *args, **kwargs)
  208.  
  209.         self.canvas = myGLCanvas(self, size=(640, 480))
  210.         self.panel = ToolPanel(self, canvas=self.canvas)
  211.  
  212.         self.sizer = wx.BoxSizer()
  213.         self.sizer.Add(self.canvas, 1, wx.EXPAND)
  214.         self.sizer.Add(self.panel, 0, wx.EXPAND)
  215.         self.SetSizerAndFit(self.sizer)
  216.  
  217.         self.Show() 
  218.  
  219.  
  220. app = wx.App(False)
  221. main_win = MainWin(None)
  222. app.MainLoop()
  223.  
# 回答1


嗯……不要紧……我是个编辑白痴……
默认坐标从0,0开始。那么这意味着什么呢?
这意味着,因为我只使用乘法来更新坐标,所以它们保持在0,0。我在每个轴上加了+1(显然可以使用任何东西,只要结果大于0),现在我开始做生意了。真令人尴尬……没有$KILL$$E$,$整洁的$Nake是什么样子。

标签: python

添加新评论