我复制了正确的代码here,将我自己的纹理从太阳成像数据集应用到OpenGL球体上。在这样做的过程中,我注意到纹理并没有完全包裹球体--只是“前半部分”--并且没有应用光照阴影(在该问题的答案中也很明显)。如何修改代码以将纹理包裹在“整个”球体周围?下面是纹理图像,它是360度经度x正弦(纬度)格式的数据(实际上,在应用到球体之前,应该将其转换为经度x纬度,但这是一个细节...):
这是纹理Map的结果,显示图像仅应用于前/可见半球:
ou6hu8tu1#
要将纹理环绕在球体上,您必须将纹理坐标以二次方式分布在球体上。这由gluNewQuadric、gluQuadricTexture和gluSphere提供:
gluNewQuadric
gluQuadricTexture
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()
请参阅预览:
另请参阅Immediate mode and legacy OpenGL
1条答案
按热度按时间ou6hu8tu1#
要将纹理环绕在球体上,您必须将纹理坐标以二次方式分布在球体上。这由
gluNewQuadric
、gluQuadricTexture
和gluSphere
提供:请参阅预览:
另请参阅Immediate mode and legacy OpenGL