C++ 在openGL中计算球体导致圆未对齐

C++ 在openGL中计算球体导致圆未对齐,c++,opengl,C++,Opengl,我想在不使用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,doub

我想在不使用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)); 
        }
}
void绘图圈(双x、双y、双r)
{
glBegin(GLU四条带);

对于(int i=0;i而言,球体和圆形之间存在差异。圆形是二维形状,球体是其三维对应物。根据您的代码,您不是为球体生成点,而是为圆柱体生成点,因为z为常数,即-0.5。对于球体,所有3个点都应在范围内变化

如果中心位于(xc、yc、zc),则

  • x=>(0-xc)
  • y=>(0-yc)
  • z=>(0-zc)
球体可以用(u,v)参数定义

  • x=xo+r cos(θ)cos(φ)
  • y=yo+r cos(θ)sin(φ)
  • z=zo+rsin(θ)
你的点应该是x,y,z的有效组合。这意味着你的点可以使用3个循环生成。只有这样你才能拥有正确的球体点

此外,由于您使用的是四边形带,因此通过的阵列必须具有逆时针方向的点顺序,否则您将无法获得正确的形状


不要使用sin()&cos(),而应该使用球面方程:x*x+y*y+z*z=c*c我同意@simplevellow的观点,即另一种方法会更好。但让我向您展示代码中还有什么不是您想要的

您的主要问题是将度数传递给
sin
cos
函数,而不是弧度

最简单的补救方法是只定义一个函数
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));
然后,代码的结果如下所示:

减少采样点时,您可以看到发生了什么:

然后,您将看到您正在将环中的4个连续点连接到一个四边形,这不是您想要的,因此,如果您将
glBegin(GL\u quad\u STRIP);
更改为
glBegin(GL\u LINE\u STRIP)
您将看到:

如果再次将点数增加到360,则会出现以下情况:


现在你有了一个由圆组成的球体,但我假设你想要一个带有曲面的球体,让我们看看。

这显然是为OpenGL构建对象的错误方法。你应该阅读一些关于基础知识的不错的教程。有趣的事实:你知道一个
点\u平滑
'd
GL\u点
原语是用这是一个圆吗?它不是特别灵活,但它可能是有史以来画一个(填充的)圆的最简单的方法:P+1:线条条的妙用;迷幻球。