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

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.

主站蜘蛛池模板: 平陆县| 五大连池市| 高雄市| 英超| 福清市| 曲沃县| 江孜县| 清镇市| 绩溪县| 金秀| 广东省| 华坪县| 隆德县| 永兴县| 邓州市| 昌图县| 云龙县| 无锡市| 新闻| 云林县| 宜都市| 兴隆县| 肇庆市| 自治县| 昌图县| 杭州市| 尉氏县| 同心县| 新源县| 龙井市| 竹溪县| 宝兴县| 鲁甸县| 博乐市| 古蔺县| 江孜县| 防城港市| 革吉县| 江达县| 延川县| 高阳县|