我有一个使用Qt3D来显示3D对象的应用程序。我正在寻找一种方法来检测我的3D对象上垂直的3D表面,而不是那些水平的表面,像这样:
我不知道从哪里开始。我不知道可用的工具。我什至不知道这种检测的术语。有人可以帮忙吗?
答案 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 );
}
}