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