Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 OpenGL在简单立方体状对象上的奇怪阴影_Python 2.7_Opengl - Fatal编程技术网

Python 2.7 OpenGL在简单立方体状对象上的奇怪阴影

Python 2.7 OpenGL在简单立方体状对象上的奇怪阴影,python-2.7,opengl,Python 2.7,Opengl,编辑:我无法理解有关共享顶点的注释,因此我使用OpenGL的自动立方体生成glutSolidCube()方法重写了脚本,而不是手动构建对象。同样奇怪的图案出现,表明问题与我的构造无关 我正试图在我的笔记本电脑上使用OpenGL根据基于的实时数据旋转一个立方体状的对象,但我一直得到这个奇怪的阴影状的工件 下面的脚本是文章中脚本的一个子集,但我已经重建了顶点,以便我(相信我)理解它们 我可以通过切换GL_LIGHTING使它们消失,但随后我松开了照明。下面两种状态下都显示了对象的图像 我想我的问题

编辑:我无法理解有关共享顶点的注释,因此我使用OpenGL的自动立方体生成
glutSolidCube()
方法重写了脚本,而不是手动构建对象。同样奇怪的图案出现,表明问题与我的构造无关


我正试图在我的笔记本电脑上使用OpenGL根据基于的实时数据旋转一个立方体状的对象,但我一直得到这个奇怪的阴影状的工件

下面的脚本是文章中脚本的一个子集,但我已经重建了顶点,以便我(相信我)理解它们

我可以通过切换
GL_LIGHTING
使它们消失,但随后我松开了照明。下面两种状态下都显示了对象的图像

我想我的问题很简单,但我找不到一种通过反复试验来解决的方法,有人能帮我找出我做错了什么吗

这是OpenGL 3.1.0,运行在OSX 10.11上的Python2.7中,以防发生变化


早期图像和脚本:

