跟随这个教程在这里
我设法创建了一个圆柱形广告牌(它利用几何着色器获取点并生成四边形)。问题是,当我移动相机使其高于广告牌(使用 gluLookat)时,广告牌不会旋转以真正面对相机(好像它是一个圆柱形广告牌)。
怎么弄成球形?
如果有人感兴趣,这里是稍微修改的几何着色器代码:
#version 330
//based on a great tutorial at http://ogldev.atspace.co.uk/www/tutorial27/tutorial27.html
layout (points) in;
layout (triangle_strip) out;
layout (max_vertices = 4) out;
uniform mat4 mvp;
uniform vec3 cameraPos;
out vec2 texCoord;
void main(){
vec3 pos = gl_in[0].gl_Position.xyz;
pos /= gl_in[0].gl_Position.w; //normalized device coordinates
vec3 toCamera = normalize(cameraPos - pos);
vec3 up = vec3(0,1,0);
vec3 right = normalize(cross(up, toCamera)); //right-handed coordinate system
//vec3 right = cross(toCamera, up); //left-handed coordinate system
pos -= (right*0.5);
gl_Position = mvp*vec4(pos,1.0);
texCoord = vec2(0,0);
EmitVertex();
pos.y += 1.0;
gl_Position = mvp*vec4(pos,1.0);
texCoord = vec2(0,1);
EmitVertex();
pos.y -= 1.0;
pos += right;
gl_Position = mvp*vec4(pos,1.0);
texCoord = vec2(1,0);
EmitVertex();
pos.y += 1.0;
gl_Position = mvp*vec4(pos,1.0);
texCoord = vec2(1,1);
EmitVertex();
}
编辑:正如我之前所说,我尝试过将 3,3-submatrix 设置为身份的方法。我可能已经解释了错误的行为,但是这个 gif 应该做得更好:
在上图中,相机使用标识子矩阵方法与广告牌(红色)一起旋转。但是,广告牌不应穿过表面(白色),它应该保持正确的位置并始终位于表面的一侧,这不会发生。