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

时间:2018-09-04 07:01:15

标签: 3d mesh qt3d

我有一个使用Qt3D来显示3D对象的应用程序。我正在寻找一种方法来检测我的3D对象上垂直的3D表面,而不是那些水平的表面,像这样:

tea pot with sample hor. and ver. surfaces

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

1 个答案:

答案 0 :(得分:0)

要检测3D对象上的水平面,可以使用OpenGL阴影语言或 GLSL Qt3D material类和Qt3D effect类可用于实现任何自定义GLSL代码。 Q & A显示了如何使用这些类。

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

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

    }
}