2011-06-05 132 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