2011-06-05 131 views
1

在我的opengl应用程序中,我在三维空间中有一个Bézier曲线,我想沿着它移动一个对象。 所有事情都可以作为轮换的一部分:我在计算它们时遇到了一些问题。在脑海中的管道应该是这样的:在3d中沿着Bézier路径移动对象:旋转问题

  • 上贝塞尔(位置向量)的查找点
  • 查找切线,正常,副法线(Frenet标帧)
  • 找到切向量和x轴
  • 之间的角度
  • (同用于正常和y轴和副法线和z轴)
  • 推矩阵
  • 平移位置,旋转角度中,绘制对象
  • 弹出MATR ix

但它并没有如我所料:旋转似乎是随机的,并不遵循曲线。 有什么建议吗?

+1

您确定您正确计算角度和位置吗?没有代码,不能说。 – 2011-06-05 15:12:56

回答

2

不是计算角度只是将框架推入模型视图矩阵。 Normal,Binormal和Tangent进入矩阵的左上角3x3,第4列中的平移和元素4,4是1.代替Frenet帧使用已经提到的Bishop帧。因此在代码中:

// assuming you manage your curve in a (opaque) struct Bezier 
struct BezierCurve; 

typedef float vec3[3]; 

void bezierEvaluate(BezierCurve *bezier, float t, vec3 normal, vec3 binormal, vec3 tangent, vec3 pos); 

void apply_bezier_transform(Bezier *bezier, float t) 
{ 
    float M[16]; // OpenGL uses column major ordering 
    // and this code is a excellent example why it does so: 

    bezierEvaluate(bezier, t, &M[0], &M[4], &M[8], &M[12]); 
    M[3] = M[7] = M[11] = 0.; 
    M[15] = 1.; 

    glMultMatrixf(M); 
} 
+0

下摆..我不明白你的答案:( – nkint 2011-06-05 17:24:24

+0

@nkint:基本的想法是,评估贝塞尔曲线给你一个正交基矢量:正常, Binormal和Tangent。一个变换矩阵就是这些基本向量一起出现在曲线上的位置是翻译部分,我假设了一些函数bezierEvaluate(你可能用不同的名字命名,但实际上它需要一个曲线和变化参数,并将它们吐出4个向量),并将返回的向量直接传递给OpenGL,而不需要中间角度计算。 – datenwolf 2011-06-05 18:03:18

+0

+1 @nkint,将您的帧看作三个正交单位行向量u,v,w。制作一个3x3矩阵R,对于行向量x =(1,0,0),y =(0,1,0),z =(0,0,1)表示x轴,y轴,z轴 - xR = u,yR = v,zR = w。这应该有助于您看到R是将xyz轴转换为框架uvw。这就是OpenGL矩阵的工作方式 - 所谓的列主要排序。 – brainjam 2011-06-05 19:48:04

4

你将不得不与Frenet标架的问题,因为,不幸的是,它是不确定的,当曲线是即使是瞬间直 (已消失曲率),并表现出方向的剧烈波动点左右,其中 的密切飞机的法线方向发生了重大变化,特别是在正常翻转的拐点处。

我建议使用一种叫做Bishop框架的东西(你可以谷歌它,并找出如何计算它在一个离散的设置)。它也被称为平行运输框架或最小旋转框架 - 其优点是框架总是被定义的,并且以受控的方式改变方向。

我不认为Frenet帧的问题必然会解释您遇到的问题。您应该从一些简单的测试案例开始 - 例如,限制在XY平面上的贝塞尔曲线,并逐步进行计算,直至找到问题所在。

+0

感谢您的回答!我认为问题在于获得轮换,因为如果我绘制3个向量(切线正常binormal)他们似乎是好的。而且如果我用更简单的曲线(如螺旋线)代替贝塞尔,问题依然存在。顺便说一句,谢谢,现在我会寻找主教框架 – nkint 2011-06-05 16:12:15