从旋转和位置获取前向向量

Posted

技术标签:

【中文标题】从旋转和位置获取前向向量【英文标题】:Getting a forward vector from rotation and position 【发布时间】:2018-12-04 08:52:13 【问题描述】:

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

class Renderer;
class Camera

    Renderer& m_renderer;
    glm::mat4 GetViewMatrix();
public:
    glm::vec3 position;
    glm::vec3 rotation;
    float Fov;

    Camera(Renderer& renderer,float Fov, int width , int height);
    void MoveCamera(glm::vec3 direction);
    void RotateCamera(glm::vec3 direction);
    void Update();
;

我想做的是调用“MoveCamera”:

void Camera::MoveCamera(glm::vec3 direction)

    this->position += direction;

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 ;

那么在这种情况下,我应该如何从我的位置和旋转中生成一个前向矢量?

【问题讨论】:

我真的建议不要在这个用例中使用欧拉角。在这种情况下,它们有很多缺点和微不足道的好处。无论如何,前向通常是视图矩阵的第三行(或其负数)。 【参考方案1】:

您可以从相机视图矩阵中提取它。

在世界空间中拥有相机变换矩阵后,您可以invert it to get the view matrix

您正在使用 uses column-major matrices 的 glm,因此您可以抓住倒置矩阵的第二列并将其标准化以获得方向。

const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));

【讨论】:

好的,但你必须翻转 z 轴或翻转 y 和 x ,就像这样 vec3 forward = normalize(glm::vec3(camera.GetViewMatrix()[2])) *vec3(1 , 1 ,-1); 你将如何用这种方法获得“左”? (x 轴) 如果您点击我发布的第一个链接,您可以看到它已经存在于矩阵中。查看称为约定的部分。 此外,还有 glm 便利功能:side = vec3(row(getViewMatrix(), 0))

以上是关于从旋转和位置获取前向向量的主要内容,如果未能解决你的问题,请参考以下文章

如何从旋转向量中获取欧拉角(Sensor.TYPE_ROTATION_VECTOR)

向量旋转公式:

二维向量的旋转

相机 旋转

相机 旋转

相机 旋转