我试图理解矩阵变换在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:我为什么要为此付出代价呢?这是我(前一段时间)发现你需要一个独特的单位矩阵来渲染单独的对象,而不仅仅是相同的矩阵。 (比如混合投影,视图,身份,通过为每个对象添加它们)
答案 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矩阵和乘法运算开始并从那里开始工作。