C++ 从旋转和位置获取正向矢量
我有一个camera类,它有旋转和位置,还有一个从位置和旋转生成视图矩阵的方法,蚀刻帧相机将视图矩阵发送到渲染器。(投影矩阵也一样,但变化不大) 我想做的是称之为“移动摄影机”: 使用C++ 从旋转和位置获取正向矢量,c++,opengl,glm-math,C++,Opengl,Glm Math,我有一个camera类,它有旋转和位置,还有一个从位置和旋转生成视图矩阵的方法,蚀刻帧相机将视图矩阵发送到渲染器。(投影矩阵也一样,但变化不大) 我想做的是称之为“移动摄影机”: 使用forwardDirection*deltaTime*speed 从我的主循环。我的问题是根据我的旋转和位置创建一个前进方向向量。 旋转是一个带有度的矢量3,用于创建如下视图矩阵: glm::mat4 Camera::GetViewMatrix() { glm::mat4 matRoll = glm::ma
forwardDirection*deltaTime*speed
从我的主循环。我的问题是根据我的旋转和位置创建一个前进方向向量。
旋转是一个带有度的矢量3,用于创建如下视图矩阵:
glm::mat4 Camera::GetViewMatrix()
{
glm::mat4 matRoll = glm::mat4(1.0f);
glm::mat4 matPitch = glm::mat4(1.0f);
glm::mat4 matYaw = glm::mat4(1.0f);
matRoll = glm::rotate(matRoll,glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
matPitch = glm::rotate(matPitch, glm::radians(rotation.x), glm::vec3(0.0f, 1.0f, 0.0f));
matYaw = glm::rotate(matYaw, glm::radians(rotation.y), glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 rotate = matRoll * matPitch * matYaw;
glm::mat4 translate = glm::mat4(1.0f);
translate = glm::translate(translate ,-position);
return rotate*translate ;
}
那么,在这种情况下,我应该如何从我的位置和旋转中生成一个正向向量呢?您可以从相机视图矩阵中提取它 一旦在世界空间中有了摄影机变换矩阵,就可以 您使用的是glm,这样您就可以抓取倒置矩阵的第二列,并将其归一化以获得方向
const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));
可以从摄影机视图矩阵中提取它 一旦在世界空间中有了摄影机变换矩阵,就可以 您使用的是glm,这样您就可以抓取倒置矩阵的第二列,并将其归一化以获得方向
const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));
我真的建议不要在这个用例中使用Euler角度。在这种情况下,它们有一系列的缺点和微不足道的好处。无论如何,前进方向通常是视图矩阵的第三行(或其负数)。我真的建议不要在这个用例中使用Euler角度。在这种情况下,它们有一系列的缺点和微不足道的好处。无论如何,前进方向通常是视图矩阵的第三行(或其负数)。好的,这可以工作,但您必须翻转z轴或翻转y轴和x轴,就像下面的vec3 forward=normalize(glm::vec3(camera.GetViewMatrix()[2])*vec3(1,1,-1);你将如何用这种方法得到“左”字?(x轴)如果你遵循我发布的第一个链接,你可以看到它已经在矩阵中。查看名为convention的部分。另外,还有一些glm便利函数:
side=vec3(row(getViewMatrix(),0))
Ok这可以工作,但必须翻转z轴或翻转y轴和x轴,如vec3 forward=normalize(glm::vec3(camera.getViewMatrix()[2])*vec3(1,1,-1);你将如何用这种方法得到“左”字?(x轴)如果你遵循我发布的第一个链接,你可以看到它已经在矩阵中。查看名为convention的部分。此外,还有glm便利函数用于此:side=vec3(行(getViewMatrix(),0))
const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));