У меня есть 2D-геометрия. Я хочу взять некоторый ограничивающий прямоугольник вокруг моей геометрии, а затем отобразить меньшую версию его где-то еще на плоскости. Здесь более или менее код, который я должен сделать масштабирования и перевода:
// source and dest are arbitrary rectangles.
float scaleX = dest.width / source.width;
float scaleY = dest.height / source.height;
float translateX = dest.x - source.x;
float translateY = dest.y - source.y;
glScalef(scaleX, scaleY, 0.0);
glTranslatef(translateX, translateY, 0.0);
// Draw geometry in question with its normal verts.
Это работает точно так, как ожидалось для данного измерения, когда происхождение dest равно 0. Но если источник, скажем, x, отличен от нуля, результат по-прежнему масштабируется правильно, но выглядит как (?), он переводится в нечто близкое к нулю на этой оси - получается, что это не совсем так, как если бы dest.x были равны нулю.
Может ли кто-нибудь указать что-то очевидное, я не хватает?
Спасибо!
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ В ответах ниже на Bahbar и Marcus я сделал еще несколько экспериментов и решил это. Комментарий Адама Боуэна был подсказкой. Мне не хватало двух критических фактов:
- Мне нужно было масштабироваться вокруг центра геометрии, о которой я заботился.
- Мне нужно было применить преобразования в противоположном порядке интуиции (для меня).
Первый вид очевиден в ретроспективе. Но для последнего, для других хороших программистов/плохих математиков, таких как я: Оказывается, моя интуиция действовала в том, что красная книга
// source and dest are arbitrary rectangles.
float scaleX = dest.width / source.width;
float scaleY = dest.height / source.height;
Point sourceCenter = centerPointOfRect(source);
Point destCenter = centerPointOfRect(dest);
glTranslatef(destCenter.x, destCenter.y, 0.0);
glScalef(scaleX, scaleY, 0.0);
glTranslatef(sourceCenter.x * -1.0, sourceCenter.y * -1.0, 0.0);
// Draw geometry in question with its normal verts.