检测 3D 网格上的水平和垂直表面

Detecting horizontal and vertical surfaces on a 3D mesh

我有一个使用 Qt3D 显示 3D 对象的应用程序。我正在寻找一种方法来检测我的 3D 对象上更 垂直 与更 水平 的表面的 3D 表面,如下所示:

我不知道从哪里开始。我不知道可用的工具。我什至不知道这种检测的术语。有人可以帮忙吗?

要检测 3D 对象的水平表面,可以使用 OpenGL 着色语言或 GLSLQt3D material class along with Qt3D effect class can be employed to implement any custom GLSL code. A 展示了如何使用那些 类.

要检测 3D 对象的水平表面并用红色显示它们,可以在 Qt3D 上像这样开发 OpenGL 2.0 的片段着色器 自定义 material/effect:

#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 );

    }
}