-1

我想制作一个没有 gluSphere 方法的球体,我尝试用这段代码计算球体

void drawCircle(double x, double y, double r)
{
    glBegin( GL_QUAD_STRIP );

    for(int i=0;i<=360;i++){
        glVertex3d(x+sin(i)*r,y+cos(i)*r,-5.0);
    }
    glEnd();
}
void drawSphere(double x,double y,double r){
    glLoadIdentity();
    glColor3d(1,0,0);
        for(int j=0;j<180;j++){
            glTranslated(0,0,r/180);
            drawCircle(x,y,r*sin(j)); 
        }
}

结果是这样的

在此处输入图像描述

但结果是我做的圆圈没有对齐。是否有任何适当的计算,所以我可以使球体正确?

4

2 回答 2

4

球体和圆之间是有区别的。Circle 是 2 维形状,而 Sphere 是它的 3D 对应物。从您的代码中,您不是为球体生成点,而是为圆柱体生成点,因为 z 是恒定的,即 -0.5。对于 Sphere,所有 3 都应在范围内变化

如果中心在(xc, yc, zc)那么

  • x => (0-xc) < x < (0+xc)
  • y => (0-yc) < y < (0+yc)
  • z => (0-zc) < z < (0+zc)

球体可以根据 (u,v) 参数化定义

  • x = xo + r cos(θ) cos(phi)
  • y = yo + r cos(theta) sin(phi)
  • z = zo + r sin(theta)

您的积分应该是 x、y z 的有效组合。这意味着您的积分可以使用 3 个循环生成。只有这样你才会有正确的球体点。

此外,由于您使用的是 QuadStrip,因此您传递的数组必须具有逆时针方向的点顺序,否则您将无法获得正确的形状。

而不是使用 sin() & cos() 你应该使用球体方程:x*x + y*y + z*z = c*c

于 2013-09-17T15:34:04.693 回答
3

我同意@SimpleFellow 的观点,另一种方法会更好。但是,让我向您展示在您的代码中还有什么不是您想要的。

您的主要问题是您将度数传递给sinandcos函数而不是弧度。

最简单的补救措施是只定义一个deg2rad或多个函数,例如

double sind(double val){return std::sin(val*M_PI / 180.0);}
double cosd(double val){return std::cos(val*M_PI / 180.0);}

此外,环之间的距离应该是

//glTranslated(0,0,r/180); //equidistance will give you something like a pyramid
glTranslated(0, 0, r*(cosd(j)-cosd(j-1));

那么您的代码的结果如下所示:

四边形 360 点

当您减少样本点时,您会看到发生了什么:

四边形 16 点

然后你会看到你将一个环中的 4 个连续点连接到一个四边形,这不是你想要的,所以如果你改变glBegin( GL_QUAD_STRIP );glBegin( GL_LINE_STRIP )会看到这个:

线带 16 点

如果您再次将点数增加到 360,那么您将拥有:

线带 360 点

所以现在你有一个由圆圈组成的球体,但我假设你想要一个有表面的球体,看看这个问题

于 2013-09-18T08:18:51.443 回答