如何在贝塞尔曲线上找到两点之间的角度?

3
在我的当前OpenGL项目中,我正在尝试使链条的链接紧贴Bezier曲线的轮廓。我应该如何找到曲线上两点之间的角度,以便我可以定位链条的链接,使它们沿着曲线运动。 这里是曲线和链条的图片,我需要一种方法来旋转链接,使它们沿着曲线移动。
有人知道如何做到这一点吗?
3个回答

4
也许像这个一样的东西是你需要的。

如何计算Bezier曲线的切线

这在网上很难找到。它必须是那些知道的人密切保持的秘密。哦,你可以找到数学公式,但如果你不是数学家,解释它们会很有趣。那么一个可怜的开发者该怎么办?回到学校。

我花了几天时间研究这个问题。我费尽了心思(当我的头骨受到足够的敲打后),我谷歌搜索了一番。然后,在一个明亮美丽的星期六,我躲在开发者的地下室休息我的疲惫骨头。我面前有电视,右边有维基百科,我懒洋洋地在两者之间切换。

继续阅读...


阅读了这篇文章后,我花费的所有时间来理解和编写自己的贝塞尔曲线突然间就豁然开朗了。谢谢! - Liam
仅凭美丽的动画就值得加1分。我喜欢看这种东西 :) - Sampson
9
链接已损坏。您不应该发布链接。 - user439441
@David,那是因为“它是由知道的人密切保持的秘密”。 :) - Victor Engel
在四年前的问题上发表挖苦的评论有用吗?这不是提升轻信誉的最佳方式。 - duffymo
该死,我需要它,它坏了。 - AndreaBogazzi

1

让你的贝塞尔曲线上的点为A和B。规范化向量AB,使其长度为1。将其称为AB_norm。然后使用asin(AB_norm.y)或acos(AB_norm.x)来获取角度。0度角是一个指向右侧的水平向量。以下是C语言风格的伪代码:

 get_angle(Point A, Point B) {
   AB.x = B.x - A.x;
   AB.y = B.y - A.y;
   length = sqrt(AB.x * AB.x + AB.y * AB.y);

   AB_norm.y /= AB.y / length;
   angle = asin(AB_norm.y);
   // or
   // AB_norm.x /= AB.x / length;
   // angle = acos(AB_norm.x);
 }

 angle = get_angle(A, B);
 glRotatef(angle, 0.0f, 0.0f, 1.0f);
 // Draw the chain link here

0

这里需要一些数学。您可以找到切向量、法向量和副法向量,然后找到角度。如果您仍然感兴趣,请告诉我,我有关于这个主题的一些细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接