观察矩阵的设计---view--摄像机

链接

链接

摄像机的作用

移动位置和调整视角;

public:
    void look(float yaw, float pitch, float roll);
    void move(float x, float y, float z);

注意:移动和调整的是摄像机还是物体?

摄像机

摄像机移动(move)的实现原理:

x,y,z都是输入值,由这三个输入值对摄像机的三个方向向量进行伸缩。

摄像机视角(look)的实现原理

yaw,pitch,roll都是输入值,代表旋转的角度,使用矩阵的rotate函数根据这三个值进行旋转,再用这个矩阵乘以摄像机的指向向量,就可以得到摄像机一个新的的指向向量,也就是前方向量。摄像机的视角也就是摄像机的指向向量的方向的改变。

void Camera::look(float yaw, float pitch, float roll)
{
    m_yaw += yaw;
    while (m_yaw >= 360)
        m_yaw -= 360;
    while (m_yaw < 0)
        m_yaw += 360;
    m_pitch += pitch;
    if (m_pitch > 89)
        m_pitch = 89;
    if (m_pitch < -89)
        m_pitch = -89;
    {
        QVector3D _front{ 0,0,-1 };
        QMatrix4x4 _mat;
        _mat.setToIdentity();
        _mat.rotate(m_pitch, 1, 0, 0);
        _mat.rotate(m_yaw, 0, 1, 0);
        m_front = _front * _mat;
    }
}

新的指向向量应该在原始的向量上进行改变,而不是在上一次的向量上进行改变。

摄像机的四个向量

位置向量:从原点开始的一个向量,向量的终点就是摄像机中心坐标。

前方向量:摄像机指向的方向

上方向量:摄像机朝上的方向

右侧向量:前方和上方向量叉积所得的向量

两个向量的叉积就是垂直于这两向量所成平面的向量。

private:
    QMatrix4x4 m_view;
    QVector3D m_pos{ 0,0,0 };
    QVector3D m_front{ 0,0,-1 };
    QVector3D m_up{ 0,1,0 };
    float m_yaw = 0;
    float m_pitch = 0;
    float m_roll = 0;

摄像机绕三个轴旋转的角度

偏航(yaw)对应左右看,在OpenGL的默认坐标系,代表着视角沿着y轴旋转。
俯仰(pitch)对应上下看,在OpenGL的默认坐标系,代表着视角沿着x轴旋转。
翻滚(roll)对应着歪头看,在OpenGL的默认坐标系,代表着视角沿着z轴旋转。

你可能感兴趣的:(人工智能)