openGL相机缩放/缩放点和平移

时间:2009-12-22 22:22:46

标签: opengl matrix-math

我已经在我的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 个答案:

答案 0 :(得分:1)

您的问题是,您只需设置翻译,而不是进行增量翻译。这只是在平移时有效,但是,当您缩放时,由于比例而不存储翻译,并且在下一次翻译操作时将其删除。那么我会做什么,而不是设置翻译,我会增加它。因此,当您拖动鼠标时,从2个gluUnProject调用中获取增量,然后将该增量添加到矩阵转换值。这样可以防止它擦除由点动作周围的缩放产生的轻微翻译。

所以:

public void pan(Vector3f delta_pan)
{
    root.markAsDirty();
    matrix.m03 += delta_pan.x; 
    matrix.m13 += delta_pan.y;
    matirx.m23 += delta_pan.z;
}