2010-09-16 2 views
1

У меня есть 2D-объект (GL_QUAD) с размером (W, H) и сидящий на (-W * 0,5, -H * 0,5).Как изменить проекцию, чтобы показать мой объект?

Я бы предпочел не изменять размер объекта, потому что мне нужно иметь возможность выбирать точки на этом объекте относительно текстуры. (т. е. (x, y) в openGL переводит (x, y) на текстуру - масштабирование не требуется).

Что я хочу сделать, это изменить свойства камеры (проекция, угол и т. Д.), Чтобы объект, независимо от размера, обнаружил заполнение самой большой оси экрана. (Aspect Fit?)

Я могу сравнить размер экрана и размер объекта без проблем. Я не могу изменить матрицу камеры без проблем (модель и проекция). Но я не знаю, как вычислить необходимое мне преобразование, чтобы просмотреть весь объект.

Я думал:

  1. перевести камеру (0,0, -1) 4 COORDS
  2. объекта проекта с gluProject()
  3. теста, если существуют точки в пределах экрана прямоугольника.
  4. если нет, то Гото 1.

Но это кажется ... вычислительно столь интенсивно. У меня есть экранные координаты, а объектные координаты - разве я не могу вычислить телесный угол, который связывает четыре угла каждого объекта и устанавливает его?

Спасибо,


[EDIT]

Вот еще один, не элегантное решение:

void View::getCamera(eq::Matrix4f& camera) 
{ 
    camera = eq::Matrix4f::IDENTITY; 
    camera = camera * _rotation; 
    camera.set_translation(_translation ); 
    float longAxis = 1.0f; 

    // Normalize Scale 
    @try { 
     float tH = (float)getHeight(); // texture coords 
     float tW = (float)getWidth(); 
     float sH = getBaseFrustum().getWall().getHeight(); // screen coords 
     float sW = getBaseFrustum().getWall().getWidth(); 

     float rW = tW/sW; 
     float rH = tH/sH; 

     if (rH > rW) { 

      longAxis *= tH*2.0f; 

     } else { 

      longAxis *= tW*2.0f; 
     } 

    } 
    @catch (...) { 
     //Nothing? 
     NSLog(@"Couldn't get Height or Width"); 
    } 

    // Normalize Scale to Screen/Image Size 
    camera.scale(eq::Vector3f(_scale/longAxis,-_scale/longAxis,1.0f)); 
} 

Я не чувствую, что это отличное решение, однако ...

ответ

0

Похоже, что ваш материал - это все 2D и действительно не нуждается в преимуществах проекции перспективы, в этом случае ортогональная проекция будет намного проще в использовании. Ортогональная проекция делает тривиально легким поместить квадрат, чтобы заполнить экран.

http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml

+0

Я буду отображать все от 2D каре до Марширующих кубы Volume Rendering ... Я бы предпочел, чтобы обобщить, насколько я могу ... –