【问题标题】:Draw 2D thick arc using polygon in OpenGL在 OpenGL 中使用多边形绘制 2D 粗圆弧
【发布时间】:2013-04-17 11:35:03
【问题描述】:

我想使用多边形绘制一个粗弧(类似于模拟表盘的彩色部分)。为此,我在多边形中添加了顶点,并且它在外圆周上工作正常,但它连接内圆周(凹面)的末端。

如果我在 Line 中添加这些顶点,同样的逻辑可以正常工作,但这会创建一个空/未填充的弧。

我添加顶点的逻辑是:

    for( float i = m_segmentVertex.size() - 1; i < vCount; i++ )
        {
            float x1 = (m_segmentVertex[ i ].x ) * cosA - m_segmentVertex[ i ].y * sinA;
            float y1 = (m_segmentVertex[ i ].x ) * sinA + m_segmentVertex[ i ].y * cosA;
            addVertex( vec3( x1, y1, 0.0f ) );
        }

【问题讨论】:

    标签: c++ opengl polygon shapes


    【解决方案1】:

    请注意,GL_POLYGON 仅适用于凸多边形。

    您必须对凹多边形进行三角剖分。

    【讨论】:

    • 对于不相交的凹多边形也是如此。因为在我的情况下,顶点不相交(我按顺序添加它们)
    【解决方案2】:

    尝试使用三角扇并将表盘的中心作为第一个点。 可能 addVertex( vec3( 0.0f, 0.0f, 0.0f ) );在你的循环之前。

    我还建议将 i 设为 int 或 unsigned int,这里的浮点数没有意义。

    【讨论】:

      【解决方案3】:

      这就是我通过三角剖分动态创建多边形的方式:

      //create thick colored segments
      void CreateArcMesh( float sAngle, float eAngle, vec4 color, int thickness, int radius )
      {
          ObjectMeshDynamic meshObj = new ObjectMeshDynamic();
          vec3 vertex[0];
          float dAngle = ( ( eAngle - sAngle ) / ( VERTEX_COUNT / 2.0f ) );
          float cosA = cos( DEG2RAD * dAngle );
          float sinA = sin( DEG2RAD * dAngle );
      
          meshObj.setMaterial( "material_base", "*" );
          meshObj.setProperty( "surface_base", "*" );
          meshObj.setMaterialParameter( "diffuse_color", color, 0 );
          //Add the material on both side as the indices for Triangle strip start from last vertex added
          Material material = meshObj.getMaterialInherit(0);
          material.setTwoSided( 1 );
          meshObj.addTriangleStrip( VERTEX_COUNT + 2 );
      
          vec3 startPos = vec3( radius * cos( DEG2RAD * sAngle ), radius * sin( DEG2RAD * sAngle ), 0.0f );
          vertex.append( startPos );
      
          vec3 secondPos = vec3( ( radius - thickness ) * cos( DEG2RAD * sAngle ), ( radius - thickness ) * sin( DEG2RAD * sAngle ), 0.0f );
          vertex.append( secondPos );
      
          float x1 = startPos.x * cosA - startPos.y * sinA;
          float y1 = startPos.x * sinA + startPos.y * cosA;
          vertex.append( vec3( x1, y1, 0.0f ) );
      
          x1 = secondPos.x * cosA - secondPos.y * sinA;
          y1 = secondPos.x * sinA + secondPos.y * cosA;
          vertex.append( vec3( x1, y1, 0.0f ) );
      
          forloop( int k = 0 ; VERTEX_COUNT + 2 )
          {
              x1 = ( vertex[ vertex.size() - 2 ].x ) * cosA - vertex[ vertex.size() - 2 ].y * sinA;
              y1 = ( vertex[ vertex.size() - 2 ].x ) * sinA + vertex[ vertex.size() - 2 ].y * cosA;
      
              vertex.append( vec3( x1, y1, 0.0f ) );
              meshObj.addVertex( vertex[k] );
          }
      
          vertex.clear();
          meshObj.updateBounds();
          meshObj.flush();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        • 2017-12-07
        • 2013-02-04
        • 1970-01-01
        • 2018-09-29
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多