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

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.

主站蜘蛛池模板: 娱乐| 铅山县| 方山县| 汾阳市| 龙里县| 淳安县| 海淀区| 高要市| 故城县| 临湘市| 图木舒克市| 咸阳市| 乾安县| 广汉市| 虹口区| 治县。| 云阳县| 绥德县| 新竹市| 太仆寺旗| 宜都市| 登封市| 苍山县| 应城市| 洛宁县| 三门县| 黄山市| 保德县| 永和县| 麦盖提县| 定襄县| 元谋县| 潍坊市| 翁牛特旗| 班戈县| 四子王旗| 永川市| 怀安县| 札达县| 上思县| 柳河县|