Текстура, охватывающая всю сферу в PyOpenGL

Я скопировал исправленный код сюда, чтобы применить свою собственную текстуру из солнечного набор данных изображений на сферу OpenGL. При этом я заметил, что текстура не полностью обтекает сферу - только «переднюю половину» - и тень от освещения не применяется (это также очевидно в ответе на этот вопрос).

Как изменить код, чтобы обернуть текстурой всю сферу?

Вот изображение текстуры, которое представляет собой данные в формате долготы на 360 градусов x синуса (широты) (который на самом деле должен быть преобразован в долготу x широту перед применением к сфере, но это деталь ...):

введите здесь описание изображения

И вот результат наложения текстуры, который показывает, что изображение применяется только к передней / видимой полусфере:

введите здесь описание изображения


person TEB    schedule 20.12.2017    source источник
comment
Вы имеете в виду, что хотите прозрачную сферу? Если нет, то какой смысл отрисовывать скрытую половину?   -  person Ripi2    schedule 20.12.2017
comment
@ Ripi2: нет - см. Пояснение в исходном вопросе. Я понимаю вашу точку зрения о рендеринге скрытой половины, но здесь цель состоит в том, чтобы в конечном итоге получить вращающуюся сферу, которая показывает весь набор данных на 360 градусов на сфере. Таким образом, может показаться, что лучше всего начать с получения текстуры всего 3D-объекта, а затем продолжить интерактивное вращение.   -  person TEB    schedule 20.12.2017
comment
Применение текстуры превращает прямоугольник изображения в желаемую форму, в вашем случае это круг. Что вы ожидали?   -  person Ripi2    schedule 21.12.2017
comment
Ожидал, что текстура будет применена к трехмерной сфере, а не к кругу.   -  person TEB    schedule 21.12.2017
comment
Если вам нужна часть текстуры, вы должны вычислить отображаемую часть и передать ее координаты, используя glTexCoord   -  person Ripi2    schedule 21.12.2017


Ответы (1)


Чтобы обернуть текстуру вокруг сферы, вы должны распределить координаты текстуры квадратично вокруг сферы. Это обеспечивается gluNewQuadric, _ 2_ и _ 3_:

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

Смотрите превью:

См. Также Немедленный режим и устаревший OpenGL.

person Rabbid76    schedule 21.12.2017
comment
Спасибо - это именно то, что я искал. - person TEB; 22.12.2017