You are wrong, you can do group selection with gluPuckMatrix(), in the same manner as individual selection, but you have to pass to this funcion the size and position of the selection rectangle. Then you render your objects as usual with perspective, and check the selection buffer.
Here is the code I use for selection in glest:
void Renderer::computeSelected(Selection::UnitContainer &units){
//declarations
GLuint selectBuffer[GuiManager::maxSelBuff];
const Metrics &metrics= Metrics::getInstance();
const GuiManager *guiManager= game->getGuiManager();
//compute center and dimensions of selection rectangle
int x= (guiManager->getPosDown().x+guiManager->getPosUp().x) / 2;
int y= (guiManager->getPosDown().y+guiManager->getPosUp().y) / 2;
int w= abs(guiManager->getPosDown().x-guiManager->getPosUp().x);
int h= abs(guiManager->getPosDown().y-guiManager->getPosUp().y);
if(w<1) w=1;
if(h<1) h=1;
//setup matrices
glSelectBuffer(GuiManager::maxSelBuff, selectBuffer);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
GLint view[]= {0, 0, metrics.getVirtualW(), metrics.getVirtualH()};
glRenderMode(GL_SELECT);
glLoadIdentity();
gluPickMatrix(x, y, w, h, view);
gluPerspective(perspFov, metrics.getAspectRatio(), perspNearPlane, perspFarPlane);
loadGameCameraMatrix();
//render units
renderUnitsFast();
//pop matrices
glMatrixMode(GL_PROJECTION);
glPopMatrix();
//select units
int selCount= glRenderMode(GL_RENDER);
for(int i=1; i<=selCount; ++i){
int factionIndex= selectBuffer[i*5-2];
int unitIndex= selectBuffer[i*5-1];
const World *world= game->getWorld();
if(factionIndex<world->getFactionCount() && unitIndex<world->getFaction(factionIndex)->getUnitCount()){
Unit *unit= world->getFaction(factionIndex)->getUnit(unitIndex);
units.push_back(unit);
}
}
}