2013-10-01 1 views
1

Я переписываю свое приложение, используя современный OpenGL (3.3+) в Jogl.Переместить целевое положение камеры вместе с мышью

Я использую все обычные матрицы, то есть objectToWorld, WorldToCamera и CameraToClip (или модель, вид и проекция)

Я создал класс для обработки всех движений мыши, как McKesson делает в своем «Учится современным 3d графическое программирование»с методом, чтобы компенсировать целевой камеры позицию

private void offsetTargetPosition(MouseEvent mouseEvent){ 

     Mat4 currMat = calcMatrix(); 

     Quat orientation = currMat.toQuaternion(); 

     Quat invOrientation = orientation.conjugate();   

     Vec2 current = new Vec2(mouseEvent.getX(), mouseEvent.getY()); 

     Vec2 diff = current.minus(startDragMouseLoc); 

     Vec3 worldOffset = invOrientation.mult(new Vec3(-diff.x*10, diff.y*10, 0.0f)); 

     currView.setTargetPos(currView.getTargetPos().plus(worldOffset)); 

     startDragMouseLoc = current; 
    } 

calcMatrix() возвращает матрицу камеры, остальное должно быть ясно

То, что я хочу, движется мой объект вместе с мышью, справа теперь движение мыши и перевод объекта не соответствуют, то есть они не являются линейными, потому что я имею дело с разными пространствами, я думаю ..

Я узнал, что если я хочу применить преобразование T в пространстве O, но связанное в пространстве с, я должен сделать следующее с р как вершина

C * (C * T * C^-1) * О * р

должен ли я сделать что-то подобное?

ответ

0

я решил с чертовски простой пропорции ...

 float x = (float) (10000 * 2 * EC_Main.viewer.getAspect() * diff.x/EC_Main.viewer.getWidth()); 
     float y = (float) (10000 * 2 * diff.y/EC_Main.viewer.getHeight()); 
     Vec3 worldOffset = invOrientation.mult(new Vec3(-x, y, 0.0f)); 

Принимая во внимание мою матрицу проекции

Mat4 orthographicMatrix = Jglm.orthographic(-10000.0f * (float) EC_Main.viewer.getAspect(), 10000.0f * (float) EC_Main.viewer.getAspect(), 
        -10000.0f, 10000.0f, -10000.0f, 10000.0f);