【问题标题】:Draw tangents and normal to each point in Bezier curve opengl绘制贝塞尔曲线opengl中每个点的切线和法线
【发布时间】:2016-09-30 18:48:07
【问题描述】:

我目前通过将某些 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)

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

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])); 

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

我只是在贝塞尔曲线上的点(比如 x)之间画一条线,对于值 t 和它对应的切线值(比如 dx) 然而,在绘制(x,dx)之间的切线时,我得到了这样的东西(从(x,dx)画一条线)。

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

谁能告诉我为什么会这样,并提供一个关于绘制给定贝塞尔点的切线和法线的见解。

【问题讨论】:

    标签: opengl math bezier


    【解决方案1】:

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

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

    【讨论】:

    • 那么绘制法线也必须这样做,对吗?我的意思是在 P(t) 和 P(t)+normal(t) 之间画一条线
    • @sss999:基本上是的。请注意,不是使切线/法线/任何与它们的速度/曲率/任何成正比,您总是可以选择通过标准化矢量来绘制固定大小的它们。例如。 P(t) + P'(t)/|P'(t)| 为切线。 normal 可能已经标准化了。
    • 请注意,对于 3D,事情要多一些工作,因为您需要先找到曲线上点的行进平面,但这并不是超级复杂,而且覆盖在stackoverflow.com/a/25458216/740553
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多