У меня есть 2D-объект (GL_QUAD) размером (Ш, В) и находящийся в (-Ш * 0,5, -В * 0,5).
Я бы предпочел не изменять размер объекта, потому что мне нужно иметь возможность выбирать точки на этом объекте относительно текстуры. (т.е. (x, y) в openGL преобразуется в (x, y) на текстуре - масштабирование не требуется).
Что я хочу сделать, так это изменить свойства камеры (проекцию, угол и т. д.), чтобы объект, независимо от размера, показывался, заполняя наибольшую ось экрана. (Аспект подходит?)
Я могу сравнить размер экрана с размером объекта без проблем. Я могу без проблем поменять матрицу камеры (просмотр модели и проекция). Но я не знаю, как рассчитать преобразование, которое мне нужно, чтобы просмотреть весь объект.
Я думал о:
- перевести камеру (0,0,-1)
- 4 координаты объекта проекта с помощью gluProject()
- проверьте, существуют ли точки в прямоугольнике экрана.
- если нет, перейдите к 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) );
}
Однако я не чувствую, что это отличное решение...