2013-04-23 2 views
0

Я пытаюсь создать кубический патч безье, и у меня есть немного проблемы с выяснением, где я запутываю вычисления. У меня есть 16 контрольных точек в массиве 2d, и я хочу, чтобы в сетке было 400 точек, каждая из которых разделялась с шагом 0,05.Cubic Bezier Реализация

Контрольные точки имеют приращения 20 (поэтому P0,0 находится в точке (0,0,0), а P3,3 - в точке (60, 0, 60). Сетка будет находиться на плоскости xz с координаты у всех 0.

Сейчас у меня есть следующая, который дает то же значение для й и г на каждую точке:

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' –

+0

Жаль, что это опечатка. Отредактировано, чтобы исправить это. – Kinru

+0

Вы очищаете сетку до нуля вне этой функции? –

ответ

2

Похоже, вы увеличиваете и u и v внутри внутреннего контура.

Try изменения

 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

+2

Вы определенно находитесь в режиме линии? т. е. вы сделали что-то вроде «glPolygonMode (GL_FRONT_AND_BACK, GL_LINE)»; ? –

+0

Вы правы, я забыл эту строку (я очень неопытен с opengl). Большое спасибо! – Kinru

Смежные вопросы