官术网_书友最值得收藏!

Look at

The view matrix is the inverse of the camera's transformation (the position, rotation, and scale of the camera). Instead of having to create the camera's transform matrix and then invert it, you will be implementing a lookAt function that generates this matrix directly.

A lookAt function typically takes a position, the target point at which the camera is looking and a reference up direction. The rest of the work is finding the inverted basis vectors and figuring out where the position is.

Since the basis vectors are orthonormal, their inverse is the same as their transpose. The position can be calculated by negating the dot product of the position column vector with the inverted basis vectors.

Implement the lookAt function in mat4.cpp. Don't forget to add the function declaration to mat4.h. Remember, the view matrix maps the game world forward to the positive Z axis:

mat4 lookAt(const vec3& position, const vec3& target,

            const vec3& up) {

    vec3 f = normalized(target - position) * -1.0f;

    vec3 r = cross(up, f); // Right handed

    if (r == vec3(0, 0, 0)) {

        return mat4(); // Error

    }

    normalize(r);

    vec3 u = normalized(cross(f, r)); // Right handed

    vec3 t = vec3(

        -dot(r, position),

        -dot(u, position),

        -dot(f, position)

    );

    return mat4(

        // Transpose upper 3x3 matrix to invert it

        r.x, u.x, f.x, 0,

        r.y, u.y, f.y, 0,

        r.z, u.z, f.z, 0,

        t.x, t.y, t.z, 1

    );

}

The lookAt function is the most convenient way of constructing a view matrix. All of the code samples throughout the rest of this book will use the lookAt function to set up a view matrix.

主站蜘蛛池模板: 庄河市| 恩平市| 长阳| 沅江市| 远安县| 寻甸| 阿拉尔市| 灵石县| 鸡西市| 上林县| 宜宾市| 威宁| 高尔夫| 宝鸡市| 蓝山县| 神农架林区| 威远县| 上虞市| 石首市| 岳普湖县| 昔阳县| 长阳| 红安县| 延边| 铁岭市| 蒲江县| 克山县| 肃南| 盐边县| 石城县| 万盛区| 紫金县| 原平市| 木兰县| 阆中市| 江孜县| 宜兰市| 临澧县| 泸州市| 纳雍县| 河曲县|