环境是 webgl 。
感觉是哪里错了,但是又很奇怪不知道错在哪里,关键字搜了 why transpose 之类的也是下结论之类的。 向大家请教,请喝杯咖啡。
在 glsl 手册 56 页
vec3 v, u;
mat3 m;
u = v * m;
is equivalent to
u.x = dot(v, m[0]); // m[0] is the left column of m
u.y = dot(v, m[1]); // dot(a,b) is the inner (dot) product of a and b
u.z = dot(v, m[2]);
And
u = m * v;
is equivalent to
u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z;
u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z;
u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;
向量使用的是列向量吧,比如这时候有一个平移变换 T(tx, ty, tz)
按照我的理解应该是
[
1, 0, 0, tx,
0, 1, 0, ty
0, 0, 1, tz,
0, 0, 0, 1
]
但是在 gl-matrix 变换里 是这样:
[
1, 0, 0, 0,
0, 1, 0, 0
0, 0, 1, 0,
tz, ty, tz, 1
]
这时候在一个 shader (这是实际正确的) 里
attribute vec4 aVertexPosition;
uniform mat4 uModelMatrix;
void main(void) {
gl_Position = uModelMatrix * aVertexPosition;
}
在上面的 shader 里,如果按照 gl-matrix 的写法,变成了
M = [
1, 0, 0, 0,
0, 1, 0, 0
0, 0, 1, 0,
tz, ty, tz, 1
]
V = [x, y, z, 1];
gl_Position = M * V;
相乘后 tx, ty, tz 不能变换上去吧?
但是 gl-matrix 是对的(我看的这篇教程 也是这样),请问这是为什么?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.