opengl - 在贝塞尔曲线opengl中绘制切线和法线到每个点

标签 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)

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

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) 绘制一条线)。 Tangent generated by drawing a line between (x,dx)

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

Drawing a line between (x,x+dx)

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

最佳答案

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

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

关于opengl - 在贝塞尔曲线opengl中绘制切线和法线到每个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798195/

相关文章:

c - 使用 atan C 截断 double

c# - 统一拍打子对象的旋转

svg - 我怎样才能知道 svg 二次贝塞尔曲线的峰值点坐标?

c++ - 对某些 OpenGL 函数的 undefined reference (如果它们尚未在 main 中调用)

cocoa - 当用户将窗口移动到不同的显示器时,OpenGL 上下文停止工作

c++ - 反转 4x4 矩阵

math - SCSS 三次贝塞尔函数?

javascript - 如何将arcto转换为贝塞尔曲线?

c - 用于tilemap的VBO(绘制顺序和倾斜的2D航空)

c++ - OpenGL 游戏截屏