Opengl 麸质函数背后的算法是什么?

Opengl 麸质函数背后的算法是什么?,opengl,glu,tesselation,Opengl,Glu,Tesselation,我问这个问题是出于好奇,因为性能原因,在使用GLU之前,我首先尝试实现这样一个算法 我研究过常用的算法(经常提到Delaunay、削耳),但我似乎无法理解GLU是如何一直如此出色地工作的 你们有关于这些主题的有趣论文或文章吗?旁边有: 这只是一个非常简短的概述。有相当多的问题 源代码本身中的附加文档 健壮的tesselation目标 细分算法基本上是一种2D算法。我们 最初将所有数据投影到平面中;我们的目标是稳健地 对投影数据进行细分。同样的拓扑细分也是如此 然后应用于输入数据 拓扑上,输出应始

我问这个问题是出于好奇,因为性能原因,在使用GLU之前,我首先尝试实现这样一个算法

我研究过常用的算法(经常提到Delaunay、削耳),但我似乎无法理解GLU是如何一直如此出色地工作的

你们有关于这些主题的有趣论文或文章吗?

旁边有:

这只是一个非常简短的概述。有相当多的问题 源代码本身中的附加文档

健壮的tesselation目标 细分算法基本上是一种2D算法。我们 最初将所有数据投影到平面中;我们的目标是稳健地 对投影数据进行细分。同样的拓扑细分也是如此 然后应用于输入数据

拓扑上,输出应始终为细分。如果 即使输入是稍微非平面的,也会有一些三角形 从某些角度看,必须背对,但目标 是为了尽量减少这种影响

该算法需要一定的清除输入数据的能力 以及其自身计算中的数值误差。一种方法 这是为了指定上面定义的公差,并清理 行扫描过程中的输入和输出。至少, 该算法必须处理重合的顶点,这些顶点与 边和重合边

算法的各个阶段
  • 求多边形法线N
  • 将顶点数据投影到平面上。它不需要垂直于法线,例如,我们可以投影到平面上
    垂直于其与N的点积为 最大的
  • 使用线扫描算法,将平面划分为x单调区域。任何一条垂直线与一个x-单调区域相交 最多一次间隔
  • 三角化x单调区域
  • 将三角形分成条带和扇形
  • 求法向量 求多边形法线的常用方法是计算有符号区域 当多边形沿三个坐标轴投影时。我们 不能这样做,因为轮廓可以有零面积,而不需要 堕落的(如领结)

    我们将平面拟合到顶点数据,忽略它们的连接方式 成等高线。理想情况下,这将是一个最小二乘拟合;然而 我们的目的正常的准确性并不重要。相反,我们 找到三个相距较远的顶点,并计算法线 到他们形成的三角形。选择顶点以使 三角形的面积至少是所有三角形中最大面积的1/sqrt(3)倍 使用输入顶点形成的三角形

    轮廓确实影响法线的方向;计算后 在正常情况下,我们检查有符号轮廓区域的总和是否为 非负数,必要时反转正常值

    投影顶点 我们将顶点投影到与三个顶点之一垂直的平面上 坐标轴。这有助于通过删除 原始输入数据和数据之间的转换步骤 由算法处理。投影还压缩输入 数据;投影后顶点之间的2D距离可能更小 比原始二维距离大。但是,通过选择坐标 轴与法线的点积最大时,压缩 系数最多为1/sqrt(3)

    尽管正常值的准确性并不那么重要(因为 我们垂直于一个坐标轴投影) 计算的鲁棒性很重要。例如,如果有多个顶点几乎位于一条直线上,并且有一个顶点V 它与直线很好地分开,那么我们的正常计算 应该包含V,否则结果将是垃圾

    垂直于多边形法线投影的优点是 计算出的交点将尽可能接近 他们的理想位置。要获得此行为,请定义TRUE_项目

    横扫 有三种数据结构:网格、事件队列和 边缘词典

    网格是一种“四边形”数据结构,用于记录网格的拓扑结构 电流分解;有关详细信息,请参见包含文件“mesh.h”

    事件队列仅保存所有顶点(原始顶点和计算顶点) 一个),这样我们就可以用 最小x坐标(以及其中具有最小y坐标的)

    “边字典”描述扫描的当前交点 与多边形的区域对齐。这只是一个订单 与扫描线相交的边,按其当前排列顺序排序 交叉。对于每一对边,我们存储有关 它们之间的单调区域——这些区域被称为“活动区域” (因为它们与当前扫描线相交)

    基本算法是从左向右扫描,处理每个 顶点。网格的处理部分(扫掠线的左侧)为 平面分解。当我们穿过每个顶点时,我们更新网格 和边缘字典,然后我们检查任何新相邻的 查看边是否相交

    顶点可以有任意数量的边。具有多条边的顶点可以 在合并顶点和相交点时创建 计算。对于未处理的顶点(扫描线右侧),这些 边在顶点周围没有特定的顺序;处理 顶点,拓扑顺序应与几何顺序匹配 订购

    顶点处理分为两个阶段:首先,我们处理 左向边(所有这些边当前都在边中 字典)。这包括: