【问题标题】:How to draw a filled envelop like a cone on OpenGL (using GLUT)?如何在OpenGL(使用GLUT)上绘制一个像圆锥体一样的填充信封?
【发布时间】:2010-09-19 06:28:13
【问题描述】:

我正在使用 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 是怎么可能的......但是对于任何闭合曲线如何做到这一点?

【问题讨论】:

  • 只是为了澄清 2D 锥体的东西......包络线是飞机在拦截(敌机)期间覆盖区域的图形解释......它类似于一个圆的扇区。 .我应该提到部门而不是..
  • 编辑 yoru 评论,因为它是它所属的地方。
  • 编辑了我原来的问题..因为我是stackoverflow的新手,我认为对原始问题的后续处理应该进入cmets..这是stackoverflow的工作原理吗?如果原始发帖人觉得要加入对话......他应该如何进行?通过 cmets/回答自己的问题或编辑问题

标签: c++ opengl glut freeglut


【解决方案1】:

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

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

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

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

【讨论】:

  • 请注意,您不需要多个 glColor3f() 语句。 OpenGL是一个状态机,状态是保留的。所以一个 glColor3f() 语句就足够了。
  • 谢谢你 mstrobl,这真的是我想要的...你的解决方案让我很开心!
【解决方案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);

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

【讨论】:

  • 我不记得那些混合参数了。
【解决方案3】:

既然你再次澄清了你的问题是要一个馅饼:也有一种简单的方法可以使用 opengl 原语来绘制它:

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

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

平面是 GL_CLIPPLANE0 到 GL_CLIPPLANEn,方程是正常形式的平面方程(ax + by + c*z + d = 0 意味着方程将保存值{ a, b, c, d }。请注意,这些是双精度数而不是浮点数。

【讨论】:

    【解决方案4】:

    我记得有一个子程序。不过自己做也不太难。

    但我不理解 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(vpi)*r 其中 (x,y) 是结果顶点, r 是半径,三角函数作用于辐射,而不是度数。 (如果他们使用度数,请将 pi 替换为 180)

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

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

    【讨论】:

      【解决方案5】:

      关于颜色的编辑:

      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 要绘制哪些元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 2016-05-21
        相关资源
        最近更新 更多