Как изменить проекцию, чтобы она показывала мой объект?

У меня есть 2D-объект (GL_QUAD) размером (Ш, В) и находящийся в (-Ш * 0,5, -В * 0,5).

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

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

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

Я думал о:

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

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

Спасибо,


[РЕДАКТИРОВАТЬ]

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

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) );
}

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


person Stephen Furlani    schedule 16.09.2010    source источник


Ответы (1)


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

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

person jay.lee    schedule 18.09.2010
comment
Я буду отображать все, от 2D-квадроциклов до марширующих кубов и объемного рендеринга ... Я бы предпочел обобщить, насколько это возможно ... - person Stephen Furlani; 20.09.2010