OpenGL Tube вдоль пути - PullRequest
       2

OpenGL Tube вдоль пути

5 голосов
/ 23 февраля 2011

Так что я играю с OpenGL и пытаюсь понять, как рисовать забавные фигуры.

Сейчас я работаю над трубкой.Я могу просто нарисовать прямую трубку с помощью:

void tube(GLfloat radius, GLfloat segment_length) {
    glPolygonMode(GL_BACK, GL_NONE);
    glPolygonMode(GL_FRONT, GL_FILL);

    glPushMatrix(); {
        GLfloat z1 = 0.0;
        GLfloat z2 = segment_length;

        GLfloat y_offset = 0.0;
        GLfloat y_change = 0.00;

        int i = 0;
        int j = 0;
        for (j = 0; j < 20; j++) {
            glPushMatrix(); {
                glBegin(GL_TRIANGLE_STRIP); {
                    for (i = 360; i >= 0; i--) {
                        GLfloat theta = i * pi/180;
                        GLfloat x = radius * cos(theta);
                        GLfloat y = radius * sin(theta) + y_offset;

                        glVertex3f(x, y, z1);
                        glVertex3f(x, y, z2);
                    }
                } glEnd();
            } glPopMatrix();

            // attach the front of the next segment to the back of the previous
            z1 = z2;
            z2 += segment_length;

            // make some other adjustments
            y_offset += y_change;
        }
    } glPopMatrix();
}

Однако я не выяснил, как заставить трубку следовать какому-либо заданному пути, например, по спирали или даже по простой линии.Если вы измените y_change на что-то вроде 0,01, то каждый сегмент трубы будет смещен на 0,01 в направлении y.Это здорово, но как я могу направить каждый сегмент в этом направлении?Другими словами, сейчас каждый сегмент нарисован так, что все они обращены в одно и то же направление, а направление не является направлением трубки (поскольку при y_change = 0,01 направление слегка «вверх»).

Я не уверен, как поступить.Я играл с векторами, получая вектор между предыдущим сегментом и текущим, но я не совсем уверен, что делать с этим после этого.

Ответы [ 3 ]

19 голосов
/ 23 февраля 2011

Идея называется экструзия с управлением по траектории , т.е. вы имеете базовую n-мерную форму и вытягиваете ее по n + 1-мерной кривой.Я могу прочитать ваше лицо: «А, что он говорит?»

Итак, вот грубый набросок.Сначала вам нужна функция, которая отображает значение, обычно называемое t, в непрерывную гладкую кривую в пространстве.Например, винт:

path(t): R → R³, t ↦ ( a·sin(k·t), b·cos(k·t), c·t )

Идея состоит в том, чтобы найти локализованную базу координат для определения положения ваших вершин по отношению к этому пути - имеет смысл, чтобы одна из координат была выровнена параллельнопуть, так что вы хотите найти его касательным.Это делается путем нахождения градиента:

tangent(t): R → R³, t ↦ ( k·a·cos(k·t), -k·b·sin(k·t), c ) = d/dt path(t)

Итак, это локальный базовый вектор, который направлен вдоль кривой, с началом локальной системы координат в точке t кривой.

Но нам нужны два других вектора, чтобы сформировать полную трехмерную базу.Обычно хорошим выбором будет иметь вторую базовую точку, перпендикулярную кривизне, которую вы получите, найдя скручивание касательной:

normal(t): R → R³, t ↦ ( -k²·a·sin(k·t), -k²·b·cos(k·t), 0 ) = d/dt tangent(t) = d²/dt² path(t)

Это называется нормалью.

вектор три основания можно получить, взяв перекрестное произведение нормали и тангенса, получая бинормаль.Я позволю вам разобраться с этим в качестве упражнения.

Теперь, чтобы вытянуть фигуру вдоль кривой, вам нужно разделить траекторию на сегменты, просто итерируя t в выбранном диапазоне, даваяВы местного происхождения.Точки вашей вытянутой формы относятся к этому исходному пути (t).Допустим, ваша фигура состоит из точек P_n в плоскости xy:

for t in [k..l]:
    for p in P_n:
        yield_vertex( path(t).x + binormal(t).x * p.x, 
                      path(t).y + normal(t).y * p.y, 
                      path(t).z )

Я оставлю это вам, выясняя, как адаптировать это к OpenGL, после всего, что вы должны чему-то научиться, подумав оЭто.Если вы не можете решить это до завтра, я с радостью предоставлю вам решение, но обычно гораздо интереснее самому разобраться.

1 голос
/ 28 марта 2014

Этот API способен выдавливать вдоль пути:

http://www.visualizationlibrary.org/documentation/pag_guide_extrusion.html

1 голос
/ 23 февраля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...