无法不使用gluSphere()绘制球体

0 投票
2 回答
669 浏览
提问于 2025-04-18 03:16

我正在尝试不使用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()

2 个回答

-1

我看到有地方在上传顶点和法线,但没有看到任何glDraw*的调用,如果没有这个调用,什么都不会被渲染出来。

0

我看到这里有几个问题。虽然我没有用过Python写这种代码,但我相信在大多数编程语言中,两个整数相除时会得到一个整数结果。仔细看看下面这一行,还有几行类似的代码:

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

这里的 (i-1)/lats 计算结果总是会是0,这样你所有的多边形都会变得无效,什么都不会显示出来。

另一个主要问题是你的坐标范围。你调用的 gluOrtho2D 设置了坐标范围为 (0..640) 和 (0..480),但你的坐标范围却是 (-1..1)。所以你整个图形最后只会显示在大约一个像素的位置上。

如果去掉 gluOrtho2D 的调用,并且把计算改成浮点数,这样我就能看到一个蓝色的、基本上是圆形的图形。这是我把代码转换成C++后得到的,因为我的系统没有这些Python模块。

代码里还有更多的错误。例如,你的第一个循环是从0开始的,但在计算第一个角度时却从索引中减去1。不过我相信一旦你能渲染出一些东西,你就能找出剩下的问题。

撰写回答