Обнаружение горизонтальных и вертикальных поверхностей на трехмерной сетке - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть приложение, использующее Qt3D для отображения 3D-объектов. Я ищу способ обнаружения трехмерных поверхностей на моих трехмерных объектах, которые больше вертикальные по сравнению с поверхностями, которые более горизонтальные , например:

tea pot with sample hor. and ver. surfaces

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

1 Ответ

0 голосов
/ 26 октября 2018

Для обнаружения горизонтальных поверхностей на трехмерном объекте можно использовать язык затенения OpenGL или GLSL . Класс материала Qt3D * Класс 1004 * вместе с Класс Qt3D * Класс 1006 * может использоваться для реализации любого пользовательского кода GLSL. A Q & A показывает, как использовать эти классы.

Чтобы обнаружить горизонтальные поверхности на трехмерном объекте и показать их красным цветом, фрагментный шейдер для OpenGL 2.0 может быть разработан следующим образом для Qt3D пользовательского материала / эффекта:

#define FP highp
varying FP vec3 worldNormal;

void main()
{
    vec3 n = normalize(worldNormal);
    vec3 z = vec3(0.0, 0.0, -1.0); // Normalized already

    float zDotN = dot(z, n);

    if ( zDotN > 0.7 ) { // 0.7 is my threshold/criterion

        vec3 oc = vec3(1.0, 0.0, 0.0); // Use red color!
        gl_FragColor = vec4(oc, 1.0);

    } else {

        vec3 oc = vec3(0.0, 0.0, 1.0); // Use blue color!
        gl_FragColor = vec4(oc, 1.0 );
    }
}

В приведенном выше коде точечное произведение вектора поверхности normal с (0.0, 0.0, -1.0) используется для определения горизонтальности поверхности.

Для OpenGL 3.0 код GLSL будет изменен следующим образом:

#version 150 core

in vec3 worldNormal;
out vec4 fragColor;

void main()
{
    vec3 n = normalize(worldNormal);
    vec3 z = vec3(0.0, 0.0, -1.0); // Normalized already
    float zDotN = dot(z, n);

    if ( zDotN > 0.7 ) { // 0.7 is my threshold/criterion

        vec3 oc = vec3(1.0, 0.0, 0.0); // Use red color!
        fragColor = vec4( oc, 1.0);

    } else {

        vec3 oc = vec3(0.0, 0.0, 1.0); // Use blue color!
        fragColor = vec4( oc, 1.0 );

    }
}
...