Я реализовал камеру (вид модели) в своем 2D-приложении opengl, и у меня возникают некоторые проблемы с масштабированием вокруг точки, а также с масштабированием вокруг точки в сочетании с панорамированием. Оба работают с мышью. Панорамирование работает с помощью перетаскивания мышью и масштабирования для наведения масштаба вокруг текущей позиции мыши.
Панорамирование работает хорошо, пока я еще не масштабировал точку. Если я масштабировал вокруг точки, то в панорамировании есть начальный «прыжок», но тогда он работает плавно. Масштабирование вокруг точки работает нормально для первой точки, но для последующих точек сцена переводится один раз, а затем после этого работает масштабирование вокруг текущей точки мыши. Шкала вокруг кода точки выглядит следующим образом:
public void scaleToPoint(float scale, float x, float y, float z) {
root.markAsDirty();
y = drawableHeight - y - 1;
// (S(Inverse(T))
matrix.m03 = -x;
matrix.m13 = -y;
matrix.m23 = -z;
matrix.m00 = matrix.m11 = matrix.m22 = scale;
matrix.m03 *= matrix.m00;
matrix.m13 *= matrix.m11;
matrix.m23 *= matrix.m22;
matrix.m03 += x;
matrix.m13 += y;
matrix.m23 += z;
}
Код панорамирования просто устанавливает компонент перевода матрицы. Кажется, что в обоих случаях мне нужно как-то отменить предыдущий перевод, чтобы избежать скачка, но я не понимаю, как это сделать. Спасибо.
Ник
Добавлено в ответ на комментарий:
Матрица
представляет собой javax.matrix.Matrix4f .
Код панорамирования:
public void pan(Vector3f pan) {
root.markAsDirty();
matrix.setTranslation(pan);
}
где matrix.setTranslation устанавливает компонент перевода матрицы, т.е.:
matrix.m03 = trans.x;
matrix.m13 = trans.y;
matirx.m23 = trans.z;
Матрица загружается с помощью glLoadMatrix () для установки самой верхней матрицы в стеке. Ожидаемый результат - нормальное плавное панорамирование без дополнительного скачка в случае панорамирования и без скачка до масштабирования / масштабирования в случае масштабирования. Под прыжком я подразумеваю, что сцена неожиданно меняется. Так, например, если сцена представляет собой один большой квадрат и мышь находится в центре квадрата, квадрат должен двигаться в направлении перетаскивания мыши, в то время как центр квадрата остается под мышью. При прыжке мышь начнет центр квадрата, но начало панорамирования переместит сцену так, что другая часть квадрата теперь находится под мышью. Скачок в масштабировании работает аналогично. Первый зум смещает сцену так, что местоположение, которое было первоначально под мышью, теперь больше не под мышью.
Обратите внимание, что панорамирование работает нормально, если масштабирование вокруг точки не проводилось. Панорамирование также работает нормально, если масштабирование не находится вокруг определенной точки.