具有权重的 OpenGL B 样条未正确呈现



我正在用OpenGL中的B样条线做一个项目。

据我所知,B样条本身是有效的,但我也想在1-10的范围内为我的控制点添加一些权重,以使样条更接近权重更高的点。

我现在遇到的问题是,当我在一个点上添加一些权重时,样条总是远远超过该点,而不仅仅是靠近一点。

现在,到目前为止,我尝试的是按照本文中描述的方式实现我的程序。 本文的最后一个主题描述了如何使用权重实现 B 样条曲线,但它对我不起作用。

这就是我向控制点添加权重的方式。

我通过鼠标单击创建一个控制点,并以值 1 作为第三个矢量参数添加权重

def onMouseButton(win, button, action, mods):
global degree
global M
global currentpoint
global shift
global yposition
shift = 0
if button == glfw.MOUSE_BUTTON_LEFT:
if action == glfw.PRESS:
p = np.array(glfw.get_cursor_pos(win))
p[0] = (p[0] - WIDTH/2) / (WIDTH/2)
p[1] = 1 - (p[1] / (HEIGHT/2))
p = np.append(p, 1.0)
controlpoints.append(p)

然后,我将选定的控制点除以其旧权重以将其设置回 1 然后我将点乘以其新的权重。 当前点是我选择添加权重的点。

def onMouseMove(win, xpos, ypos):
global shift
global currentpoint
global yposition
if shift == 1:
for x in controlpoints:
if np.array_equal(x, currentpoint):
weight = yposition - ypos
if weight >= 10:
weight = 10
if weight <= 1:
weight = 1
x[0] /= x[2]
x[1] /= x[2]
x[2] = weight
x[0] *= x[2]
x[1] *= x[2]
calcSpline()

这就是我尝试渲染样条的方式 对于渲染,我想忽略增加的权重。

def render():
weightpoints = []
for x in controlpoints:
a = x[0]/x[2]
b = x[1]/x[2]
element = [a, b]
element = np.array(element)
weightpoints.append(element)
# draw black control polygon
draw(GL_LINE_STRIP, weightpoints, [0.0, 0.0, 0.0])
#draw red control points
draw(GL_POINTS, weightpoints, [1.0, 0.0, 0.0])
#draw red control points
draw(GL_LINE_STRIP, splinepoints, [0.0, 0.0, 1.0])
# recalculate spline curve
calcSpline()
# draw blue bspline deboor points
draw(GL_POINTS, splinepoints, [0.0, 1.0, 1.0])
def draw(mode, points, color):
# draws objects
glPointSize(3)
glEnable(GL_POINT_SMOOTH)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glBegin(mode)
glColor(color[0], color[1], color[2])
for p in points:
glVertex2f(p[0], p[1])
glEnd()

更新

这就是我计算样条的方式。deboor alogrithm 和 findR 函数应该是正确的 scince 我从讲座箔纸中得到了它们。

def calcSpline():
# calculates spline curve with deboor
calcKnotVector()
del splinepoints[:]
if len(controlpoints) >= degree:
t = 0
while t <= knotvector[-1]:
r = findR(t)
b = deBoor(controlpoints, knotvector, t, r, degree - 1)
splinepoints.append(b)
t += 1 /float(M - 1)
t -= 0.0000000001

我预计样条曲线会更接近所选点,但它总是在它上方增长。

更新

多亏了Nico Schertler,我让程序运行和工作。 我做错的是创建和处理 3D 控制点,包括它们的权重,但我再次将这些点分解出来,将我的 3D 矢量转换为 2D 点,这是我犯的错误。

这是重做的绘制函数:

def draw(mode, points, color):
# draws objects
glPointSize(5)
glLineWidth(3)
glEnable(GL_POINT_SMOOTH)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glBegin(mode)
glColor(color[0], color[1], color[2])
for x, y, w in points:
glVertex2f(x / w, y / w)
glEnd()

其余代码没有更改。

:)

相关内容

  • 没有找到相关文章

最新更新