Я создал сцену в OpenGL + Python + Pyside.У меня проблема с плавным изменением цвета, когда я вращаю свой объект и использую свет.
Каждая сторона моего объекта с одинаковым вектором нормалей имеет угол, когда цвет этой стороны просто прыгает с другой на другую.Для других сторон с другим вектором нормалей этот угол отличается.
Я не вращаю камеру, я вращаю объект.
Я записал GIF, который показывает, о чем я говорю: https://imgur.com/a/zRxdHxB
Вот как я инициализирую OpenGL:
def initializeGL(self):
self.qglClearColor(QtGui.QColor.fromRgb(42, 11, 0))
GL.glEnable(GL.GL_DEPTH_TEST)
GL.glEnable(GL.GL_CULL_FACE)
if ENABLE_LIGHT:
GL.glEnable(GL.GL_LIGHTING)
GL.glEnable(GL.GL_LIGHT0)
ambient0 = [0.2, 0.2, 0.2, 1];
diffuse0 = [0.9, 0.9, 0.9, 1];
specular0 = [0.7, 0.7, 0.7, 1];
GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, self.light_pos)
GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient0);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuse0);
GL.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, specular0);
glob_ambient = [0.7, 0.7, 0.7, 0.7];
GL.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, glob_ambient);
GL.glEnable(GL.GL_COLOR_MATERIAL);
GL.glShadeModel(GL.GL_FLAT);
GL.glViewport(0,0, self.width, self.heigh)
GL.glMatrixMode(GL.GL_PROJECTION)
GLU.gluPerspective(40.0, self.width/self.heigh, 0.01, 10000.0);
GL.glMatrixMode(GL.GL_MODELVIEW)
self.initialized = True
Вот как я рисуюсцена:
def paintGL(self):
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
GL.glMatrixMode(GL.GL_MODELVIEW);
GL.glLoadIdentity();
GLU.gluLookAt(*self.eyePos.getEyePos())
GL.glTranslated(0.0, 0.0, 0)
GL.glRotated(self.xRot, 1.0, 0.0, 0.0)
GL.glRotated(self.yRot, 0.0, 1.0, 0.0)
GL.glRotated(self.zRot, 0.0, 0.0, 1.0)
if self.scene:
self.scene.renderScene()
GL.glPushMatrix();
GL.glLoadIdentity();
GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, self.light_pos)
GL.glPopMatrix()
GL.glFlush()
Я установил материал следующим образом:
(...)
GL.glBegin(GL.GL_POLYGON)
GL.glColor4fv([0.25, 0.25, 0.35, 1])
GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, [0.2, 0.2, 0.2, 1])
GL.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, [0.2, 0.2, 0.2, 1])
GL.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, [0.2, 0.2, 0.2, 1])
GL.glNormal3fv(self.Normals[n])
(...)
Положение света [-100, 100, 200]
Положение глаза [0, 0, 50];
Положение объекта [0, 0, 0]
Объект 20 единицширокий и высотой 20 единиц.
Как избавиться от этого раздражающего эффекта?