首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于广告牌矩阵转换的一个问题

关于广告牌矩阵转换的一个问题
EN

Stack Overflow用户
提问于 2020-05-30 11:52:58
回答 1查看 38关注 0票数 1
代码语言:javascript
复制
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轴看起来是正确的),但是当我使用教程的方式时,它工作得很好。

请帮帮我,我真的很困惑,谢谢。

EN

回答 1

Stack Overflow用户

发布于 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));

将产生数学表示法中的矩阵:

代码语言:javascript
复制
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;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62102029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档