OpenGL中的圆形曲面细分

3

我在理解这个函数的数学方面遇到了困难。我想听听这里所写公式(特别是什么是切线和径向因子)背后的逻辑,这些公式用于在OpenGL中创建点,以后(当将vec3数组发送到函数时)形成一个圆。

void doTesselate(const Arc& arc, int slices, std::vector<glm::vec3>& vertices)
{
  double dang = (arc.endAngle() - arc.startAngle()) * Deg2Rad;

  double radius = arc.radius();
  double angIncr = dang / slices;

  double tangetial_factor = tan(angIncr);
  double radial_factor = 1 - cos(angIncr);

  double startAngle = arc.startAngle() * Deg2Rad;
  const glm::vec3& center = arc.center();

  double x = center.x - radius * cos(startAngle);
  double y = center.y - radius * sin(startAngle);

  ++slices;
  for (int ii = 0; ii < slices; ii++) {
    vertices.push_back(glm::vec3(x, y, center.z));

    double tx = center.y - y;
    double ty = x - center.x;

    x += tx * tangetial_factor;
    y += ty * tangetial_factor;

    double rx = center.x - x;
    double ry = center.y - y;

    x += rx * radial_factor;
    y += ry * radial_factor;
  }
}

你在哪里找到这段代码的?这是来自哪里的,还有其他类似的吗? - undefined
1个回答

3

这个想法如下:

可视化

从当前点开始,您稍微朝切线方向前进,然后回到中心。

向量(tx, ty)是当前点处长度等于半径的切线。为了到达新角度,您必须沿着切线移动tan(angle) * radiusradius已经并入切向量中,而tan(angle)则是tangetial_factor(您可以直接从切线的定义中获得)。

之后,(rx, ry)是指向中心的向量。该向量的长度为l

cos(angle) = radius / l
l = radius / cos(angle)

我们需要找到这个向量的一个倍数m,使得修正后的点再次位于给定半径的圆上。如果我们只检查长度,那么我们要找到:
target distance = current distance    - m * length of (rx, ry)
         radius = radius / cos(angle) - m * radius / cos(angle)
              1 = (1 - m) / cos(angle)
     cos(angle) = 1 - m
 1 - cos(angle) = m

这个倍数正好是radial_factor(向中心移动以进入圆的距离)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接