【问题标题】:Texture wrapping an entire sphere in PyOpenGL在 PyOpenGL 中包裹整个球体的纹理
【发布时间】:2018-06-03 11:34:56
【问题描述】:

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

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

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

这是纹理映射的结果,表明图像仅应用于前/可见半球:

【问题讨论】:

  • 你的意思是你想要一个透明的球体?如果不是,那么渲染隐藏的一半有什么意义?
  • @Ripi2:否 - 请参阅原始问题中的说明。我明白你关于“渲染隐藏的一半”的观点,但这里的目标是最终有一个旋转球体,在球体上显示整个 360 度数据集。因此,开始的地方似乎是获取整个 3D 对象的纹理,然后进行交互式旋转。
  • 应用纹理是将图像的矩形包装成所需的形式,在您的情况下为圆形。你期待什么?
  • 期待纹理应用于 3D 球体,而不是圆形。
  • 如果你想要纹理的一部分,那么你必须计算显示的部分并使用glTexCoord传递它的坐标

标签: python opengl pyopengl opengl-compat


【解决方案1】:

要将纹理包裹在球体周围,您必须将纹理坐标以二次方分布在球体周围。这是由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()        

查看预览:

另见Immediate mode and legacy OpenGL

【讨论】:

  • 谢谢 - 这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2020-12-17
相关资源
最近更新 更多