【问题标题】:A question about billboard matrix convert关于广告牌矩阵转换的问题
【发布时间】:2020-05-30 11:52:58
【问题描述】:
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);    

如你所见,billboard的GLSL代码很简单,但是我只是有个问题,在我得到模型空间下的3轴后,为什么不能用矩阵来转换顶点(当我这样做时,似乎只有 Y 轴工作正常),但是当我使用教程的方式时,它工作正常。
请帮帮我,我真的很困惑,谢谢。

【问题讨论】:

    标签: opengl matrix glsl


    【解决方案1】:

    OepnGL 和 GLSL 在构建时将列优先作为默认矩阵布局,因此,mat4 m; m[c][r] 用于访问 c-th 列的 r-th 行,m[c] 将返回 @ 987654325@-th 列为vec4。与此一致,矩阵构造函数使用列向量:mat4 m(c0,c1,c2,c3),因此

    mat4x4 rotate = 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 = (transpose(rotate) * vec4(vPosition, 1)).xyz; 
    

    等价于

    vertexModelSpace = axisX * vPosition.x + axisZ * vPosition.y + -axisY * vPosition.z;
    

    但实际上会使用该变换矩阵的转置,这恰好是旋转矩阵的逆矩阵。

    【讨论】:

    • 谢谢回复,是我的错,我的困惑点没有说清楚,不好意思,其实我可以理解我的矩阵变换不等同于另一个,我的困惑点,我得到的矩阵(转置m),应该将模型空间下的顶点转换为新的模型空间(就像我们将法线或切线转换为世界空间或切线空间一样),我认为我得到的矩阵应该转换从父空间(模型空间)到子空间(新模型空间)的顶点,但我不能得到正确的结果,如果你知道原因,请教我,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多