1

我正在使用 Jogl 中的现代 OpenGL (3.3+) 重写我的应用程序。

我正在使用所有常规矩阵,即objectToWorldWorldToCameraCameraToClip或模型、视图和投影)

我创建了一个类来处理所有鼠标移动,就像 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()返回相机矩阵,其余的应该是清楚的。

我想要的是随着鼠标移动我的对象,现在鼠标移动和对象平移不对应,也就是说它们不是线性的,因为我想我正在处理不同的空间..

我了解到,如果我想在空间 O 中应用变换 T,但在空间 C 中相关,我应该以 p 作为顶点执行以下操作:

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

我应该做类似的事情吗?

4

1 回答 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);
于 2013-10-01T14:45:08.977 回答