OpenGL камера зум / масштаб вокруг точки и панорамирования - PullRequest
4 голосов
/ 23 декабря 2009

Я реализовал камеру (вид модели) в своем 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 () для установки самой верхней матрицы в стеке. Ожидаемый результат - нормальное плавное панорамирование без дополнительного скачка в случае панорамирования и без скачка до масштабирования / масштабирования в случае масштабирования. Под прыжком я подразумеваю, что сцена неожиданно меняется. Так, например, если сцена представляет собой один большой квадрат и мышь находится в центре квадрата, квадрат должен двигаться в направлении перетаскивания мыши, в то время как центр квадрата остается под мышью. При прыжке мышь начнет центр квадрата, но начало панорамирования переместит сцену так, что другая часть квадрата теперь находится под мышью. Скачок в масштабировании работает аналогично. Первый зум смещает сцену так, что местоположение, которое было первоначально под мышью, теперь больше не под мышью.

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

1 Ответ

1 голос
/ 03 января 2010

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

Итак:

public void pan(Vector3f delta_pan)
{
    root.markAsDirty();
    matrix.m03 += delta_pan.x; 
    matrix.m13 += delta_pan.y;
    matirx.m23 += delta_pan.z;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...