检测 3D 网格上的水平和垂直表面
Detecting horizontal and vertical surfaces on a 3D mesh
我有一个使用 Qt3D 显示 3D 对象的应用程序。我正在寻找一种方法来检测我的 3D 对象上更 垂直 与更 水平 的表面的 3D 表面,如下所示:
我不知道从哪里开始。我不知道可用的工具。我什至不知道这种检测的术语。有人可以帮忙吗?
要检测 3D 对象的水平表面,可以使用 OpenGL 着色语言或 GLSL。 Qt3D 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 );
}
}
我有一个使用 Qt3D 显示 3D 对象的应用程序。我正在寻找一种方法来检测我的 3D 对象上更 垂直 与更 水平 的表面的 3D 表面,如下所示:
我不知道从哪里开始。我不知道可用的工具。我什至不知道这种检测的术语。有人可以帮忙吗?
要检测 3D 对象的水平表面,可以使用 OpenGL 着色语言或 GLSL。 Qt3D 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 );
}
}