2013-04-23 3 views
0

Итак, у меня в настоящее время есть кубический плакат безье на плоскости XZ (y = 0, так что это плоский патч). Патч состоит из 16 контрольных точек и 400 точек сетки. В настоящее время я пытаюсь выбрать 1 из 4-х контрольных точек (любой из них) и увеличить в любом направлении координат.Cubic Bezier Curve Interaction

Я думаю, что часть, с которой у меня возникают проблемы, фактически отображает изменения с помощью функций рисования OpenGL. Ниже приведен код для создания патча и моей текущей функции рисования, а также образец функции инкремента, которую я сейчас использую.

Сетка представляет собой 2-мерный массив всех точек сетки. Управление - это 2-й массив из 16 контрольных точек. control_point изменяется функцией меню, которую пользователь выбирает (параметры 1-4) и инициализируется на 1.

Редактировать: Исправлены последние 2 контрольных точки в инструкции switch.

void bezier_plane() 
{ 
    CalcBezier(); 
    for (int i = 0; i < 19; i++) { 
     for (int j = 0; j < 19; j++) { 
      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
      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(); 
     } 
    } 
} 

void CalcBezier() 
{ 
    float u; 
    float v; 
    u = 0; 
    for (int i = 0; i < 20; i++) { 
     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); 
       } 
      } 
      v+=.05; 
     } 
     u+=.05; 
    } 
} 

/*Is called when a menu button is hit, indicating that the control point is incremented in the y direction*/ 
void OnYInc() 
{ 
    switch(control_point) { 
    case 1: 
     control[1][1].y += 2; 
     break; 
    case 2: 
     control[1][2].y += 2; 
     break; 
    case 3: 
     control[2][3].y += 2; 
     break; 
    case 4: 
     control[2][4].y += 2; 
     break; 
    } 
    InvalidateRect(NULL, FALSE); 
} 

Функция onDraw просто вызывает bezier_plane(). Прямо сейчас, с приведенным выше кодом, когда я пытаюсь увеличивать с помощью y. Треугольники в сетке просто становятся больше, но, похоже, они не рисуют правильно. Это немного сложно описать.

Результат выглядит следующим образом. Первый снимок экрана до того, как я натолкнулся на приращение. Второй скриншот и третий скриншот - это то, что он выглядит после 1 клика, а затем после 10 кликов. Я также не совсем уверен, почему диапазон патча фактически меняется, когда я увеличиваю в направлении y (он, кажется, становится больше, поскольку я продолжаю увеличивать y).

before increment

after 1 click

after 10 clicks

+0

Сделайте пару скриншотов, если их сложно описать. – RandyGaul

+1

Добавлены скриншоты – Kinru

+2

Вы устанавливаете элементы «сетки» в ноль перед вызовом 'CalcBezier()' каждый раз? – radical7

ответ

2

radical7 решил это для вас. Поскольку вы не устанавливаете сетку в ноль перед вызовом CalcBezier, каждый раз, когда вызывается CalcBezier, все значения сетки увеличиваются. Изменен OnYInc, чтобы оставить контрольные точки в одиночку и просто InvalidateRect, и вы увидите то же поведение.

+0

Doh! Не могу поверить, что я об этом не думал. Кажется, это трюк. Благодарю вас и радикально – Kinru

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