#/usr/bin/python
导入pygame
#导入URL库
从OpenGL.GL导入*
从OpenGL.GLU导入*
从pygame.locals导入*
导入时间
将numpy作为np导入
屏幕大小=(800600)
def调整大小(宽度、高度):
glViewport(0,0,宽度,高度)
glMatrixMode(GL_投影)
glLoadIdentity()
透视图(45.0,浮动(宽度)/高度,0.001,10.0)
glMatrixMode(GLU模型视图)
glLoadIdentity()
gluLookAt(0.0,1.0,-5.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0)
def init():
glEnable(GL_深度_测试)
#以下内容似乎没有任何效果,因此我已将其注释掉
#glClearColor(0.0,0.0,0.0,0.0)
#glShadeModel(GLU平滑)
#glEnable(GL_混合)
#glEnable(GL_多边形_平滑)
#glHint(GL\u多边形\u平滑\u提示,GL\u最佳)
glEnable(德国劳埃德船级社颜色材料)
glEnable(GL#U照明)#这一个
glEnable(Glu LIGHT0)
glLightfv(GL_LIGHT0,GL_AMBIENT,(0.3,0.3,0.3,1.0));
def run():
pygame.init()
screen=pygame.display.set_模式(屏幕大小,HWSURFACE | OPENGL | DOUBLEBUF)
调整大小(*屏幕大小)
init()
clock=pygame.time.clock()
立方体=立方体((0.0,0.0,0.0),(.5,5,7))
x_角=-30。
y_角度=60。
切换=真
尽管如此:
时间。睡眠(1)
如果切换:
toggle=False
glDisable(GLU照明)
其他:
切换=真
glEnable(德国劳埃德大学照明)
然后=pygame.time.get_ticks()
对于pygame.event.get()中的事件:
如果event.type==退出:
返回
如果event.type==KEYUP和event.key==K_ESCAPE:
返回
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
glPushMatrix()
glRotate(浮动(x_角),1,0,0)
glRotate(浮动(y_角度),0,1,0)
cube.render()
GLPOP矩阵()
pygame.display.flip()
类多维数据集(对象):
定义初始(自身、位置、颜色):
self.position=位置
self.color=颜色
面数=6
顶点=[(-1.0,-0.25,0.5),
( 1.0, -0.25,  0.5),
( 1.0, -0.25, -0.5),
(-1.0,-0.25,-0.5),#底部y0
法线=[(0.0,-1.0,0.0),#底部
(0.0,1.0,0.0),#顶部
(-1.0,0.0,0.0),#左
(+1.0,0.0,0.0),#对
(0.0,0.0,-1.0),#返回
(0.0,0.0,+1.0)]#前
顶点指数=[(0,1,2,3),#底部
(4,5,6,7),#顶部
(0,3,7,4),#左
(1,2,6,5),#对
(2,6,7,3),#返回
(0,1,5,4)]#前面
def渲染(自):
然后=pygame.time.get_ticks()
glColor(self.color)
顶点=自身顶点
glBegin(GLU四边形)
对于xrange中的面号(self.num\u面):
glNormal3dv(自法线[面号])
v1,v2,v3,v4=自顶点索引[面编号]
glVertex(顶点[v1])
glVertex(顶点[v2])
glVertex(顶点[v3])
glVertex(顶点[v4])
格伦德()
如果名称=“\uuuuu main\uuuuuuuu”:
运行()

我对python上的OpenGL不是很有经验,但您是否启用了任何形式的阴影,如阴影贴图?您错过了所有与材质属性相关的调用,您只设置了光源的环境项。也许这有帮助:@rabbi76是的。没有答案,所以我将其删除并移动到计算机graphics SE。在那里呆了几个星期后,仍然没有答案,我把它移回了这里。试图避免交叉发布。如果这是一个驱动程序问题,我可能不是唯一一个看到它的人,我希望找到遇到类似行为的人,并能建议如何解决它。谢谢!@BDL谢谢。根据这里的评论在其他计算机上的一些检查,以及我最初获得此脚本的网站上的信息,这种奇怪的模式似乎不会出现在其他人的计算机上。好的,我将“深入研究”然后尝试添加一个真实的材质和/或着色器,看看这是否会消失。我的机器上似乎无法运行GLUT,但您的非GLUT早期版本在Windows 10上确实为我提供了您的工件,因此它不是您的计算机所独有的!我可以通过更改
glupperspective
zNear
参数来处理工件。我不能想象一下你的
resize
方法中发生了一些有趣的事情,但还不太确定是什么。。。
#!/usr/bin/python

import pygame
# import urllib
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from pygame.locals import *
import time
import numpy as np

SCREEN_SIZE = (800, 600)

def resize(width, height):
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width) / height, 0.001, 10.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0.0, 1.0, -5.0,
              0.0, 0.0, 0.0,
              0.0, 1.0, 0.0)

def init():
    glEnable(GL_DEPTH_TEST)
    # The following don't seem to have any effect, so I've commented out
    # glClearColor(0.0, 0.0, 0.0, 0.0)
    # glShadeModel(GL_SMOOTH)
    # glEnable(GL_BLEND)
    # glEnable(GL_POLYGON_SMOOTH)
    # glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)
    glEnable(GL_COLOR_MATERIAL)
    glCreateShader(GL_VERTEX_SHADER)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glLightfv(GL_LIGHT0, GL_AMBIENT, (0.3, 0.3, 0.3, 1.0));

def run():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE | OPENGL | DOUBLEBUF)
    resize(*SCREEN_SIZE)
    init()
    clock = pygame.time.Clock()

    x_angle = -30.
    y_angle =  60.

    toggle = True

    while True:
        time.sleep(1)
        if toggle:
            toggle = False
            glDisable(GL_LIGHTING)
        else:
            toggle = True
            glEnable(GL_LIGHTING)

        then = pygame.time.get_ticks()
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            if event.type == KEYUP and event.key == K_ESCAPE:
                return

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glPushMatrix()
        glRotate(float(x_angle), 1, 0, 0)
        glRotate(float(y_angle), 0, 1, 0)

        glutSolidCube(1.0)
        glColor(0.5, 0.5, 0.7)

        glPopMatrix()
        pygame.display.flip()

