如何正确计算这个最终的一致矩阵

How do I correctly compute this final uniform matrix?

本文关键字:何正确 计算      更新时间:2023-10-16

我试图了解矩阵变换是如何在opengl/glsl中工作的,我想知道如何制作一个具有每种缩放/旋转/平移潜力的4x4 id矩阵。

所以,在所有的绑定等等之后,我只需要均匀/输入1个矩阵来指定它的位置/自旋。

这个想法对我来说似乎是正确的,但我不知道如何让物体在不扭曲的情况下移动。它旋转得很好,而且可以缩放。

但是idk如何将转换应用于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);

该方法本身只会扭曲对象/矩阵/结果

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

我做错了什么?我是否应该尝试只有一个统一的输入?

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

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矩阵都可以相乘,并且阶数很重要。

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

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

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

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

我不确定你使用的代码是什么——我建议从一开始就只使用4x4矩阵和乘法运算。