我如何正确计算这个最终的均匀矩阵?

How do I correctly compute this final uniform matrix?

我试图了解矩阵变换在 opengl/glsl 中是如何工作的,并且我想知道如何制作一个具有每个 scale/rotation/translation 潜力的单个 4x4 id 矩阵。

所以,在所有绑定和诸如此类的事情之后,我只有 uniform/inputting 1 个矩阵来指定它的 location/spin。

这个想法对我来说似乎是正确的,但我想不出如何让物体移动而不扭曲它。它可以很好地旋转,也可以缩放。

但是我不知道如何将翻译应用于 id 矩阵,如果这有意义的话。无论如何,这是我的相关代码:

//update matrix
glUniformMatrix4fv(transform, 1, GL_FALSE, glm::value_ptr(ident));

//spin according to z
void object::spinz(float a) { ident = glm::rotate(ident, a, glm::vec3(0.0f, 0.0f, 1.0f)); }

这将修改我的

glm::mat4 ident();//id matrix

但是当我尝试翻译时:

void object::translate(float x, float y, float z);

方法本身只会扭曲object/matrix/result

ident +=  glm::vec4(x, y, z, 0);

我做错了什么?我是否应该尝试只使用 1 个统一输入?

解决:翻译的思路是错误的。一个正确的看起来更像这样:(但主要的是对每个对象单独进行)

glm::mat4 test = glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z));
finaluniformmatrix *= test;

或者基本上制作一个独特的平移矩阵,然后我将其与整个投影*视图矩阵相乘。

编辑:更便宜的翻译是:

matrix[3][0]=x;matrix[3][1]=y;matrix[3][2]=z; //where xyz are xyz coordinates.

ps:为什么我对此投反对票?这是我发现(前段时间)您需要一个唯一的单位矩阵来渲染单独的对象,而不仅仅是对所有内容都使用相同的矩阵。 (比如混合投影、视图、身份,通过为每个对象添加它们)

您可以使用多个单独的矩阵运算,并将它们相乘以将它们转化为指定整个运算的单个矩阵。可以将任意数量的 4x4 矩阵相乘,顺序很重要。

还要注意不均匀的缩放和旋转,这有时会产生 "sheering" 对象的效果。

您可以非常简单地构建平移、x 旋转、y 旋转、z 旋转和缩放 4x4 矩阵并将它们相乘以创建一个矩阵。

http://www.flipcode.com/documents/matrfaq.html#Q11

http://www.flipcode.com/documents/matrfaq.html#Q41

我不确定您使用的代码 - 我建议只使用 4x4 矩阵和乘法运算,然后从那里开始工作。