绘制贝塞尔曲线opengl中每个点的切线和法线

sss*_*999 3 opengl math bezier

我目前通过将某些 4 阶贝塞尔曲线相加来生成贝塞尔曲线。我正在使用GL_LINES. 我需要在每个贝塞尔点绘制切线、法线和副法线。

据我所知,要在任何给定的 t 值处找到切线,方程是

P'(t) = 4 * (1-t)^3 *(P1 - P0) + 12 *(1-t)^2*t*(P2-P1) + 12 * (1-t) * t^2 * (P3-P2) + 4 * t^3 * (P4-P3)
Run Code Online (Sandbox Code Playgroud)

我目前正在以下列方式使用上述等式。

temp = 1-t;
tangentPoints[val].XYZW[j] = (4 * pow(temp, 3)*(V[k + 1].XYZW[j] - V[k].XYZW[j])) + (12 * pow(temp, 2)*t*(V[k + 2].XYZW[j] - V[k + 1].XYZW[j])) + (12 * (temp)*pow(t, 2)*(V[k + 3].XYZW[j] - V[k + 2].XYZW[j])) + (4 * pow(t, 3)*(V[k + 4].XYZW[j] - V[k + 3].XYZW[j])); 
Run Code Online (Sandbox Code Playgroud)

其中 j 对应于 x,y,z 值,tangentPoints是我为顶点定义的结构。V 是控制点的顶点数组。

我只是在值 t 的贝塞尔曲线上的点(例如 x)与其对应的切线值(例如 dx)之间绘制一条线但是在绘制 (x, dx) 之间的切线时,我得到了这样的结果(绘制一个来自(x,dx)的行)。 通过在 (x,dx) 之间画一条线生成切线

但是当我将贝塞尔点添加到每个相应的切点时,我得到了正确的图像,即我通过在 (x,x+dx) 之间画一条线得到了正确的结果

在 (x,x+dx) 之间画一条线

任何人都可以告诉我为什么会这样,并且还提供了绘制给定贝塞尔点的切线和法线的见解。

ybu*_*ill 5

虽然P'(t)有时被称为切线,但它实际上是曲线的导数,也就是速度。如果曲线在 2d 空间中,并且它的点以米为单位,那么 的单位P'(t)将以米/秒为单位。在“5米”和“6米/秒”之间划一条线是没有意义的,因为它们是不同空间中的点。

您应该做的是在“曲线上的点”和“如果物体从曲线上分离并继续以其当前速度移动 1 秒时所在的位置”之间画一条线。即在P(t)和之间P(t) + dt * P'(t)