1.用到的知识点
如何判断点在平面哪一边? 以及判断aabb盒子在面的哪一边?
Real Plane::getDistance (const Vector3& rkPoint) const { return normal.dotProduct(rkPoint) + d; } //----------------------------------------------------------------------- Plane::Side Plane::getSide (const Vector3& rkPoint) const { Real fDistance = getDistance(rkPoint); if ( fDistance < 0.0 ) return Plane::NEGATIVE_SIDE; if ( fDistance > 0.0 ) return Plane::POSITIVE_SIDE; return Plane::NO_SIDE; }
Plane::Side Plane::getSide (const Vector3& centre, const Vector3& halfSize) const
{
// Calculate the distance between box centre and the plane
Real dist = getDistance(centre);
// Calculate the maximise allows absolute distance for
// the distance between box centre and plane
Real maxAbsDist = normal.absDotProduct(halfSize);
if (dist < -maxAbsDist)
return Plane::NEGATIVE_SIDE;
if (dist > +maxAbsDist)
return Plane::POSITIVE_SIDE;
return Plane::BOTH_SIDE;
}
2. 如何获取可见节点
1.获取相机所在的叶子节点
BspNode* cameraNode = mLevel->findLeaf(camera->getDerivedPosition());
查找体现出了bsp的特性,根据节点的分割面,定位相机所在的节点
2.找到相机所在的节点后,根据PVS获取从该节点处可看到节点的。
portal技术,由于笔者也不会,不做介绍。
3. 总结
Ogre 的bsp scenemanager 主要是基于quake的bsp。 是基于室内的场景管理, 一个节点相当于一个房间,通过Cluster
可查到在该房间内可以看到的其它房间。 而通过bsp可以快速查找相机所在的房间。
以上纯属笔者自己见解,如有错误,欢迎谈讨 :)