相机/视图矩阵

Posted

技术标签:

【中文标题】相机/视图矩阵【英文标题】:Camera/View matrix 【发布时间】:2014-03-24 20:30:08 【问题描述】:

阅读完这篇文章 (http://3dgep.com/?p=1700) 后,这似乎暗示我的视图矩阵错误。这是我计算视图矩阵的方法;

Mat4 Camera::Orientation() const

    Quaternion rotation;
    rotation = glm::angleAxis(mVerticalAngle, Vec3(1.0f, 0.0f, 0.0f));
    rotation = rotation * glm::angleAxis(mHorizontalAngle, Vec3(0.0f, 1.0f, 0.0f));

    return glm::toMat4(rotation);



Mat4 Camera::GetViewMatrix() const

    return Orientation() * glm::translate(Mat4(1.0f), -mTranslation); 

据说,我要反转这个结果矩阵,但到目前为止我还没有,到目前为止它工作得很好,而且我也没有对管道进行任何反转。我在这里有什么遗漏吗?

【问题讨论】:

【参考方案1】:

您已经进行了反转。视图矩阵是定位相机的模型变换的逆矩阵。这是:

ModelCamera = Translation(position) * Rotation

所以倒数是:

ViewMatrix = (Translation(position) * Rotation)^-1
           = Rotation^-1 * Translation(position)^-1

通过抵消偏移量来反转翻译:

           = Rotation^-1 * Translation(-position)

这让我们不得不反转旋转。我们可以假设旋转是反转的。因此,相机模型的原始旋转为

Rotation^-1 = RotationX(verticalAngle) * RotationY(horizontalAngle)
Rotation    = (RotationX(verticalAngle) * RotationY(horizontalAngle))^-1
            = RotationY(horizontalAngle)^-1 * RotationX(verticalAngle)^-1
            = RotationY(-horizontalAngle) * RotationX(-verticalAngle)

因此,您指定的角度实际上是旋转相机的倒角。如果增加horizontalAngle,相机应该向右转(假设是右手坐标系)。这只是定义问题。

【讨论】:

以上是关于相机/视图矩阵的主要内容,如果未能解决你的问题,请参考以下文章

多视图几何(基础矩阵和照相机矩阵原理)

从视图矩阵中清除比例组件。独立于相机的缩放

GLFW - 用鼠标旋转相机的视图矩阵使其旋转

给定相机参数,我如何找到从视图空间到像素坐标的转换?我的矩阵有啥问题?

相机框架和物体框架

如何从 WinRT Windows.Media API 中获取 Hololens 可定位相机视图和投影矩阵