vec3 camPosInModelSpace = (inverse(mat_world) * vec4(worldCamPos, 1)).xyz;
vec3 axisZ = normalize(camPosInModelSpace);
vec3 axisY = axisZ.y > 0.999 ? vec3(0, 0, 1) : vec3(0, 1, 0);
vec3 axisX = normalize(cross(axisY, axisZ));
axisY = normalize(cross(axisZ, axisX));
mat4x4 rotate = mat4x4(vec4(axisX, 0), vec4(axisZ, 0), vec4(-axisY, 0), vec4(0, 0, 0, 1));
//vec3 vertexModelSpace = (transpose(rotate) * vec4(vPosition, 1)).xyz; // Here is my confused point
vertexModelSpace = axisX * vPosition.x + axisZ * vPosition.y + -axisY * vPosition.z;
gl_Position = mat_mvp * vec4(vertexModelSpace, 1); 正如你所看到的,广告牌的GLSL代码非常简单,但我只是有一个问题,在我得到模型空间下的3轴之后,为什么不能使用矩阵来转换顶点(当我这样做时,只有Y轴看起来是正确的),但是当我使用教程的方式时,它工作得很好。
请帮帮我,我真的很困惑,谢谢。
发布于 2020-05-30 17:17:22
OepnGL和GLSL是以列为主作为默认矩阵布局构建的,因此,mat4 m; m[c][r]用于访问c-th列的r-第四行,m[c]将返回c-th colum作为vec4。与此一致,矩阵构造函数使用列向量:mat4 m(c0,c1,c2,c3),因此
mat4x4旋转= mat4x4(vec4(axisX,0),vec4(axisZ,0),vec4(-axisY,0),vec4(0,0,0,1));
将产生数学表示法中的矩阵:
axisX.x axisZ.x -axisY.x 0
axisX.y axisZ.y -axisY.y 0
axisX.z axisZ.z -axisY.z 0
0 0 0 1因此
vertexModelSpace =(转置(旋转)* vec4(vPosition,1)).xyz;
不是等价于
vertexModelSpace = axisX * vPosition.x + axisZ * vPosition.y + -axisY * vPosition.z;
但实际上使用的是变换矩阵的转置,这恰好是旋转矩阵的逆。
https://stackoverflow.com/questions/62102029
复制相似问题