在 PyOpenGL 中包裹整个球体的纹理
Texture wrapping an entire sphere in PyOpenGL
我复制了更正后的代码 以将我自己的纹理从太阳成像数据集中应用到 OpenGL 球体上。在这样做的过程中,我注意到纹理并没有完全环绕球体 - 只有 "front half" - 并且没有应用照明阴影(在该问题的答案中也很明显)。
如何修改代码以将纹理包裹在 整个 球体周围?
这是纹理图像,它是 360 度经度 x 正弦(纬度)格式的数据(实际上应该在应用于球体之前将其转换为经度 x 纬度,但这是一个细节......):
下面是纹理映射的结果,显示图像仅应用于 front/visible 半球:
要围绕球体包裹纹理,您必须围绕球体二次分布纹理坐标。这是由 gluNewQuadric
, gluQuadricTexture
and gluSphere
:
提供的
class MyWnd:
def __init__(self):
self.texture_id = 0
self.angle = 0
def run_scene(self):
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400, 400)
glutCreateWindow(b'Minimal sphere OpenGL')
self.lightning()
self.texture_id = self.read_texture('data/worldmap1.jpg')
glutDisplayFunc(self.draw_sphere)
glMatrixMode(GL_PROJECTION)
gluPerspective(40, 1, 1, 40)
glutMainLoop()
def draw_sphere(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(math.cos(self.angle)*4, math.sin(self.angle)*4, 0, 0, 0, 0, 0, 0, 1)
self.angle = self.angle+0.04
glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBindTexture(GL_TEXTURE_2D, self.texture_id)
glEnable(GL_TEXTURE_2D)
qobj = gluNewQuadric()
gluQuadricTexture(qobj, GL_TRUE)
gluSphere(qobj, 1, 50, 50)
gluDeleteQuadric(qobj)
glDisable(GL_TEXTURE_2D)
glutSwapBuffers()
glutPostRedisplay()
查看预览:
我复制了更正后的代码
如何修改代码以将纹理包裹在 整个 球体周围?
这是纹理图像,它是 360 度经度 x 正弦(纬度)格式的数据(实际上应该在应用于球体之前将其转换为经度 x 纬度,但这是一个细节......):
下面是纹理映射的结果,显示图像仅应用于 front/visible 半球:
要围绕球体包裹纹理,您必须围绕球体二次分布纹理坐标。这是由 gluNewQuadric
, gluQuadricTexture
and gluSphere
:
class MyWnd:
def __init__(self):
self.texture_id = 0
self.angle = 0
def run_scene(self):
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400, 400)
glutCreateWindow(b'Minimal sphere OpenGL')
self.lightning()
self.texture_id = self.read_texture('data/worldmap1.jpg')
glutDisplayFunc(self.draw_sphere)
glMatrixMode(GL_PROJECTION)
gluPerspective(40, 1, 1, 40)
glutMainLoop()
def draw_sphere(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(math.cos(self.angle)*4, math.sin(self.angle)*4, 0, 0, 0, 0, 0, 0, 1)
self.angle = self.angle+0.04
glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBindTexture(GL_TEXTURE_2D, self.texture_id)
glEnable(GL_TEXTURE_2D)
qobj = gluNewQuadric()
gluQuadricTexture(qobj, GL_TRUE)
gluSphere(qobj, 1, 50, 50)
gluDeleteQuadric(qobj)
glDisable(GL_TEXTURE_2D)
glutSwapBuffers()
glutPostRedisplay()
查看预览: