在PyOpenGL中包裹整个球体的纹理

时间:2017-12-20 20:34:06

标签: python opengl pyopengl

我复制了更正后的代码here,将我自己的纹理从太阳成像数据集应用到OpenGL球体上。在这样做时,我注意到纹理并没有完全包裹在球体周围 - 只有“前半部分” - 并且没有应用光照阴影(在该问题的答案中也很明显)。

如何修改代码以围绕整个球体包裹纹理?

这是纹理图像,它是360度经度x正弦(纬度)格式的数据(实际应该在应用于球体之前转换为经度x纬度,但这是一个细节...):

enter image description here

这是纹理贴图的结果,显示图像仅应用于前/可见半球:

enter image description here

1 个答案:

答案 0 :(得分:0)

要围绕球体包裹纹理,您必须在球体周围分布二次纹理坐标。这由gluNewQuadricgluQuadricTexturegluSphere提供:

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()        

查看预览:

enter image description here