[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

PyOpenGL, wxPython weird behaviour

Isis

1/3/2008 5:50:00 PM

Hi everyone,

I'm doing a project using wxPython and pyopengl, and I seem to have a
problem rendering textures. This is code that worked before my hard
drive had a meltdown, but not since I re-installed everything.

I've determined the problem is in the OpenGL part of my program. I do
some calculations to generate a 2D numpy array that holds the image
data, and pylab.imshow() shows me the image as it is meant to be. I
used the same algorithm in Octave and MATLAB, and all are giving me
the right picture.

However, using pyOpenGL and the numpyhandler functions (http://cours-
info.iut-bm.univ-fcomte.fr/docs/python/OpenGL/
OpenGL.arrays.numpymodule.NumpyHandler-class.html) doesn't seem to
work. I get a garbled screen pocked with black pixels. I am including
my openGL code below. What am I doing wrong?

And yes, I did make the dtype of my array 'float32'.

-------code snippets------

import wx
from wx.glcanvas import GLCanvas

from OpenGL.GLU import *
from OpenGL.GL import *
from OpenGL.arrays.numpymodule import NumpyHandler


PC = 1
RI = 0

class myGLCanvas(GLCanvas):
def __init__(self, parent):
GLCanvas.__init__(self, parent,-1)
wx.EVT_PAINT(self, self.OnPaint)
self.init = 0
self.mode = -1
# making a texture for the range image
self.texture = glGenTextures(1)
# making a spot for the point cloud points
self.cloud = None
return

def OnPaint(self,event):
dc = wx.PaintDC(self)
self.SetCurrent()
if not self.init:
self.InitGL()
self.init = 1
self.OnDraw()
return

def OnDraw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
if self.mode == RI:
self.drawRange()
elif self.mode == PC:
self.drawCloud()


def InitGL(self):
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glClear(GL_COLOR_BUFFER_BIT)

glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)

#NTSC colour scales...
glPixelTransferf(GL_RED_SCALE, 0.299);
glPixelTransferf(GL_GREEN_SCALE, 0.587);
glPixelTransferf(GL_BLUE_SCALE, 0.114);

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0.0,1.0,0,1.0,-1.0,1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

return

def rangeImage(self, image):

glBindTexture(GL_TEXTURE_2D, self.texture)
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )


glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR)
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)

# flatten it into a list so the OpenGL calls work
n = NumpyHandler()
fI = image.flatten()
flatImage = n.dataPointer(n.contiguous(fI))

print n.contiguous(fI)

gluBuild2DMipmaps(GL_TEXTURE_2D, 1, image.shape[0]+1,
image.shape[1]+1,
GL_LUMINANCE, GL_FLOAT, flatImage)
self.mode = RI
self.OnDraw()


def drawRange(self):
''' Controls the actual drawing of the range image'''

glMatrixMode(GL_MODELVIEW)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

glColor3f(1.0,1.0,1.0)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, self.texture)
glBegin(GL_TRIANGLE_FAN)
glTexCoord2d(1,1); glVertex3f(0.0, 0.0, 0.0)
glTexCoord2d(1,0); glVertex3f(0.0, 1.0, 0.0)
glTexCoord2d(0,0); glVertex3f(1.0, 1.0, 0.0)
glTexCoord2d(0,1); glVertex3f(1.0, 0.0, 0.0)
glEnd()
self.SwapBuffers()

--------end snippet-----------
3 Answers

Mike Driscoll

1/3/2008 7:07:00 PM

0

