[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()
|