void Frustum::calcFrustum(Vec3d p, Vec3d l, Vec3d u) { Vec3d Y = -l; Y.normalize(); Vec3d X = u^Y; X.normalize(); Vec3d Z = Y^X; Z.normalize(); float tang = tanf((static_cast<float>(M_PI)/360.0f)*fov); float nh = zNear * tang; float nw = nh * aspect; float fh = zFar * tang; float fw = fh * aspect; Vec3d nc = p - Y*zNear; Vec3d fc = p - Y*zFar; Vec3d ntl = nc + Z * nh - X * nw; Vec3d ntr = nc + Z * nh + X * nw; Vec3d nbl = nc - Z * nh - X * nw; Vec3d nbr = nc - Z * nh + X * nw; Vec3d ftl = fc + Z * fh - X * fw; Vec3d ftr = fc + Z * fh + X * fw; Vec3d fbl = fc - Z * fh - X * fw; Vec3d fbr = fc - Z * fh + X * fw; corners[NTL] = ntl.toVec3f(); corners[NTR] = ntr.toVec3f(); corners[NBL] = nbl.toVec3f(); corners[NBR] = nbr.toVec3f(); corners[FTL] = ftl.toVec3f(); corners[FTR] = ftr.toVec3f(); corners[FBL] = fbl.toVec3f(); corners[FBR] = fbr.toVec3f(); planes[TOP]->setPoints(corners[NTR], corners[NTL], corners[FTL], SPolygon::CCW); planes[BOTTOM]->setPoints(corners[NBL], corners[NBR], corners[FBR], SPolygon::CCW); planes[LEFT]->setPoints(corners[NTL], corners[NBL], corners[FBL], SPolygon::CCW); planes[RIGHT]->setPoints(corners[NBR], corners[NTR], corners[FBR], SPolygon::CCW); planes[NEARP]->setPoints(corners[NTL], corners[NTR], corners[NBR], SPolygon::CCW); planes[FARP]->setPoints(corners[FTR], corners[FTL], corners[FBL], SPolygon::CCW); //reset bbox bbox.reset(); for(unsigned int i=0; i<CORNERCOUNT; i++) { Vec3f curVert = corners[i]; bbox.expand(curVert); } }