4

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

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

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

编辑1: 只是为了澄清2D锥体......包络是飞机在拦截期间(敌机)覆盖区域的图形解释......类似于圆形的扇区......我应该提到扇区反而..

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

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

Edit3: 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 怎么可能……但是对于任何闭合曲线如何做呢?

4

5 回答 5

2

我不确定您所说的“信封”是什么意思,但锥体是 glut 具有的原语:

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);

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

于 2008-10-26T12:24:01.960 回答
2

我记得有一个子程序。不过自己动手也不是什么难事。

但我不明白 2D 的东西。2D圆锥?不就是一个三角形吗?

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

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

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

首先只是细分一个标量值。从 [0-2] 范围开始。取中点 ((start+end)/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 是半径,三角函数适用于辐射,而不是度数。(如果他们使用度数,请将 pi 替换为 180)

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

编辑:关于着色问题。glColor4f,如果您希望几何图形的某些部分因颜色而异,您可以为顶点缓冲区本身中的每个顶点指定一种颜色。我现在不知道所有的 API 调用来做这件事,但是 opengl 中的 API 参考是很容易理解的。

于 2008-10-26T12:40:32.397 回答
2

既然你重新澄清了你的问题来要求一个馅饼:使用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 }。请注意,这些是双精度数而不是浮点数。

于 2008-10-27T12:43:29.893 回答
2

关于颜色的编辑:

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 调用后,这将影响您绘制的任何顶点的颜色、渲染的任何几何体的颜色——无论是 glu 的还是您自己的。如果您绘制带有顶点的面并在 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告诉 OpenGL 要绘制哪些元素。

于 2008-10-28T15:53:35.047 回答
2

在 Edit3 上:我理解你的问题的方式是你想让 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();

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

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

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

于 2008-10-29T14:10:23.850 回答