On Jan 3, 11:50 am, Adeola Bannis <theCodeMai...@gmail.com> wrote:
> Hi everyone,
>
> I'm doing a project using wxPython and pyopengl, and I seem to have a
> problem rendering textures. This is code that worked before my hard
> drive had a meltdown, but not since I re-installed everything.
>
> I've determined the problem is in the OpenGL part of my program. I do
> some calculations to generate a 2D numpy array that holds the image
> data, and pylab.imshow() shows me the image as it is meant to be. I
> used the same algorithm in Octave and MATLAB, and all are giving me
> the right picture.
>
> However, using pyOpenGL and the numpyhandler functions (http://cours-
> info.iut-bm.univ-fcomte.fr/docs/python/OpenGL/
> OpenGL.arrays.numpymodule.NumpyHandler-class.html) doesn't seem to
> work. I get a garbled screen pocked with black pixels. I am including
> my openGL code below. What am I doing wrong?
>
> And yes, I did make the dtype of my array 'float32'.
>
> -------code snippets------
>
> import wx
> from wx.glcanvas import GLCanvas
>
> from OpenGL.GLU import *
> from OpenGL.GL import *
> from OpenGL.arrays.numpymodule import NumpyHandler
>
> PC = 1
> RI = 0
>
> class myGLCanvas(GLCanvas):
> def __init__(self, parent):
> GLCanvas.__init__(self, parent,-1)
> wx.EVT_PAINT(self, self.OnPaint)
> self.init = 0
> self.mode = -1
> # making a texture for the range image
> self.texture = glGenTextures(1)
> # making a spot for the point cloud points
> self.cloud = None
> return
>
> def OnPaint(self,event):
> dc = wx.PaintDC(self)
> self.SetCurrent()
> if not self.init:
> self.InitGL()
> self.init = 1
> self.OnDraw()
> return
>
> def OnDraw(self):
> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
> if self.mode == RI:
> self.drawRange()
> elif self.mode == PC:
> self.drawCloud()
>
> def InitGL(self):
> glClearColor(0.0, 0.0, 0.0, 0.0);
> glClearDepth(1.0)
> glEnable(GL_DEPTH_TEST)
> glDepthFunc(GL_LEQUAL)
> glClear(GL_COLOR_BUFFER_BIT)
>
> glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
> glPixelStorei(GL_PACK_ALIGNMENT, 1)
>
> #NTSC colour scales...
> glPixelTransferf(GL_RED_SCALE, 0.299);
> glPixelTransferf(GL_GREEN_SCALE, 0.587);
> glPixelTransferf(GL_BLUE_SCALE, 0.114);
>
> glMatrixMode(GL_PROJECTION)
> glLoadIdentity()
> glOrtho(0.0,1.0,0,1.0,-1.0,1.0)
> glMatrixMode(GL_MODELVIEW)
> glLoadIdentity()
>
> return
>
> def rangeImage(self, image):
>
> glBindTexture(GL_TEXTURE_2D, self.texture)
> glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )
>
> glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> GL_LINEAR)
> glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
> glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
> glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
>
> # flatten it into a list so the OpenGL calls work
> n = NumpyHandler()
> fI = image.flatten()
> flatImage = n.dataPointer(n.contiguous(fI))
>
> print n.contiguous(fI)
>
> gluBuild2DMipmaps(GL_TEXTURE_2D, 1, image.shape[0]+1,
> image.shape[1]+1,
> GL_LUMINANCE, GL_FLOAT, flatImage)
> self.mode = RI
> self.OnDraw()
>
> def drawRange(self):
> ''' Controls the actual drawing of the range image'''
>
> glMatrixMode(GL_MODELVIEW)
> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
>
> glColor3f(1.0,1.0,1.0)
> glEnable(GL_TEXTURE_2D)
> glBindTexture(GL_TEXTURE_2D, self.texture)
> glBegin(GL_TRIANGLE_FAN)
> glTexCoord2d(1,1); glVertex3f(0.0, 0.0, 0.0)
> glTexCoord2d(1,0); glVertex3f(0.0, 1.0, 0.0)
> glTexCoord2d(0,0); glVertex3f(1.0, 1.0, 0.0)
> glTexCoord2d(0,1); glVertex3f(1.0, 0.0, 0.0)
> glEnd()
> self.SwapBuffers()
>
> --------end snippet-----------

I've never messed with pyOpenGL, but it seems that they have their own
user's group, which would probably be better at answering your
question:

http://sourceforge.net/mail/?gro...

Of course, it could be that you upgraded your wxPython to the latest
version and as I recall, they were discussing some subtle differences
in DCs, blitting, paint events and other things that I just don't
understand at this point in my "Pythoneering". You might ask them at
their group, which is usually very helpful: wxPython.org

Mike

Isis

1/3/2008 8:15:00 PM

0

