OpenGL的浅色不会一次平滑地改变

2024-06-16 13:18:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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个单位。你知道吗

如何摆脱这种烦人的影响?你知道吗


Tags: 对象self颜色物体opengl角度frontgl