Я пытаюсь создать кубический патч безье, и у меня есть немного проблемы с выяснением, где я запутываю вычисления. У меня есть 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();
}
}
}
корпус 2 не возвращает это значение в 'Bezier3' –
Жаль, что это опечатка. Отредактировано, чтобы исправить это. – Kinru
Вы очищаете сетку до нуля вне этой функции? –