我关心的是二次贝塞尔三角形,我试图对其进行镶嵌以渲染它们。
我已经设法通过递归地细分三角形来实现这一点,就像在维基百科页面中描述的那样。虽然我想获得更精确的细分。问题是我会得到太少或太多的细分,因为在该算法的每次迭代中表面的数量都会翻倍。
特别是我需要一个自适应镶嵌算法,它允许我定义边缘的段数量。我不确定我是否能做到这一点,所以我也想听听统一镶嵌技术。
最难的麻烦我在计算贝塞尔曲面上的点的法线时遇到了麻烦,我不确定我是否需要,但一直在尝试解决。
我关心的是二次贝塞尔三角形,我试图对其进行镶嵌以渲染它们。
我已经设法通过递归地细分三角形来实现这一点,就像在维基百科页面中描述的那样。虽然我想获得更精确的细分。问题是我会得到太少或太多的细分,因为在该算法的每次迭代中表面的数量都会翻倍。
特别是我需要一个自适应镶嵌算法,它允许我定义边缘的段数量。我不确定我是否能做到这一点,所以我也想听听统一镶嵌技术。
最难的麻烦我在计算贝塞尔曲面上的点的法线时遇到了麻烦,我不确定我是否需要,但一直在尝试解决。
自适应细分。这有很多算法。但这里有一个:
def line_angle((x0,y0),(x1,y1)):
return atan2(y1-y0,x1-x0)
def adaptive_bezier(p0,p1,p2,lev=32):
p01 = midpoint(p0,p1)
p12 = midpoint(p1,p2)
m = midpoint(p01, p12)
da = abs(line_angle(p0,p1) - line_angle(p1,p2))
if da <= max_tolerance or lev <= 0:
yield m
else:
for p in adaptive_bezier(p0,p01,m,lev-1): yield p
for p in adaptive_bezier(m,p12,p2,lev-1): yield p
对于以这种方式镶嵌三角形来说,这件事很复杂。您需要根据边缘贝塞尔曲线的角度来驱动自适应 tesselator 算法。在细分时,您的三角形可以通过三种独特的方式进行分割。
2 edges one edge 3 edges
-------- --------- --------
\ ...// \ | / \ / \ /
\/___/ \ | / \____/
\ / \ | / \ /
\/ \|/ \/
为这些模式定义曲面细分结果,您就很好了。维基百科文章中仅描述了具有一个边缘的镶嵌。
通过研究一个边缘分裂的情况,可以获得另外两个细分结果。
“2 条边”可以通过拆分第一个边然后另一个边直接获得。
“3 个边缘”需要更多的工作才能找到。但是您可以看到“2 个边缘”案例为您带来了一个中间边缘。在二次贝塞尔三角形的情况下,它是出现在那里的菱形的平均总和:
-------- /\
\ / / \
\____/ -____-
\ / \ /
\/ \/