Как построить многоугольники из явных уравнений? - PullRequest
2 голосов
/ 09 октября 2011

Предположим, у меня есть явное уравнение, которое может представлять форму объекта в OpenGL, как я должен сортировать фигуру из явного уравнения?

Например, у меня есть это явное уравнение: enter image description here

Оба u и v являются членами действительных чисел.

Затем я попытался сделать это в OpenGL C ++:

float maxParts = 20;

vector<float> point(3);

glBegin(GL_QUAD_STRIP);
for(int i=0; i<=maxParts; i++) {
    float u = ((float)i/maxParts)*2*M_PI;
    for(int j=-maxParts; j<=maxParts; j++) {
        float v = (j/maxParts) * M_PI;
        point[0] = cos(u) * (4.0+3.8*cos(v));
        point[1] = sin(u) * (4.0+3.8*cos(v));
        point[2] = (cos(v) + sin(v) - 1.0) * (1.0 + sin(v)) * log(1.0-M_PI*v/10.0) + 7.5 * sin(v);
        glVertex3f(point[0], point[1], point[2]);
    }
}
glEnd();

Но этооказывается просто очень дерьмовым.Приведенный выше код несколько создает небольшое впечатление о форме, но полигоны отображаются неправильно.Как мне пройти через явное уравнение для координат x, y и z, чтобы построить форму из уравнения?

1 Ответ

4 голосов
/ 09 октября 2011

Как правило, вы идете в правильном направлении. Однако вы пропустили важный шаг, который вам придется разделить патч на более мелкие квадраты (тесселяйте его). Таким образом, вы не просто перебираете точки выборки, вы перебираете патчи и должны генерировать 4 точки выборки для каждого патча.

Также вам необходимо указать нормали вершин. Нормы вершин задаются путем взятия перекрестного произведения векторов δ {x, y, z} / δu и δ {x, y, z} / δv

РЕДАКТИРОВАТЬ из-за комментария

Пример кода для выдачи независимых четырехугольников:

const int patches_x, patches_y;
const float patch_size_x, patch_size_y;
int px, py;
for(px = 0; px < patches_x; px++) for(py = 0; py < patches_y; py++) {
    const float U = px * patch_size_x;
    const float V = py * patch_size_y;
    {
        float u, v;
        u = U - patch_size_x/2.0;
        v = V - patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
    {
        float u, v;
        u = U + patch_size_x/2.0;
        v = V - patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
    {
        float u, v;
        u = U + patch_size_x/2.0;
        v = V + patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
    {
        float u, v;
        u = U - patch_size_x/2.0;
        v = V + patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...