Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL变换矩阵的顺序是向后的_C++_Opengl_Math - Fatal编程技术网

C++ OpenGL变换矩阵的顺序是向后的

C++ OpenGL变换矩阵的顺序是向后的,c++,opengl,math,C++,Opengl,Math,如果我想绕z轴旋转对象,然后平移它,我必须这样做 glm::mat4 transform; GLfloat angle = 90f; transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f)); 但它是反向工作的,它先旋转,然后平移,所以我需要把它写成 glm::mat4 tr

如果我想绕z轴旋转对象,然后平移它,我必须这样做

glm::mat4 transform;
GLfloat angle = 90f;
transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
但它是反向工作的,它先旋转,然后平移,所以我需要把它写成

glm::mat4 transform;
GLfloat angle = 90f;
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));

这背后的数学是如何运作的?为什么我必须反向组合矩阵才能达到预期效果?

从直观的角度看,你是绝对正确的:变换必须以相反的方式应用。原因很简单:

在glm/OpenGL中,假设所有向量都是列向量,因此将矩阵形式的变换(
M
)应用于向量
t
,可以编写如下:

t' = M * t
现在假设我们首先要翻译(
T
),然后旋转(
R
)。我们现在可以像下面那样分别执行每个步骤

t' = T * t       //Translate
t'' = R * t'     //Rotate result Translation
当我们想要组合这两种转换时,我们在第二行中替换
t'
,得到:

t'' = R * (T * t) = (R * T) * t
如您所见,首先应用的操作最后写入(或者更好地说,更接近向量)。同样的原理可以应用于任意多个矩阵

请注意,如果将向量视为行向量,则整个矩阵顺序将发生变化

 t' = t * M        //General case
让我们看一看与上面相同的示例,但这次是关于行向量:

 t' = t * T
 t'' = t' * R

 t'' = (t * T) * R = t * (T * R)

结论:无论何时考虑变换和向量,请记住,首先应用的操作必须写得更靠近向量。

我只是在谷歌上搜索,可能是角度参数@与此无关:)请看更新这听起来让我很困惑。首先说:“我想绕z轴旋转对象,然后平移它”。然后“它向后工作,先旋转,然后平移”。为什么会是倒退?你描述它的方式,听起来好像你得到了你想要的东西?@RetoKoradi,因为从逻辑上讲,我需要旋转然后平移,但是当将所有这些组合成一个变换矩阵时,我必须反向执行这些操作,否则结果是错误的。这就是为什么混淆视听的解释!谢谢!现在有道理了:)