Решите код Fr enet Serret без пропусков или скручиваний - PullRequest
0 голосов
/ 03 февраля 2020

Работая над экструзией 3d труб вдоль пути Безье в трехмерном пространстве, используя C# и попали в тупик. Я интегрировал GLMSharp для векторов, точек, крестов и нормалей и т. Д. c .. Я не уверен, как создать Up Vector и есть ли в этом проблема. Я вывожу в формате .3ds, и на следующем изображении в некоторых случаях показаны разрывы или перекручивания. Я ищу решение.

//  frenet serret code
void get_circle(int i, double theta, float[,] mmp, float[] p1, float[] p2, float rad,float[] cen)
{
    float[] n = new float[3];

    vec3 tp1 = new vec3(p1[0], p1[1], p1[2]);
    vec3 tp2 = new vec3(p2[0], p2[1], p2[2]);

    vec3 T = (tp2 - tp1);
    T = T.Normalized;

    vec3 B = vec3.Cross(T, tp2 + tp1);
    B = B.Normalized;

    vec3 N = vec3.Cross(B, T);

    N = N.Normalized;

    float x = (float)Math.Cos(theta)*rad;
    float y = (float)Math.Sin(theta)*rad;

    vec3 vertex = tp1 + B * x + N * y;

    mmp[i,0] = cen[0] + vertex.x;
    mmp[i,1] = cen[1] + vertex.y;
    mmp[i,2] = cen[2] + vertex.z;
}

скручивания или разрывы

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

MBo, Спасибо за ускоренный ответ и процедуру, основанную на вашем совете, выглядит следующим образом:

void cap_middle(int i, double theta, float[,] mmp, vec3 prev, vec3 curr, vec3 next,float rad,float[] cen)
    {
        vec3 T = (curr - next);

        T = T.Normalized;

        vec3 B = vec3.Cross(next - curr, curr - prev);

        B = B.Normalized;


        vec3 N = vec3.Cross(B, T);

        N = N.Normalized;

        float x = (float)Math.Cos(theta)*rad;
        float y = (float)Math.Sin(theta)*rad;

        vec3 vertex = curr + B * x + N * y;

        mmp[i,0] = cen[0] + vertex.x;
        mmp[i,1] = cen[1] + vertex.y;
        mmp[i,2] = cen[2] + vertex.z;
    }

Хотя, возникла еще одна проблема, соединительные цилиндры с каждого подключенного пути Безье, похоже, имеют обмотку проблема заказа, как показано на графике c. Вершины не согласованы. Любые идеи?

порядок намотки

0 голосов
/ 03 февраля 2020

Насколько я понимаю, p1 и p2 являются точками, поэтому tp2 + tp1 определяет некоторую точку (вектор), которая не имеет отношения к бинормальному B. Когда этот вектор коллинеарен с касательной T, у вас есть ноль B adn gap.

Чтобы вычислить трехгранник Френеля в некоторой точке пути, вам нужно как минимум три последовательных точки этого пути - давайте назовем их Prev, Curr, Next.

Бинормальный B может быть вычислен как (за исключением случая трех коллинеарных точек - здесь бинормальный не определен, и можно использовать предыдущее значение, если это возможно)

 B = Cross(Next-Curr, Curr - Prev) 

Обратите внимание, что более надежное значение тангенса также может учитывать соседние точки - поэтому вместо

T = Next - Curr

вы можете использовать (когда интервал довольно равномерный) ( сравнить здесь )

T = Next - Prev
...