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

问题描述 投票:0回答:1

我有一个常数的方程式 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)

据我所知,这个向量已经被认为是一个行向量。

c++ opengl glm-math
1个回答
4
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.