【问题标题】:How to create outline如何创建大纲
【发布时间】:2021-10-28 13:20:33
【问题描述】:

我有一组点,它们是一条线的形状。

我们如何创建与当前点集有偏移距离的新点集,并使用 GL_TRIANGLE_STRIP 我们可以创建多边形形状。

这是我当前的代码,但我无法从中得到任何有意义的结果。

// outlineVertices are existing set of points from which we would generate the offsetPoints

for (int i = 0; i < outlineVertices.size() - 3 ; i += 3) {
        finalVertices.push_back(outlineVertices[i]);
        finalVertices.push_back(outlineVertices[i + 1]);
        finalVertices.push_back(outlineVertices[i + 2]);        

        glm::vec3 point1 = glm::vec3(outlineVertices[i], outlineVertices[i + 1], outlineVertices[i + 2]);
        glm::vec3 point2 = glm::vec3(outlineVertices[i + 7], outlineVertices[i + 1 + 7], outlineVertices[i + 2 + 7]);
        glm::vec4 directionVector = GetPerpendicularVectorDirection(point1, point2);
    
        finalVertices.push_back(outlineVertices[i] - (directionVector.x * outlineWidth ));
        finalVertices.push_back(outlineVertices[i + 1] + (directionVector.y * outlineWidth));
        finalVertices.push_back(outlineVertices[i + 2]);
        finalVertices.push_back(outlineVertices[i + 3]);
        
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

glm::vec4 RectangleOutline::GetPerpendicularVectorDirection(glm::vec3 point1, glm::vec3 point2) {

    glm::vec3 Direction = glm::normalize(point1 - point2);
    float x, y;
    x = Direction.x;
    Direction.x = -y;
    Direction.y = x;
    return glm::vec4(Direction, 0);
}

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

    您必须计算两条线段之间的Miter joint。为此,您需要计算沿要连接的线段的向量。计算线段的归一化法向量。沿斜接关节的向量是法线向量的总和。 (您甚至可以在顶点着色器中执行此操作:OpenGL Line Width

    如果你有 3 个点(p1p2p3

    p1       p2
      +-----+
             \
              \
               +
                 p3
    

    那么p2中沿斜接关节的法线向量为:

    // vectors along the line
    glm::vec2 v12 = p2 - p1;
    glm::vec2 v23 = p3 - p2;
    
    // normalized normal vectors to the line segments
    glm::vec2 vn12 = glm::normlalize(glm::vec2(-v12.y, v12.x));
    glm::vec2 vn23 = glm::normlalize(glm::vec2(-v23.y, v23.x));
    
    // normalized vector along miter joint
    glm::vec2 vm2 = glm::normalize(vn12 + vn23);
    

    关节上的点(pa,pb)分别是:

              pa
        -----+
         p2 / \
      -----+    \
          / \
    -----+    \
      pb  \
            \
    
    float d = thickness / glm::dot(vm2, vn12);
    
    glm::vec2 pa = p2 + vm2 * d/2;
    glm::vec2 pb = p2 - vm2 * d/2;
    

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2016-06-09
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多