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

时间:2015-11-19 05:34:24

标签: c++ opengl glsl transformation

我试图理解矩阵变换在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);
我做错了什么?我是否应该尝试只有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:我为什么要为此付出代价呢?这是我(前一段时间)发现你需要一个独特的单位矩阵来渲染单独的对象,而不仅仅是相同的矩阵。 (比如混合投影,视图,身份,通过为每个对象添加它们)

1 个答案:

答案 0 :(得分:3)

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

同时要注意不均匀的比例和旋转,这有时会产生" sheering"对象。

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

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

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

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