OpenGL light - цвет не меняется плавно под одним углом - PullRequest
0 голосов
/ 06 декабря 2018

Я создал сцену в 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 единиц.

Как избавиться от этого раздражающего эффекта?

...