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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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++ 从旋转和位置获取正向矢量_C++_Opengl_Glm Math - Fatal编程技术网

C++ 从旋转和位置获取正向矢量

C++ 从旋转和位置获取正向矢量,c++,opengl,glm-math,C++,Opengl,Glm Math,我有一个camera类,它有旋转和位置,还有一个从位置和旋转生成视图矩阵的方法,蚀刻帧相机将视图矩阵发送到渲染器。(投影矩阵也一样,但变化不大) 我想做的是称之为“移动摄影机”: 使用forwardDirection*deltaTime*speed 从我的主循环。我的问题是根据我的旋转和位置创建一个前进方向向量。 旋转是一个带有度的矢量3,用于创建如下视图矩阵: glm::mat4 Camera::GetViewMatrix() { glm::mat4 matRoll = glm::ma

我有一个camera类,它有旋转和位置,还有一个从位置和旋转生成视图矩阵的方法,蚀刻帧相机将视图矩阵发送到渲染器。(投影矩阵也一样,但变化不大)

我想做的是称之为“移动摄影机”:

使用
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]));