我正在使用 freeglut 进行 opengl 渲染...

我需要绘制一个看起来像圆锥体(2D)的信封,必须填充一些颜色并应用一些透明度。

freeglut 工具包是否配备了这样的内置功能来绘制填充的几何图形(或一些技巧)?或者是否有其他一些 api 具有对填充几何图形的内置支持..

编辑1:只是为了澄清 2D 圆锥的事情......信封是对飞机在拦截(敌方飞机)期间覆盖区域的图形解释...类似于圆的扇区..我应该提到扇区..

并且 glutSolidCone 对我没有帮助,因为我想绘制一个填充的圆扇形...我已经完成了...剩下要做的就是用一些颜色填充它...如何在opengl中用颜色填充几何图形?

编辑2:发布到这个问题的所有答案都可以在某种程度上解决我的问题。但我肯定想知道一种如何用某种颜色填充几何图形的方法。假设我想绘制一个抛物线的包络...在这种情况下,就没有默认的 glut 函数来实际绘制填充的抛物线(或者有吗?)..所以概括这个问题......如何用某种纯色绘制自定义几何图形?

编辑3:mstrobl 发布的答案适用于 GL_TRIANGLES 但对于这样的代码:

glBegin(GL_LINE_STRIP);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

它绘制了一个正方形...仅绘制了一个有线正方形...我需要用蓝色填充它。

无论如何要做吗?

如果我为闭合曲线放置一些绘图命令..像馅饼一样..并且我需要用颜色填充它有没有办法使它成为可能...

我不知道 GL_TRIANGLES 怎么可能......但是对于任何闭合曲线如何做到这一点呢?

有帮助吗?

解决方案

在编辑3上:我理解你的问题的方式是你想要 OpenGL 绘制边框并且它们之间的任何内容都应该填充颜色。

你的想法是对的,但线带就是一条线,它没有任何面积。

但是,您可以将这些线相互连接以定义多边形。这将在每个顶点的基础上填充多边形的区域。调整您的代码:

glBegin(GL_POLYGON);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

但请注意,以这种方式绘制多边形有两个限制:

  • 多边形必须是凸多边形。
  • 这是一个缓慢的操作。

但我假设你只是想完成工作,这就能做到。对于未来,您可能会考虑仅对多边形进行三角测量。

其他提示

我不确定你所说的“信封”是什么意思,但是锥形是一种过剩的原则:

glutSolidCone(radius, height, number_of_slices, number_of_stacks)

用颜色填充它的最简单方法是用颜色绘制它。既然你想让它有点透明,你也需要一个alpha值:

glColor4f(float red, float green, float blue, float alpha)
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will
// mean no transparency, 0.0 total transparency. Call before drawing.

要半透明地渲染,必须启用混合。您必须设置要使用的混合功能。您可能会通过以下方式实现您想要做的事情。如果你想了解更多,请给我发表评论,我会寻找一些好的指示。但是这里有你的设置:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

在进行任何绘图操作之前,可能在程序初始化时调用它。 :)

因为你重新提出你的问题要求一个馅饼:使用opengl原语也有一种简单的方法来绘制它:

您可以使用gluSolidSphere()绘制实体球体。但是,由于您只想绘制其中的一部分,因此您只需将不需要的部分剪掉:

void glClipPlane(GLenum plane, const GLdouble * equation);

平面为GL_CLIPPLANE0至GL_CLIPPLANEn且方程为正常形式的平面方程(a x + b y + c * z + d = 0意味着方程将保持值 { a,b,c,d} 。请注意,这些是双打而不是花车。

我记得有一个子程序。但是你自己也不难做到。

但我不明白2D -thing。二维锥?这不只是一个三角形吗?

无论如何,这是一个在opengl中绘制圆锥的算法

首先取圆圈,均匀细分,以获得大量边缘。 现在选择圆的中心,从边到圆的中心制作三角形。然后在圆上选择一个点,并从边缘到该点制作三角形。

尺寸形状和方向取决于用于生成圆的值和两个点。每一步都很简单,不应该给你带来麻烦。

首先只是细分一个标量值。从[0-2] - 范围开始。取中点((开始+结束)/ 2)并用它分割范围。将值存储为成对。例如,细分一次应该给你:[(0,1),(1,2)]递归几次这样做,然后计算圆上的那些点。简单的三角函数,只需记住将值乘以π在继续之前。在此之后你有一定数量的边缘。 2 ^ n其中n是细分量。然后你可以通过给它们一个顶点更简单地把它们变成三角形。因此,三角形的数量最终为:2 ^(n + 1)。 (这些数量对于了解您是否使用固定大小的数组非常有用。

编辑:你真正想要的是馅饼。 (对不起,双关语)

渲染同样简单。您可以再次使用三角形。只需选择标量范围[-0.25 - 0.25],细分,投影到圆,然后生成一组三角形。

标量圆投影很简单:x = cos(v * pi) r,y = sin(v pi)* r其中(x,y)是得到的顶点, r是半径,三角函数对辐射而不是度数起作用。 (如果他们使用度数,用180替换pi)

使用顶点缓冲区或列表自行渲染。

编辑:关于着色问题。 glColor4f,如果您希望几何体的某些部分的颜色不同,您可以为顶点缓冲区本身的每个顶点指定一种颜色。我现在不知道所有的API调用,但是opengl中的API引用是可以理解的。

关于颜色的编辑:

OpenGL实际上是一台状态机。这意味着在绘制时使用当前材料和/或颜色位置。由于您可能不会使用材料,因此暂时忽略它。你想要颜色。

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)

在执行glColorXX调用之后,这将影响您绘制的任何顶点的颜色,即您渲染的任何几何体的颜色 - 无论是胶水还是您自己的颜色。如果绘制具有顶点的面并更改glVertex3f / glVertex2f调用之间的颜色,则会对颜色进行插值。

试试这个:

glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();

但是我已经指出了glColor4f,所以我假设你想要在每个顶点的基础上设置颜色。并且您想使用显示列表进行渲染。

就像你可以显示顶点列表一样,你也可以让它们有一个颜色列表:你需要做的就是启用颜色列表并告诉opengl列表所在的位置。当然,它们需要与顶点列表具有相同的装备(相同的顺序)。

如果你有

glEnableClientState(GL_VERTEX_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);

你应该这样添加颜色。他们不需要漂浮;事实上,你告诉它它应该是什么格式。对于每通道1个字节和4个通道(R,G,B和A)的颜色列表,请使用:

glEnableClientState(GL_VERTEX_ARRAY);   
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

编辑:忘记添加,然后你必须通过调用 glDrawElements

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top