Thanks, will do...
On Jan 3, 2:07 pm, kyoso...@gmail.com wrote:
> On Jan 3, 11:50 am, Adeola Bannis <theCodeMai...@gmail.com> wrote:
>
>
>
> > Hi everyone,
>
> > I'm doing a project using wxPython and pyopengl, and I seem to have a
> > problem rendering textures. This is code that worked before my hard
> > drive had a meltdown, but not since I re-installed everything.
>
> > I've determined the problem is in the OpenGL part of my program. I do
> > some calculations to generate a 2D numpy array that holds the image
> > data, and pylab.imshow() shows me the image as it is meant to be. I
> > used the same algorithm in Octave and MATLAB, and all are giving me
> > the right picture.
>
> > However, using pyOpenGL and the numpyhandler functions (http://cours-
> > info.iut-bm.univ-fcomte.fr/docs/python/OpenGL/
> > OpenGL.arrays.numpymodule.NumpyHandler-class.html) doesn't seem to
> > work. I get a garbled screen pocked with black pixels. I am including
> > my openGL code below. What am I doing wrong?
>
> > And yes, I did make the dtype of my array 'float32'.
>
> > -------code snippets------
>
> > import wx
> > from wx.glcanvas import GLCanvas
>
> > from OpenGL.GLU import *
> > from OpenGL.GL import *
> > from OpenGL.arrays.numpymodule import NumpyHandler
>
> > PC = 1
> > RI = 0
>
> > class myGLCanvas(GLCanvas):
> > def __init__(self, parent):
> > GLCanvas.__init__(self, parent,-1)
> > wx.EVT_PAINT(self, self.OnPaint)
> > self.init = 0
> > self.mode = -1
> > # making a texture for the range image
> > self.texture = glGenTextures(1)
> > # making a spot for the point cloud points
> > self.cloud = None
> > return
>
> > def OnPaint(self,event):
> > dc = wx.PaintDC(self)
> > self.SetCurrent()
> > if not self.init:
> > self.InitGL()
> > self.init = 1
> > self.OnDraw()
> > return
>
> > def OnDraw(self):
> > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
> > if self.mode == RI:
> > self.drawRange()
> > elif self.mode == PC:
> > self.drawCloud()
>
> > def InitGL(self):
> > glClearColor(0.0, 0.0, 0.0, 0.0);
> > glClearDepth(1.0)
> > glEnable(GL_DEPTH_TEST)
> > glDepthFunc(GL_LEQUAL)
> > glClear(GL_COLOR_BUFFER_BIT)
>
> > glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
> > glPixelStorei(GL_PACK_ALIGNMENT, 1)
>
> > #NTSC colour scales...
> > glPixelTransferf(GL_RED_SCALE, 0.299);
> > glPixelTransferf(GL_GREEN_SCALE, 0.587);
> > glPixelTransferf(GL_BLUE_SCALE, 0.114);
>
> > glMatrixMode(GL_PROJECTION)
> > glLoadIdentity()
> > glOrtho(0.0,1.0,0,1.0,-1.0,1.0)
> > glMatrixMode(GL_MODELVIEW)
> > glLoadIdentity()
>
> > return
>
> > def rangeImage(self, image):
>
> > glBindTexture(GL_TEXTURE_2D, self.texture)
> > glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE )
>
> > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> > GL_LINEAR)
> > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
> > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
> > glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
>
> > # flatten it into a list so the OpenGL calls work
> > n = NumpyHandler()
> > fI = image.flatten()
> > flatImage = n.dataPointer(n.contiguous(fI))
>
> > print n.contiguous(fI)
>
> > gluBuild2DMipmaps(GL_TEXTURE_2D, 1, image.shape[0]+1,
> > image.shape[1]+1,
> > GL_LUMINANCE, GL_FLOAT, flatImage)
> > self.mode = RI
> > self.OnDraw()
>
> > def drawRange(self):
> > ''' Controls the actual drawing of the range image'''
>
> > glMatrixMode(GL_MODELVIEW)
> > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
>
> > glColor3f(1.0,1.0,1.0)
> > glEnable(GL_TEXTURE_2D)
> > glBindTexture(GL_TEXTURE_2D, self.texture)
> > glBegin(GL_TRIANGLE_FAN)
> > glTexCoord2d(1,1); glVertex3f(0.0, 0.0, 0.0)
> > glTexCoord2d(1,0); glVertex3f(0.0, 1.0, 0.0)
> > glTexCoord2d(0,0); glVertex3f(1.0, 1.0, 0.0)
> > glTexCoord2d(0,1); glVertex3f(1.0, 0.0, 0.0)
> > glEnd()
> > self.SwapBuffers()
>
> > --------end snippet-----------
>
> I've never messed with pyOpenGL, but it seems that they have their own
> user's group, which would probably be better at answering your
> question:
>
> http://sourceforge.net/mail/?gro...
>
> Of course, it could be that you upgraded your wxPython to the latest
> version and as I recall, they were discussing some subtle differences
> in DCs, blitting, paint events and other things that I just don't
> understand at this point in my "Pythoneering". You might ask them at
> their group, which is usually very helpful: wxPython.org
>
> Mike

Ken

4/3/2013 4:29:00 AM

0

On Tuesday, April 2, 2013 6:09:02 AM UTC-7, shel...@thevillages.net wrote:

>
> It is a slow process, but she hardly ever wears the (soft) collar any
>
> more. There is still pain, and she is going for physical therapy. She
>
> even drove a little last week.
>
>
>
> --
>
> Shelly

Shelly,

Thanks for the update. As long as she's improving, slowly or whatever, it's a good sign.

Ken