Question

I am rewriting my application using the modern OpenGL (3.3+) in Jogl.

I am using all the conventional matrices, that is objectToWorld, WorldToCamera and CameraToClip (or model, view and projection)

I created a class for handling all the mouse movements as McKesson does in its "Learning modern 3d graphic programming" with a method to offset the camera target position:

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() returns the camera matrix, the rest should be clear.

What I want is moving my object along with the mouse, right now mouse movement and object translation don't correspond, that is they are not linear, because I am dealing with different spaces I guess..

I learnt that if I want to apply a transformation T in space O, but related in space C, I should do the following with p as vertex:

C * (C * T * C^-1) * O * p

Should I do something similar?

Was it helpful?

Solution

I solved with a damn simple proportion...

        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));

Taking into account my projection matrix

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);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top