if __name__ == "__main__":
    run()
#!/usr/bin/python

import pygame
# import urllib
from OpenGL.GL import *
from OpenGL.GLU import *
from pygame.locals import *
import time
import numpy as np

SCREEN_SIZE = (800, 600)

def resize(width, height):
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width) / height, 0.001, 10.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0.0, 1.0, -5.0,
              0.0, 0.0, 0.0,
              0.0, 1.0, 0.0)

def init():
    glEnable(GL_DEPTH_TEST)
    # The following don't seem to have any effect, so I've commented out
    # glClearColor(0.0, 0.0, 0.0, 0.0)
    # glShadeModel(GL_SMOOTH)
    # glEnable(GL_BLEND)
    # glEnable(GL_POLYGON_SMOOTH)
    # glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)
    glEnable(GL_COLOR_MATERIAL)
    glEnable(GL_LIGHTING)   # this one
    glEnable(GL_LIGHT0)
    glLightfv(GL_LIGHT0, GL_AMBIENT, (0.3, 0.3, 0.3, 1.0));

def run():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE | OPENGL | DOUBLEBUF)
    resize(*SCREEN_SIZE)
    init()
    clock = pygame.time.Clock()
    cube = Cube((0.0, 0.0, 0.0), (.5, .5, .7))

    x_angle = -30.
    y_angle =  60.

    toggle = True

    while True:
        time.sleep(1)
        if toggle:
            toggle = False
            glDisable(GL_LIGHTING)
        else:
            toggle = True
            glEnable(GL_LIGHTING)

        then = pygame.time.get_ticks()
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            if event.type == KEYUP and event.key == K_ESCAPE:
                return

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glPushMatrix()
        glRotate(float(x_angle), 1, 0, 0)
        glRotate(float(y_angle), 0, 1, 0)
        cube.render()
        glPopMatrix()
        pygame.display.flip()

class Cube(object):

    def __init__(self, position, color):
        self.position = position
        self.color = color

    num_faces = 6

    vertices = [ (-1.0, -0.25,  0.5),
                 ( 1.0, -0.25,  0.5),
                 ( 1.0, -0.25, -0.5),
                 (-1.0, -0.25, -0.5), # bottom y<0
                 (-1.0,  0.25,  0.5),
                 ( 1.0,  0.25,  0.5),
                 ( 1.0,  0.25, -0.5),
                 (-1.0,  0.25,- 0.5) ] # top y>0

    normals = [ ( 0.0, -1.0,  0.0),  # bottom
                ( 0.0, +1.0,  0.0),  # top
                (-1.0,  0.0,  0.0),  # left
                (+1.0,  0.0,  0.0),  # right
                ( 0.0,  0.0, -1.0),  # back
                ( 0.0,  0.0, +1.0) ] # front

    vertex_indices = [ (0, 1, 2, 3),  # bottom
                       (4, 5, 6, 7),  # top
                       (0, 3, 7, 4),  # left
                       (1, 2, 6, 5),  # right
                       (2, 6, 7, 3),  # back
                       (0, 1, 5, 4) ]  # front


    def render(self):
        then = pygame.time.get_ticks()
        glColor(self.color)

        vertices = self.vertices

        glBegin(GL_QUADS)

        for face_no in xrange(self.num_faces):
            glNormal3dv(self.normals[face_no])
            v1, v2, v3, v4 = self.vertex_indices[face_no]
            glVertex(vertices[v1])
            glVertex(vertices[v2])
            glVertex(vertices[v3])
            glVertex(vertices[v4])
        glEnd()

if __name__ == "__main__":
    run()