Exemple #1
0
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);
	}
}