代码之家  ›  专栏  ›  技术社区  ›  Megidd

在三维网格上检测水平和垂直表面

  •  0
  • Megidd  · 技术社区  · 6 年前

    我有一个使用qt3d显示三维对象的应用程序。我正在寻找一种方法来检测我的三维物体上的三维表面 垂直的 与表面相比 水平的 ,如下所示:

    tea pot with sample hor. and ver. surfaces

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Megidd    6 年前

    要检测三维对象上的水平面,请使用OpenGL着色语言或 GLSL 可以使用。 Qt3D material 与一起上课 Qt3D effect 类可用于实现任何自定义glsl代码。一 Q & A 演示如何使用这些类。

    要检测三维对象上的水平面并用红色显示,请使用OpenGL的片段明暗器。 可以在一个 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 );
        }
    }
    

    在上述代码中, DOT产品 表面 normal 矢量与 (0.0, 0.0, -1.0) 用于确定表面是否水平。

    对于OpenGL ,将按如下方式修改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 );
    
        }
    }