Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // i extract planes from projection matrix using this class:
- // mat is column major, mat[i] is ith column of matrix
- class Frustum
- {
- public:
- Frustum(const glm::mat4& mat, bool normalize_planes = true)
- // create frustum from matrix
- // if extracted from projection matrix only, planes will be in eye-space
- // if extracted from view*projection, planes will be in world space
- // if extracted from model*view*projection planes will be in model space
- {
- // create non-normalized clipping planes
- planes[0] = Plane(mat[3]+mat[0]); // left
- planes[1] = Plane(mat[3]-mat[0]); // right
- planes[2] = Plane(mat[3]-mat[1]); // top
- planes[3] = Plane(mat[3]+mat[1]); // bottom
- planes[4] = Plane(mat[3]+mat[2]); // near
- planes[5] = Plane(mat[3]-mat[2]); // far
- // normalize the plane equations, if requested
- if (normalize_planes)
- {
- planes[0].normalize();
- planes[1].normalize();
- planes[2].normalize();
- planes[3].normalize();
- planes[4].normalize();
- planes[5].normalize();
- }
- }
- Plane planes[6]; // plane normals point into frustum
- };
- class Plane
- {
- public:
- Plane(const glm::vec4& abcd)
- : normal(abcd.x, abcd.y, abcd.z), d(abcd.w) {}
- void normalize()
- {
- float mag = glm::length(normal);
- normal /= mag;
- d /= mag;
- }
- glm::vec3 normal;
- float d; // distance from origin
- };
- // this is proj. matrix i use
- glm::perspective(60.0f /*fovy*/, 800.0f/600 /*aspect*/, 0.01f /*near_dist*/, 100.0f/*far_dist*/);
- // this is how this matrix looks when printed out
- 1.2990 0.0000 0.0000 0.0000
- 0.0000 1.7321 0.0000 0.0000
- 0.0000 0.0000 -1.0002 0.0200
- 0.0000 0.0000 -1.0000 0.0000
- // and these are the planes constructed from this matrix when printed out
- left = normal[0.999881 0.000000 -0.015396], d=-0.015396
- right = normal[-0.999881 0.000000 -0.015396], d=-0.015396
- top = normal[0.000000 -0.999933 -0.011547], d=-0.011547
- bottom = normal[0.000000 0.999933 -0.011547], d=-0.011547
- near = normal[0.000000 0.000000 -1.000000], d=-0.980198
- far = normal[0.000000 0.000000 1.000000], d=1.020202
- // i expect "d" to be distance from origin, which is camera space,
- // so it should be 100 for far plane, and 0.01 for near plane, right ?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement