А какая разница 2д или 3д? Мне кажется там и там нужно по frustum.
Код
boolean isVisibleSprite(final Camera camera, GameSprite sprite){
//позиция и размер храниться в векторах.
return camera.frustrum.boundsIsFrustrum(sprite.getPosition(), sprite.getSize());
}
void render(){
for(GameSprite sprite : sprites){
if(isVisibleSprite(ortCamera, sprite) batch.draw(sprite.getTexture(), sprite.pos.x,sprite.pos.y); // как то так.
}
}