Форум сайта python.su
Я изначально пошел не тем путем. Мне необходимо создать программу, чтобы управлять яркостью изображения посредством OpenGL. Таким образом, из входного двумерного массива должно формироваться изображение в градации серого, подгружаться в OpenGL и уже там изменяться. За основу беру класс GLCanvas из библиотеки wxWidgets. Ниже привожу пример куба, обрабатываемого в OpenGL. Не подскажете куда копать дальше?
import wx
from wx import glcanvas
from OpenGL.GL import *
from OpenGL.GLUT import *
from wx.glcanvas import GLCanvas, WX_GL_DOUBLEBUFFER
from numpy import clip, histogram, cumsum, searchsorted, uint16
class ButtonPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
c = sdfsdf(self)
c.SetSize((200, 200))
class MyCanvasBase(glcanvas.GLCanvas):
def __init__(self, parent):
glcanvas.GLCanvas.__init__(self, parent, -1)
self.init = False
# initial mouse position
self.lastx = self.x = 0
self.lasty = self.y = 0
self.size = None
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMotion)
def OnPaint(self, event):
dc = wx.PaintDC(self)
self.SetCurrent()
if not self.init:
self.InitGL()
self.init = True
self.OnDraw()
def OnMouseDown(self, evt):
self.CaptureMouse()
self.x, self.y = self.lastx, self.lasty = evt.GetPosition()
def OnMouseUp(self, evt):
self.ReleaseMouse()
def OnMouseMotion(self, evt):
if evt.Dragging() and evt.LeftIsDown():
self.lastx, self.lasty = self.x, self.y
self.x, self.y = evt.GetPosition()
self.Refresh(False)
class sdfsdf(MyCanvasBase):
def InitGL(self):
# set viewing projection
glMatrixMode(GL_PROJECTION)
glFrustum(-1, 1, -1, 1, 1, 5)
# position viewer
glMatrixMode(GL_MODELVIEW)
glTranslatef(0, 0, -2.0)
# position object
glRotatef(self.y, 3.0, 0.0, 0.0)
glRotatef(self.x, 0.0, 1.0, 0.0)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
def OnDraw(self):
# clear color and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# draw six faces of a cube
glBegin(GL_QUADS)
glNormal3f( 0.0, 0.0, 1.0)
glVertex3f( 0.6, 0.6, 0.6)
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()
if self.size is None:
self.size = self.GetClientSize()
w, h = self.size
w = max(w, 1.0)
h = max(h, 1.0)
xScale = 180.0 / w
yScale = 180.0 / h
glRotatef((self.y - self.lasty) * yScale, 1.0, 0.0, 0.0);
glRotatef((self.x - self.lastx) * xScale, 0.0, 1.0, 0.0);
self.SwapBuffers()
app = wx.App(False)
try:
frame = wx.Frame(None)
panel = ButtonPanel(frame)
frame.Show()
app.MainLoop()
finally:
del app
Офлайн
Levelup, есть спецификация OpenGL, туда и смотрите. Там примеры на С, но перевести на Python очень легко, так как весь OpenGL API состоит только из вызовов функций.
Единственное, что хочу заметить, что так сейчас уже никто не пишет. Это пример из OpenGL API 1.0 - 1.5. Курс введения в современный OpenGL можно почитать здесь
Офлайн
Большое спасибо за информацию! Возникла очередная проблема. Написал пример создания окна, описанный на сайте. Каким образом можно запустить скрипт? В статье код компилируют…
from OpenGL.GLUT import *
def main(*args, **kwarg):
glutInit(*args, **kwarg)
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE)
glutInitWindowSize(400,300)
glutCreateWindow('Hello world')
glutDisplayFunc(render)
glutIdleFunc(update_fade_factor)
glutMainLoop()
def make_resourses():
pass
def update_fade_factor():
pass
def static(*args):
glClearColor(1.0,1.0, 1.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
glutSwapBuffers()
Офлайн
LevelupЛогично было бы добавить в конец скрипта:
if __name__ == '__main__':
main()
Офлайн
Благодарю!
Офлайн
Подскажите, пожалуйста, каким образом данное изображение
import numpy as np
def f(i,j):
return i**2 + j**2
w, h = 512, 512
image = np.fromfunction(f, (w, h))+10000
b1, b2 = np.min(image), np.max(image)
print ‘array min max =’, b1, b2
image = (image-b1)/(b2-b1)*255
print ‘new min max =’, np.min(image), np.max(image)
image = np.array(image, dtype=np.uint8)
можно вставить в окно wx.frame?
import wx
class MyFrame(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
app = wx.App(False)
try:
frame = wx.Frame(None)
panel = MyFrame(frame)
frame.Show()
app.MainLoop()
finally:
del app
Офлайн
Ну помогите, пожалуйста! Очень надо..
Офлайн