我有一个常数的方程式 c 和vec4 x=(x_1, x_2, x_3, x_4):
X_1*C + X_2*C + X_3*C + X_4*C
其中sum(x_i) = 1
也就是说,结果应该是c。
=(x_1 + x_2 + x_3 + x_4) * c。
= 1 * c = c
所以我有一个vec4和一个矩阵4*3的乘法是这样的。
(x_1, x_2, x_3, x_4) *((?c?),(?c?),(?c?)(?c?))
但是,结果(vec3)中的y坐标根本不等于c。
这是怎么回事,如何解决?
float constant = 10.0f;
glm::vec3 v1 = glm::vec3(48.0f, constant, 18.0f);
glm::vec3 v2 = glm::vec3(56.0f, constant, 18.0f);
glm::vec3 v3 = glm::vec3(56.0f, constant, 12.0f);
glm::vec3 v4 = glm::vec3(52.0f, constant, 8.0f);
glm::mat4x3 M = glm::mat4x3(v1, v2, v3, v4);
glm::vec4 sumTo1 = glm::vec4(0.2f, 0.4f, 0.1f, 0.3f);
glm::vec3 result = sumTo1 * M;
cout << "sumTo1=" << glm::to_string(sumTo1) << endl;
cout << "M=" << glm::to_string(M) << endl;
cout << "result=" << glm::to_string(result) << endl;
输出。
sumTo1=vec4(0.200000, 0.400000, 0.100000, 0.300000)
M=mat4x3((48.000000, 10.000000, 18.000000), (56.000000, 10.000000, 18.000000), (56.000000, 10.000000, 12.000000), (52.000000, 10.000000, 8.000000))
result=vec3(15.400001, 17.000000, 16.400000)
据我所知,这个向量已经被认为是一个行向量。
OpenGL矩阵和 GLM 矩阵按列大顺序存储。向量必须从右边开始向矩阵相乘。
glm::vec3 result = sumTo1 * M;
glm::vec3 result = M * sumTo1;
请看 GLSL编程矢量和矩阵操作 和 OpenGL Shading Language 4.60 Specification - 5.10. 向量和矩阵操作
例外的是矩阵乘以向量、向量乘以矩阵、矩阵乘以矩阵。这些并不是分量运算,而是执行正确的线性代数乘法。
vec3 v, u; mat3 m; u = v * m;
相当于
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]);
还有
u = m * v;
相当于
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;