2013-04-23 48 views
0

我想創建三次貝塞爾補丁時遇到的一點點麻煩搞清楚我搞亂了計算。我在一個2D數組中有16個控制點,我希望網格有400個點,每個點以.05爲增量分隔。三次Bezier實施

控制點以20爲增量(所以P0,0在(0,0,0)和P3,3是在(60,0,60)。該網格將是在xz平面上與Ÿ眼下協調所有0

我有給出了x和z相同的值上的每一個點的情況如下:

float Bezier3(int j, float k) 
{ 
    switch(j) { 
     case 0: 
      return (1 - k) * (1 - k) * (1 - k); 
      break; 
     case 1: 
      return 3*k*((1 - k) * (1 - k)); 
      break; 
     case 2: 
      return 3 * (k * k) * (1 - k); 
      break; 
     case 3: 
      return k * k * k; 
      break; 
    } 
} 

void CalcBezier() 
{ 
    float u; 
    float v; 
    for (int i = 0; i < 20; i++) { 
     u = 0; 
     v = 0; 
     for (int j = 0; j < 20; j++) { 
      for (int x = 0; x < 4; x++) { 
       for (int y = 0; y < 4; y++) { 
        grid[i][j].x += control[x][y].x * Bezier3(x, u) * Bezier3(y, v); 
        grid[i][j].y += control[x][y].y * Bezier3(x, u) * Bezier3(y, v); 
        grid[i][j].z += control[x][y].z * Bezier3(x, u) * Bezier3(y, v); 
       } 
      } 
      u+=.05; 
      v+=.05; 
     } 
    } 
} 

我並不確切知道我要去的地方錯了,我想。走縱列通過網格和計算每個貝塞爾點。

我也試圖提取所得網作爲一個三角形網格:

void bezier_plane() 
{ 
    CalcBezier(); 
    for (int i = 0; i < 19; i++) { 
     for (int j = 0; j < 19; j++) { 
      glBegin(GL_TRIANGLE_STRIP); 
       glVertex3f(grid[i][j].x, grid[i][j].y, grid[i][j].z); 
       glVertex3f(grid[i][j+1].x, grid[i][j+1].y, grid[i][j+1].z); 
       glVertex3f(grid[i+1][j].x, grid[i+1][j].y, grid[i+1][j].z); 
       glVertex3f(grid[i+1][j+1].x, grid[i+1][j+1].y, grid[i+1][j+1].z); 
      glEnd(); 
     } 
    } 
} 
+0

情況下2不會返回它的值在'Bezier3' – 2013-04-23 18:48:08

+0

對不起這是一個錯字。編輯修復它。 – Kinru 2013-04-23 18:49:13

+0

您是否在此函數之外清除了網格零點? – 2013-04-23 18:57:58

回答

2

它看起來像你在內部循環內增加u和v。

嘗試改變

 u+=.05; 
     v+=.05; 
    } 

 v+=.05; 
    } 
    u+=.05; 

並移動歸零外循環。

for (int i = 0; i < 20; i++) { 
    u = 0; 
    v = 0; 

u = 0; 
for (int i = 0; i < 20; i++) { 
    v = 0; 
+0

剛剛實施了您的建議。我*認爲*它的工作,但顯然有什麼是我的繪圖功能的錯誤,因爲而不是一個網格,它給了我一個堅實的白牆。 – Kinru 2013-04-23 19:04:07

+2

你絕對在線模式嗎?即你做了一些像「glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);」 ? – 2013-04-23 19:08:03

+0

你是對的,我忘了那條線(我對opengl極度缺乏經驗)。非常感謝你! – Kinru 2013-04-23 19:09:27