繁体   English   中英

使用 GLM 矩阵和向量乘法返回错误的结果

[英]Matrix and vector multiplication returns wrong result using GLM

我有这个方程,常数c和 vec4 x =(x_1, x_2, x_3, x_4):

x_1*c + x_2*c + x_3*c + x_4*c

其中总和(x_i)= 1

这意味着,结果应该是 c:

=(x_1 + x_2 + x_3 + x_4)* c

= 1 * c = c

所以我有一个 vec4 和一个 matrix4*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;

Output:

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 着色语言 4.60 规范 - 5.10。 向量和矩阵运算

例外是矩阵乘以向量、向量乘以矩阵和矩阵乘以矩阵。 这些不按分量操作,而是执行正确的线性代数乘法。

 vec3 v, u; mat3 m; u = v * m;

相当于

ux = dot(v, m[0]); // m[0] is the left column of m uy = dot(v, m[1]); // dot(a,b) is the inner (dot) product of a and b uz = dot(v, m[2]);

u = m * v;

相当于

ux = m[0].x * vx + m[1].x * vy + m[2].x * vz; uy = m[0].y * vx + m[1].y * vy + m[2].y * vz; uz = m[0].z * vx + m[1].z * vy + m[2].z * vz;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM