У меня есть 2D-объект (GL_QUAD) с размером (W, H) и сидящий на (-W * 0,5, -H * 0,5).Как изменить проекцию, чтобы показать мой объект?
Я бы предпочел не изменять размер объекта, потому что мне нужно иметь возможность выбирать точки на этом объекте относительно текстуры. (т. е. (x, y) в openGL переводит (x, y) на текстуру - масштабирование не требуется).
Что я хочу сделать, это изменить свойства камеры (проекция, угол и т. Д.), Чтобы объект, независимо от размера, обнаружил заполнение самой большой оси экрана. (Aspect Fit?)
Я могу сравнить размер экрана и размер объекта без проблем. Я не могу изменить матрицу камеры без проблем (модель и проекция). Но я не знаю, как вычислить необходимое мне преобразование, чтобы просмотреть весь объект.
Я думал:
- перевести камеру (0,0, -1) 4 COORDS
- объекта проекта с gluProject()
- теста, если существуют точки в пределах экрана прямоугольника.
- если нет, то Гото 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));
}
Я не чувствую, что это отличное решение, однако ...
Я буду отображать все от 2D каре до Марширующих кубы Volume Rendering ... Я бы предпочел, чтобы обобщить, насколько я могу ... –