[PyOpenGL-Users] coordinate system axes
Brought to you by:
mcfletch
From: Jano F. <fer...@gm...> - 2013-07-01 13:39:41
|
Hello there, i am fairly new to pyopengl and I am facing some difficulties. I am trying to create a indicator for the global coordinate system in the corner of a glcanvas wndow. I managed to create the lines but I am not able to rotate them when the object rotates I suspect I am not isolating the transform matrices correctly. Currently I can see the cube and the coordinate system indicator but the latter is fixed when I rotate the cube. I would lie the indicator to rotate so it will be clear in which direction the object was rotated The code comes from a bunch of examples i found online a Thanks in advance! I should mention I subclassed glcanvas class PHLVGLCanvas(glcanvas.GLCanvas): def __init__(self, parent, attribs): glcanvas.GLCanvas.__init__(self, parent, -1, attribList=attribs) self.init = False self.context = glcanvas.GLContext(self) self.axes = True self.width, self.height = self.GetSize() self.alpha = 0 self.beta = 0 self.distance = 5.0 self.oldX = 0 self.oldY = 0 self.leftDown = False self.rightDown = False self.middleDown = False self.xTrans = 0. self.yTrans = 0. self.turn, self.tip = 0, 0 #bind events self.Bind(wx.EVT_SIZE, self.OnResize) self.Bind(wx.EVT_PAINT, self.OnPaint) hlev = hlmec(self, dragThreshPixel = 15) ## hlev.setOnHLVLeftDown(self.OnLeftDown) ## hlev.setOnHLVLeftUp(self.OnLeftUp) hlev.setOnHLVMouseScroll(self.OnMouseScroll) ## hlev.setOnHLVLeftDClick(self.onHLVLeftDClick) ## hlev.setOnHLVLeftStartDragging(self.onHLVLeftStartDragging) hlev.setOnHLVLeftDragging(self.OnLeftDragging) ## hlev.setOnHLVLeftEndDragging(self.onHLVLeftEndDragging) hlev.setOnHLVMiddleDown(self.onMiddleDown) ## hlev.setOnHLVMiddleUp(self.onHLVMiddleUp) ## hlev.setOnHLVMiddleDClick(self.onHLVMiddleDClick) ## hlev.setOnHLVMiddleStartDragging(self.onMiddleStartDragging) hlev.setOnHLVMiddleDragging(self.OnPan) ## hlev.setOnHLVMiddleEndDragging(self.onMiddleEndDragging) ## hlev.setOnHLVRightDown(self.onRightDown) ## hlev.setOnHLVRightUp(self.onHLVRightUp) ## hlev.setOnHLVRightDClick(self.onHLVRightDClick) ## hlev.setOnHLVRightStartDragging(self.onHLVRightStartDragging) ## hlev.setOnHLVRightDragging(self.OnPan) ## hlev.setOnHLVRightEndDragging(self.onHLVRightEndDragging) ## hlev.setOnHLVMotion(self.OnMotion) ## hlev.setOnHLVEnterWindow(self.onHLVEnterWindow) ## hlev.setOnHLVLeaveWindow(self.onHLVLeaveWindow) #----------------------------------------------------------------------------------------------- def ChangeView(self): glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslate(self.xTrans/100, -self.yTrans/100, -self.distance) #print 'stranslated ', self.xTrans, self.yTrans glRotate(-90, 0.0, 1.0, 0.0) glRotate(-90, 1.0, 0.0, 0.0) glRotate(self.alpha, 1.0, 0.0, 1.0) glRotate(self.beta, 0.0, 1.0, 0.0) self.OnDraw() def OnPaint(self, event): dc = wx.PaintDC(self) self.SetCurrent(self.context) if not self.init: self.InitGL() self.init = True self.OnDraw() def Resize(self): ratio = float(self.width) / self.height; glMatrixMode(GL_PROJECTION) glLoadIdentity() glViewport(0, 0, self.width, self.height) gluPerspective(45, ratio, 1, 1000) self.ChangeView() #----------------------------------------------------------------------------------------------- def OnResize(self, e): w, h = e.GetSize() # guards for width and height if w: self.width = w if h: self.height = h self.Resize() def OnMouseScroll(self, event): self.SetCursor(wx.StockCursor(wx.CURSOR_MAGNIFIER)) rotation = event.GetWheelRotation() self.distance -= rotation * 0.0099 self.ChangeView() def OnLeftDragging(self, event): self.SetCursor(wx.StockCursor(wx.CURSOR_SIZING)) X, Y = event.GetPosition() self.alpha += (X - self.oldX) * 0.5 self.beta += (Y - self.oldY) * 0.5 self.tip += (X - self.oldX) self.turn += (Y - self.oldY) self.ChangeView() self.oldX, self.oldY = X, Y def OnMotion(self, event): self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) def OnPan(self, event): self.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) if not isinstance(event, wx.MouseEvent): return X, Y = event.GetPosition() #print 'X: %i, oldX: %i, Y: %i, oldY: %i, xTrans: %i, yTrans: %i' % (X, self.oldX, Y, self.oldY, (X-self.oldX), (Y-self.oldY)) self.xTrans += (X - self.oldX) self.yTrans += (Y - self.oldY) self.ChangeView() self.oldX = X self.oldY = Y #self.xTrans = self.yTrans = 0 def onMiddleDown(self, event): self.oldX, self.oldY = event.GetPosition() def onMiddleEndDragging(self, event): self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW)) print 'middle end dragging', self.xTrans, self.yTrans self.xTrans = self.yTrans = 0 #self.oldX, self.oldY = event.GetPosition() def InitGL(self): glLightfv(GL_LIGHT0, GL_DIFFUSE, (0.8, 0.8, 0.8, 1.0)) glLightfv(GL_LIGHT0, GL_AMBIENT, (0.2, 0.2, 0.2, 1.0)) glLightfv(GL_LIGHT0, GL_POSITION, (1.0, 1.0, 1.0, 0.0)) glEnable(GL_LIGHT0) # glShadeModel(GL_SMOOTH) glEnable(GL_LIGHTING) glEnable(GL_DEPTH_TEST) glClearColor(0.0, 0.0, 0.0, 1.0) glClearDepth(1.0) self.Resize() def createCube(self): glPushMatrix() glLineWidth( 2.0 ) glBegin(GL_LINE_LOOP) glNormal3f( 0.0, 0.0, 1.0) glVertex3f( 0.5, 0.5, 0.5) glVertex3f(-0.5, 0.5, 0.5) glVertex3f(-0.5,-0.5, 0.5) glVertex3f( 0.5,-0.5, 0.5) glNormal3f( 0.0, 0.0,-1.0) glVertex3f(-0.5,-0.5,-0.5) glVertex3f(-0.5, 0.5,-0.5) glVertex3f( 0.5, 0.5,-0.5) glVertex3f( 0.5,-0.5,-0.5) glNormal3f( 0.0, 1.0, 0.0) glVertex3f( 0.5, 0.5, 0.5) glVertex3f( 0.5, 0.5,-0.5) glVertex3f(-0.5, 0.5,-0.5) glVertex3f(-0.5, 0.5, 0.5) glNormal3f( 0.0,-1.0, 0.0) glVertex3f(-0.5,-0.5,-0.5) glVertex3f( 0.5,-0.5,-0.5) glVertex3f( 0.5,-0.5, 0.5) glVertex3f(-0.5,-0.5, 0.5) glNormal3f( 1.0, 0.0, 0.0) glVertex3f( 0.5, 0.5, 0.5) glVertex3f( 0.5,-0.5, 0.5) glVertex3f( 0.5,-0.5,-0.5) glVertex3f( 0.5, 0.5,-0.5) glNormal3f(-1.0, 0.0, 0.0) glVertex3f(-0.5,-0.5,-0.5) glVertex3f(-0.5,-0.5, 0.5) glVertex3f(-0.5, 0.5, 0.5) glVertex3f(-0.5, 0.5,-0.5) glEnd() glPopMatrix() def OnDraw(self): glutInit() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, (0.5, 0.5, 1.0, 1.0)) #glutSolidSphere(0.5, 20, 20) #glutWireCube(1) # draw six faces of a cube self.createCube() if self.axes: glutInit() self.ShowAxes() #self.createAxes() self.SwapBuffers() #----------------------------------------------------------------------------------------------- def ShowAxes(self): glPushMatrix() glLoadIdentity() glTranslatef(-1, 2, -5) glPushMatrix() print 'turn %f, tip %f ' % (self.turn, self.tip) glRotate(self.turn/100, 1, 0, 0) glRotate(self.tip/100, 0, 1, 0) glPopMatrix() glDisable(GL_LIGHTING) glColor3f(1.0, 1.0, 0.0) glRasterPos3f(-3.8, -5.0, -5.0) glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('x')) glRasterPos3f(-5.0, -3.8, -5.0) glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('y')) glRasterPos3f(-5.0, -5.0, -3.8) glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('z')) glRasterPos3f(-5.0, -5.0, -5.2) glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ord('0')) glColor3f(1.0, 0.0, 0.0) glBegin(GL_LINES) glVertex3f(-5, -5, -5) glVertex3f(-4, -5, -5) #glVertex3f(1, 1, 0) #glVertex3f(0, 1, 0) glEnd() glColor3f(0.0, 0.0, 1.0) glBegin(GL_LINES) glVertex3f(-5, -5, -5) glVertex3f(-5, -5, -4) #glVertex3f(0, 1, 1) #glVertex3f(0, 1, 0) glEnd() glColor3f(0.0, 1.0, 0.0) glBegin(GL_LINES) glVertex3f(-5, -5, -5) glVertex3f(-5, -4, -5) #glVertex3f(1, 0, 1) #glVertex3f(0, 0, 1) glEnd() glEnable(GL_LIGHTING) glPopMatrix() |