我已经实现了一个三角形镶嵌着色器,如this网站上的示例所示。我如何确定对于定义的inter和outer镶嵌因子输出的面的总数?-它不会以任何方式影响我的程序,我只是想知道我的多边形/面计数。
inter
outer
k5ifujac1#
一个三角形的重心细分的三角形的数量(其中内部和外部细分相等)可以使用简单的递归来找到:
// Calculate number of triangles produced by barycentric subdivision (i.e. tessellation)// Where n is the level of detail lod and outer and inner level is always equalint calculateTriangles(int n) { if(n < 0) return 1; // Stopping condition if(n == 0) return 0; return ((2*n -2) *3) + calculateTriangles(n-2); // Recurse}
// Calculate number of triangles produced by barycentric subdivision (i.e. tessellation)
// Where n is the level of detail lod and outer and inner level is always equal
int calculateTriangles(int n) {
if(n < 0) return 1; // Stopping condition
if(n == 0) return 0;
return ((2*n -2) *3) + calculateTriangles(n-2); // Recurse
}
字符串
iqxoj9l92#
下面是三角形、四边形和直线的顶点数或面数的完整答案,基于内部层和外部层!我需要一个类似的答案,给定镶嵌和内部和外部细节级别(其中所有LOD可以不同)生成的顶点数。我解决了这个问题,并且没有进一步计算面的数量。对于三角形镶嵌,我的LOD语法是IL用于内部LOD,OL 0,OL 1和OL 2用于三条边的外部LOD。
Inner faces/triangles (based only on IL): if IL==1 -> inner faces = 0 if IL odd -> inner faces = 3/2*(IL-1)(IL-3)+1 if IL even -> inner faces = 6*(IL/2-1)^2 Outer faces/triangles if IL==1 -> outer faces = (OL0+OL1+OL2 == 3) ? 1 : OL0+OL1+OL2 else -> outer faces = 3*IL+OL0+Ol1+OL2-6 Total = Inner + Outer faces
Inner faces/triangles (based only on IL):
if IL==1 -> inner faces = 0
if IL odd -> inner faces = 3/2*(IL-1)(IL-3)+1
if IL even -> inner faces = 6*(IL/2-1)^2
Outer faces/triangles
if IL==1 -> outer faces = (OL0+OL1+OL2 == 3) ? 1 : OL0+OL1+OL2
else -> outer faces = 3*IL+OL0+Ol1+OL2-6
Total = Inner + Outer faces
字符串我知道--这些都是看起来很疯狂的方程。真正有帮助的一件事是认识到 * 任何 * 单调递增的级数的和,比如(7+9+11+13+15+17)可以计算为(num_elements/2*(first_element+last_element))。这就是平方的最终来源。如果有人关心顶点的数量:
Inner vertices: if IL==1 -> inner vertices = (OL0+OL1+OL2 == 3) ? 0 : 1 if IL odd -> inner vertices = (IL-1)^2 * 3/4 if IL even -> inner vertices = 3((IL/2)^2-IL/2) +1 Outer vertices = OL0+OL1+OL2 Total = Inner + Outer vertices (OL0+OL1+OL2)
Inner vertices:
if IL==1 -> inner vertices = (OL0+OL1+OL2 == 3) ? 0 : 1
if IL odd -> inner vertices = (IL-1)^2 * 3/4
if IL even -> inner vertices = 3((IL/2)^2-IL/2) +1
Outer vertices = OL0+OL1+OL2
Total = Inner + Outer vertices (OL0+OL1+OL2)
型下面是四边形的顶点数和三角形面数的答案。
Quad Vertices (LOD levels are IL0, IL1, OL0, OL1, OL2, OL3) Inner vertices: if IL0==IL1==1 but OL0+OL1+OL2+OL3>4 -> inner vertices = 1 else -> inner vertices = (IL0-1)*(IL1-1) Outer vertices = OL0+OL1+OL2+OL3 Total = Inner + Outer vertices Quad Faces (triangles) Outer ring faces = if IL0==IL1==OL0=OL1=OL2=OL3==1 -> 1 face total if IL0==IL1==1 but OL0+OL1+OL2+OL3>4 -> calc as if IL0=IL1=2 else OL0+OL1+OL2+OL3+2*IL0+2*IL1-8 Inner faces: if IL0<3 and IL1<3 -> 0 else 2*(IL0-2)*(IL1-2) Total = Inner + Outer i.e.: when IL0/IL1>2 -> OL0+OL1+OL2+OL3+2*IL0+2*IL1-8 + 2*(IL0-2)*(IL1-2)
Quad Vertices (LOD levels are IL0, IL1, OL0, OL1, OL2, OL3)
if IL0==IL1==1 but OL0+OL1+OL2+OL3>4 -> inner vertices = 1
else -> inner vertices = (IL0-1)*(IL1-1)
Outer vertices = OL0+OL1+OL2+OL3
Total = Inner + Outer vertices
Quad Faces (triangles)
Outer ring faces =
if IL0==IL1==OL0=OL1=OL2=OL3==1 -> 1 face total
if IL0==IL1==1 but OL0+OL1+OL2+OL3>4 -> calc as if IL0=IL1=2
else OL0+OL1+OL2+OL3+2*IL0+2*IL1-8
Inner faces:
if IL0<3 and IL1<3 -> 0
else 2*(IL0-2)*(IL1-2)
Total = Inner + Outer
i.e.: when IL0/IL1>2 -> OL0+OL1+OL2+OL3+2*IL0+2*IL1-8 + 2*(IL0-2)*(IL1-2)
型相对而言,等值线非常简单:
Isoline (LOD levels are OL0, OL1 - OL0 is missing top edge) num vertices = OL0*(OL1+1) num segments = OL0*OL1
Isoline (LOD levels are OL0, OL1 - OL0 is missing top edge)
num vertices = OL0*(OL1+1)
num segments = OL0*OL1
型哇,好长的方程式!希望对你有帮助!
p1tboqfb3#
图论的小技巧:如果你的图是平面的(像网格一样),你可以使用平面图的欧拉公式来删除一个(或多个)自由度:
V-E+F=2
字符串https://en.wikipedia.org/wiki/Planar_graph#Euler's_formula面的数量可以很容易地从图中的顶点和边的数量中获得。
F = 2+E-V
型以四边形曲面细分为例,我们可以简单地计算内部曲面细分中顶点、边和面的数量,即V=NM E=N(M-1)+M*(N-1)和F=(N-1)*(M-1),如果我们将四边形的外部也算作另一个面,则满足公式。x1c 0d1x的数据唯一的问题在于计算内部和外部面片之间的三角形,这与内部面片不同,可以是不规则的。有不同的方法来解决这个问题,但直观的方法是认识到条纹上的每个三角形都只有一条边位于内部或外部边界上。子网格中剩余的顶点和边与计数无关,除了包含必要的元素来平衡欧拉公式之外。把所有东西放回一起,并小心避免任何重复计算,我们得到了条纹的以下计数:
F0 = E0o + E0i = OL0 + IL0-2F1 = E1o + E1i = OL1 + IL1-2F2 = E2o + E2i = OL2 + IL0-2F3 = E3o + E3i = OL3 + IL1-2
F0 = E0o + E0i = OL0 + IL0-2
F1 = E1o + E1i = OL1 + IL1-2
F2 = E2o + E2i = OL2 + IL0-2
F3 = E3o + E3i = OL3 + IL1-2
型这些加起来就是:
Fo = OL0 + OL1 + OL2 + OL3 + 2*IL0 + 2*IL1 - 8
型带中的面,加上:
Fi = (IL0-2)*(IL1-2)
型四边形在内部,或者如果我们使用三角形,则加倍。
bxpogfeg4#
好吧,当我处理内部和外部镶嵌时,这帮助我理解了如何计数它们。非常合理和直接的解释。:)http://prideout.net/blog/?p=48http://prideout.net/blog/?p=49的
4条答案
按热度按时间k5ifujac1#
一个三角形的重心细分的三角形的数量(其中内部和外部细分相等)可以使用简单的递归来找到:
字符串
iqxoj9l92#
下面是三角形、四边形和直线的顶点数或面数的完整答案,基于内部层和外部层!
我需要一个类似的答案,给定镶嵌和内部和外部细节级别(其中所有LOD可以不同)生成的顶点数。我解决了这个问题,并且没有进一步计算面的数量。
对于三角形镶嵌,我的LOD语法是IL用于内部LOD,OL 0,OL 1和OL 2用于三条边的外部LOD。
字符串
我知道--这些都是看起来很疯狂的方程。真正有帮助的一件事是认识到 * 任何 * 单调递增的级数的和,比如(7+9+11+13+15+17)可以计算为(num_elements/2*(first_element+last_element))。这就是平方的最终来源。
如果有人关心顶点的数量:
型
下面是四边形的顶点数和三角形面数的答案。
型
相对而言,等值线非常简单:
型
哇,好长的方程式!
希望对你有帮助!
p1tboqfb3#
图论的小技巧:如果你的图是平面的(像网格一样),你可以使用平面图的欧拉公式来删除一个(或多个)自由度:
字符串
https://en.wikipedia.org/wiki/Planar_graph#Euler's_formula
面的数量可以很容易地从图中的顶点和边的数量中获得。
型
以四边形曲面细分为例,我们可以简单地计算内部曲面细分中顶点、边和面的数量,即V=NM E=N(M-1)+M*(N-1)和F=(N-1)*(M-1),如果我们将四边形的外部也算作另一个面,则满足公式。
x1c 0d1x的数据
唯一的问题在于计算内部和外部面片之间的三角形,这与内部面片不同,可以是不规则的。
有不同的方法来解决这个问题,但直观的方法是认识到条纹上的每个三角形都只有一条边位于内部或外部边界上。
子网格中剩余的顶点和边与计数无关,除了包含必要的元素来平衡欧拉公式之外。
把所有东西放回一起,并小心避免任何重复计算,我们得到了条纹的以下计数:
型
这些加起来就是:
型
带中的面,加上:
型
四边形在内部,或者如果我们使用三角形,则加倍。
bxpogfeg4#
好吧,当我处理内部和外部镶嵌时,这帮助我理解了如何计数它们。非常合理和直接的解释。:)
http://prideout.net/blog/?p=48
http://prideout.net/blog/?p=49的