C++ 在openGL中计算球体导致圆未对齐
我想在不使用gluSphere方法的情况下制作一个球体,并尝试使用此代码计算球体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
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平滑
'dGL\u点
原语是用这是一个圆吗?它不是特别灵活,但它可能是有史以来画一个(填充的)圆的最简单的方法:P+1:线条条的妙用;迷幻球。