невозможно отобразить сферу без использования gluSphere()

Я пытаюсь отобразить сферу без использования функции gluSphere(). Но этот код не отображает ни одной сферы. Я не могу выяснить, где именно ошибка.

import sys
import math
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import pygame


user_theta = 0
user_height = 0

def draw(radius,lats,longs) :
    for i in range(0,lats):
        lat0 = math.pi*(-0.5 + (i-1)/lats)
        z0   = math.sin(lat0)
        zr0 = math.cos(lat0)

        lat1 = math.pi*(-0.5 + i/lats)
        z1 = math.sin(lat1)
        zr1 = math.cos(lat1)

        glColor3f(0.0,0.0,1.0)
        glBegin(GL_QUAD_STRIP)
        for j in range(0,longs):
            lng = 2*math.pi*(j-1)/longs
            x=  math.cos(lng)
            y = math.sin(lng)

            glNormal3f(x * zr0, y * zr0, z0)
            glVertex3f(x * zr0, y * zr0, z0)
            glNormal3f(x * zr1, y * zr1, z1)
            glVertex3f(x * zr1, y * zr1, z1)
        glEnd()

        glFlush()

def display() :
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glColor3f(1.0, 1.0, 1.0)
    glShadeModel(GL_SMOOTH)
    draw(1.0, 10, 10)
    glutSwapBuffers()

def computeLocation():
        x = 2 * math.cos(user_theta)
        y = 2 * math.sin(user_theta)
        z = user_height
        d = math.sqrt(x * x + y * y + z * z)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        #glFrustum(-d * 0.5, d * 0.5, -d * 0.5, d * 0.5, d - 1.1, d + 1.1)
        #gluLookAt(x, y, z,  0, 0, 0,  0, 0, 1)
        gluOrtho2D(0.0, 640.0, 0.0, 480.0)

def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    computeLocation()




glutInit(sys.argv)
glutInitDisplayMode (GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize (500, 500)
glutInitWindowPosition (100, 100)
glutCreateWindow ('ROBOT')
init ()
glutDisplayFunc(display)
##glutReshapeFunc(reshape)
##glutKeyboardFunc(keyboard)
glutMainLoop()

person user3049348    schedule 18.04.2014    source источник
comment
Еще раз: похоже, вы запускаете glFlush() для каждого фрагмента вашей сферы. Убери это. Для этого примера вообще нет необходимости вызывать glFlush().   -  person AudioGL    schedule 19.04.2014
comment
удалил, но код все равно не работает   -  person user3049348    schedule 19.04.2014


Ответы (2)


Я вижу здесь пару проблем. Хотя я не использовал python для такого кода, я считаю, что он дает целочисленный результат, когда вы делите два целых числа, как и большинство языков программирования. Внимательно посмотрите на следующую строку и пару других подобных строк:

lat0 = math.pi*(-0.5 + (i-1)/lats)

Деление (i-1)/lats всегда будет давать 0, в результате чего все ваши полигоны будут вырожденными, и ничего не будет нарисовано.

Другая основная проблема - ваш диапазон координат. Ваш вызов gluOrtho2D устанавливает диапазоны координат (0..640) и (0..480). Но ваши координаты находятся в диапазоне (-1..1). Таким образом, вся ваша геометрия заканчивается примерно на одном пикселе.

Удаление вызова gluOrtho2D и добавление приведения типа для выполнения делений в float дает мне синюю и в основном круглую форму. Это с кодом, преобразованным в C++, в моей системе не было этих модулей Python.

В коде больше ошибок. Например, ваш первый цикл начинает индекс с 0, но затем вычитает один из индекса, чтобы вычислить первый угол. Но я уверен, что вы сможете решить оставшиеся проблемы, как только у вас будет что-то отрендерить.

person Reto Koradi    schedule 19.04.2014
comment
Спасибо. Вы были правы (i-1)/латы давали 0 из-за типа int. Приведение типов к float работало для меня. И изменил файл glOrtho2D. Фактически добавлен комментарий к glOrtho2D и удален комментарий из glFrustum и gluLookAt. - person user3049348; 19.04.2014

Я вижу место, где загружаются вершины и нормали, но не вижу никакого glDraw* вызова, без которого ничего не будет рендериться.

person Prabindh    schedule 18.04.2014
comment
Там нет вызова glDraw*(), потому что OP использует старый и устаревший конвейер с фиксированной функцией... - person vallentin; 18.04.2014
comment
Это первый раз, когда я слышу, что фиксированный конвейер функций не нуждается в вызове отрисовки. Фиксированный конвейер функций также нуждается в вызове отрисовки. Можете ли вы указать мне код, который не использует вызов glDraw* и может выполнять рендеринг, или спецификацию? - person Prabindh; 18.04.2014
comment
Или вы имеете в виду конвейер GL (не GLES)? - person Prabindh; 18.04.2014
comment
В конвейере с фиксированной функцией использование glBegin(...) и glEnd() не требует дальнейшего вызова glDraw*(...)! - person vallentin; 18.04.2014